⭐分支的新建与合并
先引入一个实际开发的工作流:
- 开发某个网站。
- 为实现某个新的需求,创建一个分支。
- 在这个分支上开展工作。
正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。你将按照如下方式来处理:
- 切换到你的线上分支(production branch)。
- 为这个紧急任务新建一个分支,并在其中修复它。
- 在测试通过之后,切换到线上分支,然后合并这个修补分支,最后改动推送到线上分支。
- 切换回你最初工作的分支,继续工作。
1. 新建分支
- 首先,模拟你正在你的项目上工作,并且在
master
分支上已经有了一些提交:
-
- 提交历史图:
- 现在,你将解决项目中 #53 问题,需要创建一个分支并切换到该分支:
git checkout -b iss53
——(创建分支:git branch iss53
和 切换分支:git checkout iss53
的简写):
-
- 创建并切换后:
- 在新创建的分支上工作并做提交后:
git commit -a -m 'added a new footer [issue 53]'
-
- 提交
iss53
后:
- 提交
- 需要紧急修复 BUG(hotfix)时:
-
- 检查工作目录和暂存区是否还存在未提交的修改:
git status
- 切换回
master
分支:git checkout master
- 建立
hotfix
分支:git checkout -b hotfix
- 修复 Bug 后提交:
git commit -a -m 'fixed the Bug'
- 提交后:
- 检查工作目录和暂存区是否还存在未提交的修改:
- 将修改后的
hotfix
分支合并到master
分支:
-
git checkout master
:切换回master
分支。git merge hotfix
:合并hotfix
分支。- 这时会出现
Fast-forward
: 在合并时,如果一个分支是另一个分支的直接后继,Git 会将指针直接向前推进,无需解决冲突,这种合并叫做“快进(fast-forward)”。 - 合并后,
master
被快进到hotfix
- 删除
hotfix
:git branch -d hotfix
。 - 切换回工作分支—
iss53
分支:git checkout iss53
。 - 完成
iss53
工作后提交:git commit -a -m 'finished the new footer [issue53]'
。
-
-
- 提交
issue53
后的历史记录图:
- 提交
-
2. 合并分支
模拟你已经完成了 iss53
的全部工作,并打算将其合并到 master
分支。
- 切换到
master
分支并合并iss53
:
-
- 合并前:
git checkout master
git merge iss53
- 合并后:
- 三方合并:当两个分支的提交历史分叉时,Git 需要做三方合并,使用两个分支的末端快照和公共祖先来合并。与快进合并不同,Git 会创建一个新的合并提交,它有多个父提交。
- 删除
iss53
分支:git branch -d iss53
。
3. 遇到冲突时的合并分支
模拟合并时并不顺利,出现了冲突:对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
- 查看冲突:使用
git status
命令查看冲突的原因:
$ git status
On branch master
You have unmerged paths.(fix conflicts and run "git commit")Unmerged paths:(use "git add <file>..." to mark resolution)both modified: index.htmlno changes added to commit (use "git add" and/or "git commit -a")
- 解决冲突:
-
- 打开有冲突的文件,Git 会在冲突部分插入特殊标记:
<<<<<<< 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
-
- 你需要选择保留一个版本的内容,或合并两者的内容。解决后,删除冲突标记(
<<<<<<<
,=======
,>>>>>>>
)。
- 你需要选择保留一个版本的内容,或合并两者的内容。解决后,删除冲突标记(
- 标记冲突已解决:
-
git add
将解决后的冲突标记为已解决:git add index.hmtl
。
- 完成合并并提交:
-
git commit
完成合并并提交。- Git 会自动生成一个合并提交信息,例如:
Merge branch 'iss53'
Conflicts:index.html
- 使用图形化工具(可选):
-
- 如果需要,可以运行 git mergetool 启动图形化工具来帮助解决冲突:
git mergetool
。
- 如果需要,可以运行 git mergetool 启动图形化工具来帮助解决冲突: