打开 GIt Bash,先创建一个空目录。
git init
在当前目录初始化一个全新的 Git 仓库。
git clone [url]
克隆一个远程仓库。
仓库可以理解成一个目录,该目录下的所有文件都会给 Git 管理。
该目录下生成的 .git 目录是 git 用来跟踪管理仓库的,不要修改。
Git只能记录文本文件的改动,对于视频、图片等二进制文件只能记录文件大小的改变。
git add 文件名
添加指定文件到暂存区。
git add .
添加所有修改文件到暂存区
git commit -m "提交说明信息"
把暂存区的文件提交到仓库。其中 -m 后面的字符串是对于本次提交的说明。
工作区:正在编写代码的地方。
暂存区:临时存放已经修改好的代码。
仓库:保存了所有所有内容的修改记录(版本)。
Git is a version control system.
Git is free software.
把文件添加到暂存区
从暂存区提交到当前分支
git status
查看工作区当前状态
git log
查看提交日志(由近到远),其中 commit 后面的是版本号。
git log --pretty=online
把提交日志压缩为一行
git reflog
查看所有 HEAD 引用的修改历史记录。
git reset --hard 版本号|HEAD^
跳到指定版本
回退到上个版本(HEAD^表示上个版本 HEAD^^表示上上个版本 或者HEAD~100表示往上100个版本)。
回退到指定版本(输入版本号全部或前缀)。
取消回退:假设现在版本线是 A–>B–>C。版本C回退到版本A了,但是发现又想回去到版本C。但是忘记了版本C的版本号,可以通过git reflog查看。
git restore 文件名
撤销工作区的修改
git reset HEAD readme.txt
撤销暂存区的修改。具体应该为当前分支的文件覆盖了暂存区的文件。
当你在工作区删了一个文件,但是这个时候工作区和版本库没有同步
确定是要删除该文件(即删除版本库中相关文件)
删错了(恢复工作区相关文件)
分支:每次提交,git都会把他们串成一条时间线,这条时间线就是分支。
master指针指向该分支的最新提交,HEAD指向当前使用中分支。
git branch 分支名
新建一个分支
git checkout 分支名
切换分支
git merge 目标分支
把当前分支和目标分支合并。
git branch -d 分支名
删除分支,没有合并的分支不能使用该方法删除。
git branch -D 分支名
强行删除分支,可以删除未合并分支。
修改readme.txt内容并提交
切换到master分支查看内容并没有改变
合并分支后,再查看master分支内容变
情景模拟
假设有两个分支一开始指向同一个提交,然后两个分支都对同一个文件进行了不同的修改。且都经过add,commit提交到了仓库。当合并两个仓库时,会出现冲突
解决办法
只能手动把其中的一个分支对文件的修改和另一个分支进行同样的修改后,重新add,commit到仓库,方可解决。
合并之后
当目标分支(通常是主分支)和要合并的分支之间的提交历史是线性的、无分叉的时候,Git 会默认使用 Fast forward 模式,在该情况下,删除分支后,就不会再记录该分支的信息,彷佛没有出现过。
git merge --no-ff -m "提交信息" 分支名
使用该命令可以在合并时不使用Fast Forward模式
git merge --ff-only 分支
强制使用快进模式,如果不能执行,合并失败。
// 下面的dev/test分支是使用快进模式合并的,dev/test2使用的普通模式合并的。
$ git log --graph --pretty=oneline --abbrev-commit
* 4f3170d (HEAD -> master) merge dev/test2
|\
| * 6b15ecf (dev/test2) test2 update readme.txt
|/
* fe9bcf9 (dev/test) readme.txt add 444444
* d0f0351 add a readme.txt
// 当删除两个分支后如下,可以看出快进模式不会记录分支的信息。
$ git log --graph --pretty=oneline --abbrev-commit
* 4f3170d (HEAD -> master) merge dev/test2
|\
| * 6b15ecf test2 update readme.txt
|/
* fe9bcf9 readme.txt add 444444
* d0f0351 add a readme.txt
git stash
保存现场。
git stash list
查看保存列表。
git stash apply 现场标识
恢复现场,但没有从列表中删除。
git stash pop
从列表恢复最近现场同时在列表删除它。
git cherry-pick 版本号
复制特定提交到当前分支。
当正在开发一个功能时,可能要修复一个bug,但是现在的任务没有完成不能提交。
我们可以使用git stash进行保存,然后修复完bug切回当前分支,使用git stash pop恢复现场同时删除该现场的存档。
使用git cherry-pick 版本号把bug提交的复制到当前分支。
git fetch <remote>
拉取远程仓库的最新,但不会合并。
git pull <remote> <branch>
相当于fetch和merge的结合,拉取最新并合并。
remote:远程仓库,一般为origin;branch:远程分支。
git branch --set-upstream-to <branch-name> origin/<branch-name>
本地分支和远程分支建立链接关系。[可选]
当队友在dev的分支上提交了他已完成的功能,可以使用git pull拉取下来合并,当然这中间可能遇到冲突,需要自己手动解决。
git rebase
会整理当前分支的提交为一条直线。最终的结果是一致的,但是之前commit的提示信息会变。
git tag <tag-name> <commit-id>
给某次提交打上标签,未指明提交时默认为当前分支最新提交。
git tag
查看已有标签
git tag <tag-name>
查看标签详情
git tag -d <tag-name>
删除标签