Git 分支
创建分支
|
|
HEAD
指针,指向当前所在的分支(当前分支的别名)。
切换分支
|
|
此时, HEAD
指向 test
分支。 HEAD
分支随着提交操作自动向前移动。
切换分支的操作会改变你工作目录中的文件
创建并切换分支
|
|
删除分支
|
|
分支合并
首先需要切换到你想要合并入的分支,然后执行 git merge
命令
|
|
处理合并冲突,文件内容类似于这种
1234567<<<<<<< HEAD:index.html<div id="footer">contact : email.support@github.com</div>=======<div id="footer">please contact us at support@github.com</div>>>>>>>> iss53:index.html
此时, =======
是分割线,上面的是 HEAD
的内容, 下面的是 bugfix
的内容。要解决冲突,必须选择其中的一个,并且将上面的那个符号去掉, 执行 git add
命令来标记已解决。
分支管理
查看所有分支
1git branch查看每个分支的最后一次提交
1git branch -v查看所有远程分支
1git branch -a查看已合并到当前分支
1git branch --merged查看未合并到当前分支
1git branch --no-merged如果对未合并的分支执行
git branch -d
命令,会提示失败。如果真要删除分支,应该执行git branch -D
命令。远程分支
推送
共享分支,推送本地分支到远程,执行
git push (remote) (branch)
命令。1git push origin fix748本质上执行过程是 Git 将
fix748
分支名字展开为refs/heads/fix748:refs/heads/fix748
, 意味着“推送本地的 fix748 分支来更新远程仓库上的 fix748 分支”。 该命令可以达到同样的效果,如下:1git push origin fix748 : fix748如果要更改远程仓库的名字,执行如下命令:
1git push origin fix748 : ifeng748拉取数据
git fetch origin
会拉取远程分支,但本地并不会生成一个可编辑的副本,git merge origin/fix748
命令会将该分支合并到当前分支。跟踪分支
从一个远程跟踪分支检出一个本地分支会自动创建一个叫做 “跟踪分支”(有时候也叫做 “上游分支”)。 跟踪分支是与远程分支有直接关系的本地分支。
如果要以远程分支为节点开展工作,执行
1git checkout -b fix748 origin/fix748会在本地生成一个用于工作的分支。
- 修改本地分支的上游分支,执行如下命令:
1git branch -u origin/fix748查看所有跟踪分支
12git branch -vvgit branch -v
拉取
|
|
git pull
命令相当于 git fetch origin
和 git merge
命令的结合。
删除远程分支
|
|
这个命令只是从服务器上移除指针。
变基
rebase
:将提交到某一个分支的所有修改都移动到另一个分支上。
合并
下面列出了两个分支合并的示意图,能够很清楚的看到不同的节点。
1git merge master
变基
|
|
|
|
两者执行的结果都是一样的,只是变基 rebase
操作使提交历史更加的简洁。
- 变基是将一系列提交按照原有次序依次应用到另一个分支上。
- 合并是把最终结果结合到一起。
变基的扩展
现有三个分支,节点示意图如下:
现在想把 client
分支的修改合并到 master
分支,命令如下:
|
|
选中在 client
分支里但不在 server
分支里的修改(即 C8
和 C9
),将它们在 master
分支上重放,合并到 master
分支,
|
|
接着将 server
分支的修改合并到 master
分支上来,如下:
|
|
变基有风险
谨记一条准则:
不要对在你的仓库外有副本的分支执行变基
说白了就是不要对远程仓库执行变基操作,在本地随便弄。
只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别人的提交执行变基操作。