合并分支和解决冲突


你的功能分支已完成。开关按钮可以工作,你已提交了更改,现在你想让这些工作进入 main 分支,那是团队其他代码所在的地方。大多数时候,将其合并进来很快且顺利:Git 比较两个分支,发现没有重叠的部分,然后顺利地合并工作,无需额外步骤。但有时,你和队友在不同的分支上改动了完全相同的几行代码,Git 无法猜测你想保留哪个版本。这种情况在几乎每个有多人提交代码的项目中都会出现。这是分支工作中正常、日常的一部分,它意味着 Git 发现了同一行代码的两个想法,需要你决定哪一个获胜。
使用 git merge 合并分支
假设你在自己的分支 add-fahrenheit-toggle 上构建了华氏度开关,而 main 自你分支出来后就没有改动过。切换到 main 并运行 git merge,后面跟上你想合并的分支名称:
$ git switch main
$ git merge add-fahrenheit-toggle
Updating 4f2a891..8c3d1a0
Fast-forward
src/index.js | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)git merge <branch> 总是将指定的分支合并到你当前所在的分支中,所以首先切换到 main 很重要。你所在的分支就是接收合并的那个分支。运行完毕后,main 拥有 add-fahrenheit-toggle 的每一个提交。该功能分支本身保持不变:你可以继续在上面工作,或者现在删除它,因为它的工作已经在 main 上了。
git merge branch-name 将该分支的提交合并到你当前所在的分支,所以先切换到 main。大多数合并在后台悄悄进行,你继续你的工作。功能分支本身不会改变;一旦 main 有了这项工作,你可以继续使用它或删除它。 合并冲突看起来什么样
当同一行代码在合并的两侧都改动了,而 Git 无法判断你想要哪个版本时,就会发生冲突。假设队友合并了一个加载微调器到 main,改动了 src/index.js 中的一个函数,而你的 add-fahrenheit-toggle 分支改动了同一个函数来添加开关。现在合并会在中途停下来,而不是完成:
$ git switch main
$ git merge add-fahrenheit-toggle
Auto-merging src/index.js
CONFLICT (content): Merge conflict in src/index.js
Automatic merge failed; fix conflicts and then commit the result.这就是 合并冲突。打开文件,你会发现 Git 标记了两个版本不同的确切位置:
<<<<<<< HEAD
showLoadingSpinner(true);
=======
const tempF = celsiusToFahrenheit(tempC);
>>>>>>> add-fahrenheit-toggle<<<<<<< HEAD 标记了你当前分支(本例中是 main)上的内容的开始。======= 分隔两个版本。>>>>>>> add-fahrenheit-toggle 标记了传入分支版本的结束。标记之间的所有内容是同一几行代码,用两种不同的方式编写。
冲突意味着 Git 需要你的判断;没有什么是坏的。Git 发现了对同一行的两个改动,无法猜测你想要哪一个,所以它暂停并要求你决定。编辑文件直到它按你想要的方式读取,保留任一版本、两者,或结合它们的新内容,然后删除标记行本身:
showLoadingSpinner(true);
const tempF = celsiusToFahrenheit(tempC);文件看起来正确后,暂存并提交它,就像任何其他改动一样:
$ git add src/index.js
$ git commit这里不带消息运行 git commit 会打开你的编辑器,Git 已经准备好了描述合并的消息。保存并关闭它,合并就完成了。
<<<<<<<、======= 和 >>>>>>>,编辑直到它按你想要的方式读取,然后删除这些标记行。用 git add 和 git commit 完成。我的第一个冲突感觉像一场紧急情况;结果是 Git 问我一个相当普通的问题。 重新联系起来
合并使分支值得做:你在自己的历史线上安全地进行实验,在分支中覆盖,然后一旦准备好就将该工作折叠回 main,冲突和所有。在 GitHub 上,同样的操作通常通过拉取请求而不是你机器上的本地 git merge 进行;拉取请求流章节覆盖了在共享项目上提议、审查和合并一个改动。如果合并在你已经提交后落地在你没有意图的地方,撤销事情覆盖了如何安全地退出。

