在我所在的团队中,我们同意在中央存储库中只有一个分支 - 主分支。我们创建功能分支但我们从不推动。一些开发人员在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
答案 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/feature01
,origin/feature/feature02
等。如果要删除功能分支在远程仓库中,您可以使用git push :feature/feature01
,git push :feature/feature02
等。