Git:本地rebase后重复提交,然后pull

19

背景:

我有一个功能分支A,它比我的开发分支领先一个提交:

3   (develop, origin/develop)
| 2 (A, origin/A) some feature branch commit
|/
1   some commit

然后我将A分支变基到develop分支 (git checkout A, git rebase develop),这样我就得到了:

2'  (A) some feature branch commit
|
3   (develop, origin/develop)
| 2 (origin/A) some feature branch commit
|/
1   some commit

现在我不能再将A推送到origin,因为Git将拒绝非快进提交。它告诉我首先拉取远程更改。

当我这样做然后推送时,我最终会得到以下历史记录:

4   (A, origin/A) merged origin/A into A
|\
2'| some feature branch commit
| |
3 | (develop, origin/develop)
| 2 (origin/A) some feature branch commit
|/
1   some commit

最终我得到了一个包含2次提交的历史记录--尽管它们执行的是相同的操作。

问题

  1. 我如何防止这种情况发生?我如何在远程仓库上镜像我的本地变基操作?
  2. 我该如何解决这种情况?最优雅的方式是什么,以清理历史记录并仅显示一个提交?

你不能将develop分支rebase到A上吗? - Mat
你能否使用git合并呢? - TheOneTeam
可能是重复的问题:在rebase之后,Git提交在同一分支中被复制 - Whymarrh
2个回答

24
  1. 重新定位是重写历史的操作-为了避免麻烦,请勿重定位已推送的内容。

  2. 当检出A时,您可以使用push --force命令。 origin/A的历史记录将被覆盖为您版本的A。请注意,这将需要其他开发人员手动干预其仓库。


嗯...如果你这么说,你让它听起来很简单。 - avdgaag
对于 JBoss AS 7 GitHub 存储库,决定不想在历史记录中进行合并,因此所有分支都被重新设置基础。因此,每个功能分支都需要像这样处理,并且子提交者只需要在此分支上同步(rebase)。很容易变得混乱。 - Ondra Žižka

4
我该如何防止这种情况发生?我该如何在远程仓库上镜像我的本地变基操作?
我该怎么解决这种情况?什么是最优雅的方法来清理历史并仅显示一个提交?
删除远程分支并重新推送您的新变基分支。如果您团队中的其他成员可能已经拉取了您的分支'A',请告诉他们删除该分支并重新拉取最新版本。

2
如果他们(很可能)在那个分支上工作,请告诉他们在你刚刚变基的分支上进行变基。 - Ondra Žižka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接