merge 合并 commits
pull 的本质就是把远端仓库新的 commits 使用 fetch 拉取到本地,然后使用 merge 把远端仓库新的 commits 合并到本地仓库
merge 本质
merge 的意思是合并,其作用是从 commit 和当前 commit(即 HEAD 所指向的 commit)分叉的位置起,把目标 commit 的路径上的所有 commit 的内容一并应用到当前 commit,然后自动生成一个新的 commit。
HEAD 指向 master ,代表当前的分支为 master 分支,如果此时执行 git merge branch1, Git 会把 5 和 6 这两个 commit 的内容一并应用到 4 上。然后生成一个新的提交, merge 操作会自动地帮你简要地填写提交信息。
merge 会遇到的三种情况:
- 冲突,两个branch 对一个文件同一行进行了修改
- HEAD 领先于目标 commit
- HEAD 落后于目标 commit
merge 时发生冲突
发生冲突的时候需要做两件事情:
- 解决掉冲突
- 手动 commit 一下
解决冲突的方法:
- 在 merge 因为冲突而失败之后,再次打开冲突的文件,会发现其中冲突的内容被 Git 用 >>>>>,======= ,<<<<<包了起来,这时候需要删除一个对那一行的更改,留下一行。同时,还要删除 Git 新加的 >>>>>>, =====, <<<<<< 等符号
- 解决完冲突之后,再用
git add和git commit把冲突文件 add 和 commit 一下。
放弃解决冲突,取消 merge:
- merge 会把没有冲突的文件合并了,留下了冲突待处理。
- 如果此时不想解决冲突,取消 merge ,就需要使用
git merge --abort来放弃 merge, 把之前 merge 的内容还原
HEAD 领先于 commit
如果 merge 时目标 commit 和 HEAD 处的 commit 并不存在分叉,而是 HEAD 领先于目标 commit。就说明:分支没有进行任何修改,此时 merge 只是一个空操作。
HEAD 落后于 commit – fast-forward
如果 HEAD 和目标不存在分叉,而且 目标 commit 领先于 HEAD,那么 Git 会直接把 HEAD(以及它所指向的 branch)移动到目标 commit。
mit 领先于 HEAD,那么 Git 会直接把 HEAD(以及它所指向的 branch)移动到目标 commit。