GIT-重新设置-如何处理冲突

标签 git conflict rebase

我正在一个有两个分支的项目中:masterfeaturefeature分支是在一段时间前创建的,具有大量提交。

自创建feature分支以来,已经对master进行了两次提交

在这一点上,当我从rebase转到master时,我遇到了冲突。我先解决它们,然后rebase --continue。然后,我再次遇到冲突,并再次解决和rebase --continue。这种情况一遍又一遍地发生,似乎它们是正在出现的相同冲突。

在我看来,这是正在发生的事情:
master(commits)->a->bfeature(commits)->c->d->e->f->gfeaturemaster->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/

相关文章:

git - 改变分支基地

mercurial - 使用 tortoiseHg 为 Mercurial 存储库导入具有冲突更改的补丁

git - git rebase 后缺少提交

Git 重置行为

git - 如何使用powershell安装配置IIS、SSL证书、urlrewrite、git和clone repository

python - 在不共享个人信息的情况下共享程序的正确方法是什么?

由于 Netbeans 中的这些文件,head 与 origin/master 的 git merge 失败

git - 如何在不更改日期的情况下编辑提交作者?

git - 如何设置 .gitignore 以忽略所有 .jars 但不在预期文件夹中

tomcat - Tapestry + JaxB 冲突