美文网首页Git 入门系列
Git 入门系列(四)- 分支(下)合并解决冲突 / 远程分支

Git 入门系列(四)- 分支(下)合并解决冲突 / 远程分支

作者: tingtingtina | 来源:发表于2019-10-10 14:34 被阅读0次

上一篇介绍了分支的用法,温故而知新,一起温习一下
创建并切换新分支: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

欢迎关注个人公众号,【程序媛春哥的手记】

相关文章

  • git查看分支、合并分支

    1查看分支 1.1查看远程分支: 1.2查看本地分支: 2 合并分支、解决冲突 2.1如何分支的合并 在git中,...

  • Git 入门系列(四)- 分支(下)合并解决冲突 / 远程分支

    上一篇介绍了分支的用法,温故而知新,一起温习一下创建并切换新分支:git checkout -b

  • git强制合并分支

    git A分支合并B分支,并强制使用B分支代码(不手动解决冲突) git A分支合并B分支,并强制使用A分支代...

  • Git分支合并及冲突解决

    分支合并 $ git checkout 分支名A $ git merge 分支名B 产生合并冲突 查看冲突情况 $...

  • pull

    git pull <远程主机名> <远程分支名>:<本地分支名> : 将远程分支与本地分支合并。git pull ...

  • Git管理代码:分支使用(五)

    本文内容要点: 分支是什么? 创建分支 推送分支到远程仓库 合并分支 分支冲突解决 查看版本分支图 删除分支 多人...

  • Git管理代码:分支使用(五)

    本文内容要点: 分支是什么? 创建分支 推送分支到远程仓库 合并分支 分支冲突解决 查看版本分支图 删除分支 多人...

  • git 学习笔记4

    创建与合并分支 master 主分支HEAD 当前分支 分支冲突 git merge后发现分支冲突;git sta...

  • (4.2) git分支管理-解决冲突

    小结 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。 解决冲突就是把Git合并失败...

  • Git分支

    分支简介 分支创建 分支切换 分支新建与合并 新建分支 分支的合并 分支删除 遇到冲突时的分支合并 解决冲突之后,...

网友评论

    本文标题:Git 入门系列(四)- 分支(下)合并解决冲突 / 远程分支

    本文链接:https://www.haomeiwen.com/subject/fmtbuctx.html