git - 使用 Git 修正合并冲突
问题描述
我的故事是我从 branch 开始feature/bar
,进行了更改并提交。
然后我从这个分支结帐到feature/foo
,进行了一些更改,然后提交。
然后我返回feature/bar
,进行更多更改并提交。
现在,当我结帐feature/foo
和合并时feature/bar
,我有冲突。
但我不想在feature/foo
. 我想使用git amend
,所以我的更改日志将保持干净。
我该怎么做?
解决方案
我的故事是我从分支功能/栏开始,进行更改并提交。然后我从这个分支结帐到 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/foo
在feature/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 输出变化,使历史易于跟踪。
推荐阅读
- redirect - 我可以从 URL 方案重定向到 javascript: 带有 302 的方案吗?
- batch-file - 通过 CYGWIN 和批处理文件调用 Bash - “找不到命令”
- c# - .Net MAUI “run-as”命令因“run-as”失败:无法设置功能:不允许操作
- javafx - 次要场景关闭时切换到主要场景
- scala - 根据其他列中的值删除/更新 spark 数据框行
- html - 从图片中打开电子邮件的页面出现问题
- animation - 尽管安装干净,但 Manim 错误。如何解决?
- android - INI 文件在退出后不会保留值 - RAD Studio 10.4.2
- php - 如何在每个给定期间在收益表中插入数据
- javascript - 用 Javascript 中的零偏移量在 UTC 时间中转换具有一定偏移量的时间