使用Git的rerere功能逃离反复出现的冲突地狱
你是否曾尝试合并两个分支,结果却陷入冲突地狱?你解决了一堆冲突,然后运行git merge --continue,却又面临相同的冲突。重复这个过程几次后,你放弃了,因为这根本不值得付出如此的痛苦和努力。你会惊讶地发现,Git有一个专门解决这个问题的功能吗?它叫做rerere,我现在就要让你了解这个功能。(我将特别讨论合并,但我认为它在变基时也有帮助)rerere代表重用已记录的解决方案。简而言之,你可以让Git记住你过去是如何解决冲突的,如果将来某个文件再次出现相同的冲突,只需重复上一次的操作即可。要启用此功能,只需运行这个命令:git config --global rerere.enabled true。你也可以通过在项目的.git/rr-cache中创建这个目录来打开它,但全局设置更加清晰。我会给你演示一下这个功能是如何运作的,请耐心听我讲,可能会有点长。我们有一个只有一个文件的(小)项目,结构如下: └── user.rb 0 个目录,1 个文件。我从master分支创建一个名为dev的分支,并在user.rb中添加一行代码。现在我想暂存这个更改,所以我拉取了staging并尝试合并我的dev分支,但哦哦,有人对staging进行了合并,影响了我正在编辑的user.rb中的同一行。 /tmp/example [staging] » git merge dev 自动合并user.rb 冲突(内容):user.rb中的合并冲突 自动合并失败;修复冲突后再提交结果。我们都见过这样的情况,这是一个普通的冲突消息。然而,如果你启用了rerere,你将看到这样的输出: /tmp/example [staging] » git merge dev 自动合并user.rb 冲突(内容):user.rb中的合并冲突 为'user.rb'记录的前图像 自动合并失败;修复冲突后再提交结果。你现在可以看到一行新信息:为'user.rb'记录的前图像。现在运行git rerere diff将给你当前的解决方案文件状态: /tmp/example [c013552] » git rerere diff --- a/user.rb +++ b/user.rb @@ -1,5 +1,5 @@ -<<<<<<< -hello -======= +<<<<<<< HEAD hi ->>>>>>> +======= +hello +>>>>>>> commit from dev 你按照通常的冲突工作流程,选择要保留的更改,并提交结果。如果你再次运行git rerere diff,你将看到已记录的解决方案: /tmp/example [c013552] » git rerere diff --- a/user.rb +++ b/user.rb @@ -1,5 +1 @@ -<<<<<<< hello -======= -hi ->>>>>>> 运行git merge --continue将应用你的提交,并告知你关于我们文件的新解决方案: /tmp/example [c013552] » git merge --continue 为'user.rb'记录的解决方案。``` 让我们用`git reset --hard HEAD^`撤销那个合并,并再次合并: ```/tmp/example [staging] » git merge dev 自动合并user.rb 冲突(内容):user.rb中的合并冲突 使用之前的解决方案解决了'user.rb'。自动合并失败;修复冲突后再提交结果。 /tmp/example [staging] » git add . /tmp/example [staging] » git merge --continue [staging f4a7d36] 将分支'dev'合并到staging中的输出中,重要的一行是使用之前的解决方案解决了'user.rb'。我甚至不需要查看文件,只需提交结果。之所以能这样工作,是因为Git识别到冲突,查看rr-cache文件夹并从之前的合并中识别出这个文件的这一部分,并应用上次的决策!和往常一样,我希望你觉得这个功能有用。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡