merge 合并 commits

pull 的本质就是把远端仓库新的 commits 使用 fetch 拉取到本地,然后使用 merge 把远端仓库新的 commits 合并到本地仓库

merge 本质

merge 的意思是合并,其作用是从 commit 和当前 commit(即 HEAD 所指向的 commit)分叉的位置起,把目标 commit 的路径上的所有 commit 的内容一并应用到当前 commit,然后自动生成一个新的 commit。

Git 的 merge(4)

HEAD 指向 master ,代表当前的分支为 master 分支,如果此时执行 git merge branch1, Git 会把 5 和 6 这两个 commit 的内容一并应用到 4 上。然后生成一个新的提交, merge 操作会自动地帮你简要地填写提交信息。

merge 会遇到的三种情况:

  • 冲突,两个branch 对一个文件同一行进行了修改
  • HEAD 领先于目标 commit
  • HEAD 落后于目标 commit

merge 时发生冲突

发生冲突的时候需要做两件事情:

  • 解决掉冲突
  • 手动 commit 一下

解决冲突的方法:

  • 在 merge 因为冲突而失败之后,再次打开冲突的文件,会发现其中冲突的内容被 Git 用 >>>>>,======= ,<<<<<包了起来,这时候需要删除一个对那一行的更改,留下一行。同时,还要删除 Git 新加的 >>>>>>, =====, <<<<<< 等符号
  • 解决完冲突之后,再用 git addgit 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。

相关文章: