上一篇介绍了分支的用法,温故而知新,一起温习一下
创建并切换新分支:git checkout -b <new_branch>
切换分支使用 git checkout <branch>
查看分支 git branch 或 git branch -a
合并分支 git merge <branch>
删除分支 git branch -d <branch>
前面我们合并了 hotfix 分支到主分支 master 分支里,本篇我们继续处理 feat_6 分支
假设现在 feat_6 分支处理完了,要合并到 master 分支
合并分支 - 解决冲突
在这种情况下,feat_6 的开发历史从一个更早的地方开始分叉开来。master 分支所在提交 (C4) 不是 feat_6 分支所在提交(C5)的直接祖先,Git 不得不做一些额外的工作。 出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的工作祖先(C2),做一个简单的三方合并。
在合并的过程中,可能会像上篇 hotfix 一样快速跟进 fast-forward,合并即可;也可能如当前情况 Git 会将三方合并的结果做一个新的快照并且自动创建一个新的提交指向它,这个被称作一次合并提交(C6),如下图
合并往往不如人意,如果在合并分支时,这两个分支都对同一个文件的同一个部分进行了不同的修改,Git 就没法合并他们。
假设 master 和 feat_6 分支都修改了 test.txt 文件,
在 分支master 追加一行 “master: modify”
在 分支feat_6 追加一行 “feat_6: modify ”
那么当合并 feat_6 时, 就会产生冲突
git merge feat_6
合并 feat_6 分支的内容
此时 Git 做了合并,但是没有自动创建一个新的合并提交,Git 会等待你去解决合并产生的冲突(处于 MERGING 状态),通过git status
查看因合冲突而处于未合并(unmerged)状态的文件。
上图中,feat6.txt 是新建文件,没有冲突,无需处理;而 test.txt 文件合并产生了冲突,需要处理
打开 test 文件
上图表示: HEAD 所指示的版本(master 分支所在位置)在 ===== 的上半部分,而 feat_6 分支所指示的版本在 ===== 的下半部分。此时需要手动合并这些内容,比如,保留两个分支的其中一个分支的内容,或者这两个改动都留着,把 <<<<<<< , ======= , 和 >>>>>>> 这些行删除即可
解决冲突之后,对文件使用 git add
命令标记为冲突已解决
解决冲突也相当于修改,因此若要修改生效,同样需要 add - > commit 来完成合并提交
中断合并
在合并过程中,如果想终止合并,可以使用 git merge --abort
命令来简单地退出当前正在执行的合并操作。
需要注意的是,这个命令仅在合并后导致冲突时使用,也就是 MERGING 状态下。
git merge --abort
选项会尝试恢复到你运行合并前的状态。 但当运行命令前,在工作目录中有未储藏、未提交的修改时,在某些情况下将无法重现合并前的状态。(特别是这些文件在合并的过程中将会被修改时)
如果当前已经处于一个混乱的状态中,想重新操作,也可以运行 git reset --hard HEAD
回到之前的状态或者其他你想恢复的状态(将会清除工作目录中 working dir 所有的内容,谨慎使用)
reset 的相关使用,可参考Git 入门系列(二)
远程分支
细心的朋友应该注意到了,当前的分支都是在本地创建的,如果要推送到远程上呢?
我们回到 feat_6 分支,像向远程提交 commit 一样,使用 git push
会提示使用
git push --set-upstream origin feat_6
提交到远端
此时远端也存在了这个分支,使用
git branch -a
看一下,远程分支多了一个 feat_6
GitHub 上也可以看到远程分支
删除远程分支
前面我们说过删除分支是 git branch -d <branch>
删除远程分支使用 git push origin --delete <branch>
本篇我们补充说明了分支相关的操作
-
合并分支:如果有合并产生冲突,解决冲突再提交即可,大多时候合并会有三种情况
- Git 快速合并(没有冲突,不用处理,Git 直接合并)
- Git 自动创建合并提交(没有冲突,不用处理,Git 自动合并,并产生一次提交)
- 产生冲突,处理合并冲突并提交,若要中断合并,可使用命令
git merge --abort
-
远程分支
- 提交远程分支
git push --set-upstream origin <branch>
- 删除远程分支
git push origin --delete <branch>
- 提交远程分支
那么关于分支先说到这里,后面会介绍上篇提到的问题,怎样不提交当前分支内容还可以切换分支的问题,系列五 - stash 来解决这个问题。
系列文章传送门
Git 入门系列(一)- Git 概念/安装/基本操作/远程推送更新
Git 入门系列(二)- 修改管理 / 撤销操作 / 命令及区间关系
Git 入门系列(三)- 分支(上)创建与切换 / 合并 / 查看 / 删除
Git 入门系列(四)- 分支(下)合并解决冲突 / 远程分支
Git 入门系列(五)- stash 贮藏
Git 入门系列(六)- 标签 tag
Git 入门系列(七)- 可视化 Git 管理工具
Git 入门系列(八) - FAQ
欢迎关注个人公众号,【程序媛春哥的手记】