首页 > 解决方案 > 使用 Git 修正合并冲突

问题描述

我的故事是我从 branch 开始feature/bar,进行了更改并提交。

然后我从这个分支结帐到feature/foo,进行了一些更改,然后提交。

然后我返回feature/bar,进行更多更改并提交。

现在,当我结帐feature/foo和合并时feature/bar,我有冲突。

但我不想在feature/foo. 我想使用git amend,所以我的更改日志将保持干净。

我该怎么做?

标签: git

解决方案


我的故事是我从分支功能/栏开始,进行更改并提交。然后我从这个分支结帐到 feature/foo,做了一些更改,然后提交。然后我返回功能/栏,进行更多更改并提交。

Git 历史是一个图表,所以让我们把它画出来。您的存储库如下所示。

A - B - E - F [feature/bar]
     \
      C - D [feature/foo]

foo并且bar具有分歧的含义,自子分支以来,父分支中有提交。这很正常。

现在,当我结帐到 feature/foo 并合并 feature/bar 时,我遇到了冲突。但我不想在 feature/foo 中创建另一个提交消息。

不要使用合并更新分支,而是使用 rebase 更新它。这通过假装您的分支一直写在当前分支之上来简化过程foo

git merge feature/bar给你这个。如果你这样做的次数足够多,历史就会变得一团糟。

A - B - E - F [feature/bar]
     \       \
      C - D - E [feature/foo]

git rebase feature/bar给你这个...

A - B - E - F [feature/bar]
             \
              C1 - D1 [feature/foo]

Gitfeature/foofeature/bar. 所以它看起来像是feature/foo在最新开发的feature/bar。没有不必要的合并提交。

任何冲突都在它们发生的提交上处理。因此,如果您对C冲突进行了更改,Git 将停止,允许您重写提交,然后继续。

请注意,这些是具有新提交 ID 的新提交。如果您以前推送feature/foo过,则必须使用git push --force.


当您完成分支并准备好合并回来时,请使用git merge --no-ff feature/foo以确保存在合并提交。

A - B - E - F -------- G [feature/bar]
             \       /
              C1 - D1 [feature/foo]

您希望此合并提交记录哪些提交被分组为单个功能。您可以使用提交消息来记录有关分支的信息,例如指向问题跟踪器的链接。当您git branch -d feature/foo分支时,该功能气泡仍然存在以帮助未来的代码考古学家。

A - B - E - F -------- G [feature/bar]
             \       /
              C1 - D1

而且因为你用 rebase 更新了你的分支,尽管历史中的分支,你真正的 git 历史和线性历史是相同的。git log将以预期的线性顺序 G、D1、C1、F、E、B、A 输出变化,使历史易于跟踪。


推荐阅读