Git 冲突的解决是多人协作开发的必备基本功,写此篇记录一下:

1. 场景模拟

例如我们现在拉取了远程仓库中的项目,其中 ReadMe.md 这个文件中的 number 的值为 123。所以我本地 IDEA 中的 number 也是 123。
image.png
但是就在我开发的途中,另一位开发的同学也拉取了远程 number = 123 的版本,然后做了修改并且提交到远程,将 number 修改为了 456。
image.png

但是我并不知道这一切的发生,这时我将本地 IDEA 中的 number 修改为 789。
image.png
我拉取的远程版本:number = 123
现在的远程版本:number = 456
我想提交的远程版本:number = 789
我想从 123 -> 789,但是远程现在已经没有 123 了,只有 456
很显然,如果现在去提交代码一定会有问题,我们下面看一下解决方案:

2. 解决方式

2.1 Commit -> Pull -> Merge -> Push

首先记录一下我比较常用的方法,可能因为会简单一些。

  1. 首先我们先 commit 自己的代码,然后就去 pull 远程的代码。
    • 不要自己在 terminal 中直接 git pull ,否则会直接执行默认的操作,会不走 IDEA 解决冲突的 UI 界面,而是在所有冲突处添加 HEAD 等冲突标识。

image.png

  1. 用 IDEA 的 UI 界面,项目结构树,右击项目 - Git -Pull ,这个时候就会弹出窗口提醒你存在冲突(命令 git pull 是没有这个界面的)。
    • Accept Yours:就是以本地的代码,覆盖远程仓库代码
    • Accept Theirs:就是以远程仓库的,覆盖掉本地代码
    • 但是我们一般选择 Merge 手动处理问题,其实也不用点,直接依次去点击列表中涉及到冲突的文件即可,例如下图中我们就点击 README.md 这个文件。

image.png

  1. 在解决冲突的 UI 界面解决每个文件的冲突,左边的就是你本地的代码,右边的就是远程仓库中的代码,中间的就是最终的结果,所以你可以直接在中间的代码框中修改为自己想要的。
    • 注意:一般来说自己复制修改很容易出错,很多时候会利用到下图中红色框住的箭头,点击这个箭头就会把这一侧的冲突代码合并到中间的结果代码框中。

image.png

  1. 点击 apply 后 会询问你是否结束了,如果结束了点击右侧,如果还有继续修改则点击左侧。

image.png

  1. 此时就可以直接 push 代码了,可以看到之前我们做的修改 update 提交,和后来的 merge 就都会被提交上去了。

image.png

2.2 Pull -> Commit -> Merge -> Push

回到刚开始的情况:线上 number 为 123,两个人分别拉取了这个代码,另一个开发同学修改为 456 然后提交,之后我本地修改为 789,想要提交,出现冲突。
有的同学习惯在 commit 代码前先 pull 一下现在远程仓库最新的代码,这个时候如果有冲突,肯定会直接在右下角弹出 Git Pull Failed。解决办法就是用暂存。
image.png

  1. 首先我们可以右击项目,点击 Git -> Stash Changes

image.png

  1. 然后取一个名字,创建。
    • 这一步其实就在将本地做的改变暂存,这一步执行后会把本地的修改都暂存消失掉,这时,你本地的 number 也回到了 123。所以此时是没有冲突的,你就可以正常的拉取新的代码。

image.png

  1. pull 远程代码,如下可以看到:文件正常被 pull 下来了。

    1. 更新 fc0f17e..9b1bc82
    2. Fast-forward
    3. README.md | 2 +-
    4. 1 file changed, 1 insertion(+), 1 deletion(-)
  2. 恢复暂存,通过一样的方式,点击 Git -> Unstash Changes,选中你那个暂存的文件,我们刚才的命名是 temp ,则选中它,点击 apply

image.png
此时你就会发现,熟悉的冲突 UI 界面又出来了,则根据 2.1 的方法解决冲突就好了。
image.png

3. 总结

所以看下来,还是先 Commit 再解决冲突会更好一些。能少做一步暂存的操作。毕竟一次 Commit 已经算暂时存储起来了。