如何修复许多提交前的合并冲突,同时保留一个分支?

时间:2017-11-21 10:09:14

标签: git merge version-control tortoisegit merge-conflict-resolution

在我所在的团队中,我们同意在中央存储库中只有一个分支 - 主分支。我们创建功能分支但我们从不推动。一些开发人员在rebase之前忘记了merge他们的功能分支。所以Git中存在冲突,他们也懒得解决。 (他们只是使用他们来覆盖其他人的变化。)其他一些提交进入并处于冲突合并之上。这使得中央存储库具有多个分支。

这是一个简化的例子。它类似于TortoiseGit中提供的内容。 ()内的名称是分支名称。由于这只是一个例子,我也推(这些功能分支在其名称前面有'origin')。

那么如何解决合并冲突同时只保留一个分支 - 主分支?

*   (feature/feature04, master, origin/master, origin/feature/feature04) Commit in feature 04
|
*   Merge branch 'feature/feature03'
|\
| *   (feature/feature03, origin/feature/feature03) Commit in feature 03
* |   (feature/feature02, origin/feature/feature02) Commit in feature 02
|/
*   (feature/feature01, origin/feature/feature01) Commit in feature 01
|
*   Commit #1

同一图表的另一种观点:

A -- B -- C ------ E -- F -- (other commits)   MASTER branch
      \------ D --/                            feature03 branch

1 个答案:

答案 0 :(得分:0)

要使提交历史记录保持为远程仓库的线性,您应该在提交历史记录中将commit E替换为commit D(如下图所示)。

A---B---C---E---F---…X  master
     \     /
      --D--             feature/feature03

首先,在提交D的顶部重新提交C,并通过以下方式将提交feature/feature03指向已重新提交的提交

git rebase --onto <commit id for C> <commit id for B> <commit id for D>
git branch -f feature/feature03

然后提交历史记录将是:

          D'   feature/feature03
         /
A---B---C---E---F---…---X  master
     \     /
      --D--    

然后在提交master顶部的D'分支上重新提交其他提交,并通过以下命令重新指向master分支

git rebase --onto <commit id for D'> <commit id for E> <commit id for X>
git branch -f master
git checkout master

然后提交历史记录将是(feature / feature03分支点提交D',master分支点提交X'):

A---B----C---D'---F'---…---X'  master
             |
      Feature/feature03

最后通过以下命令强制将master分支的已更改提交历史记录推送到远程仓库

git push -f origin master

注意:功能分支似乎已经推送到远程仓库,因为您展示了跟踪分支,如origin/feature/feature01origin/feature/feature02等。如果要删除功能分支在远程仓库中,您可以使用git push :feature/feature01git push :feature/feature02等。