我正在一个有两个分支的项目中:master
和feature
feature
分支是在一段时间前创建的,具有大量提交。
自创建feature
分支以来,已经对master
进行了两次提交
在这一点上,当我从rebase
转到master
时,我遇到了冲突。我先解决它们,然后rebase --continue
。然后,我再次遇到冲突,并再次解决和rebase --continue
。这种情况一遍又一遍地发生,似乎它们是正在出现的相同冲突。
在我看来,这是正在发生的事情:master(commits)->a->b
feature(commits)->c->d->e->f->g
feature
从master->a
分支出来,然后创建了所有提交。
当我rebase
时,它会倒退到feature
的开头,该位置是从master
分支出来的,然后应用master->b
,然后开始应用feature->c
,此时发生冲突。我解决(接受master
的更改)并继续。现在,它尝试应用feature->d
并找到相同的冲突。再次,我必须解决和continue
。这种情况一遍又一遍地发生。
例如,以下是更改:
master->a
<div id="foo">
master->b
<div id="bar">
feature->c
<div id="fubar">
feature->d
//Nothing has changed, inherited from feature->c
<div id="fubar">
我假设到达
feature->c
时说将foo
更改为fubar
,然后注意到foo
已更改为bar
。我解析为bar
,然后应用feature->d
进行相同的逻辑我的两个问题:
1)我对git如何工作/处理提交/冲突/ rebase 的理解正确吗?
2)如何避免一遍又一遍地解决相同的冲突?我当时正在考虑压缩功能分支上的所有提交,以便只处理一个。我不确定这是个好主意还是场景中压榨的最佳方法。
注意,这是一个非常简化的示例。实际上,我有很多提交,并且在每个文件中都有许多冲突。在
rebase --continue
的整个过程中,有些似乎是相同的,而对于每种commit
,则有些是新的。我的最终目标是尽可能简单地清理该项目(使功能分支基于当前的母版重新构建)。我不在乎提交的历史。
最佳答案
I do not care about the history of the commits.
如果您真的不在乎历史,那么
git merge --squash
可以让您立即解决所有冲突,并通过所有更改进行一次提交。要本质上就地执行
--squash
,您可以执行以下操作:git branch -m feature feature-old
git checkout master -b feature
git merge --squash feature-old
解决所有冲突(一次)后,您将在
feature
上创建单个提交,并将master
作为父提交。话虽如此,我还是保持历史的忠实拥护者。绝对要先尝试
rerere
。您也可以尝试就地rebase --interactive
(例如git rebase -i $(git merge-base HEAD master)
)来压缩fixup-type提交,而不必完全消除所有离散提交。
关于GIT-重新设置-如何处理冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42424432/