将提交的更改移回主分支

4
我不小心将一系列提交提交到了我不打算提交的分支上。 我原本想把它们放在master,但结果却是把它们放在了我们称之为integ的共享分支上。 我希望找到一种方法将这些提交从integ中移除,并将它们放在master上; 我希望它们从未存在于integ中。

在github上,integmaster都已经被共享了。 我们的CI环境使用integ分支。

我了解到git rebase是一种选择,但据我所知,它会使integ分支在其历史记录中具有被重新应用到master上的提交,因此不能再使用。 具体来说,我指的是:

http://blog.evan.pro/a-simple-explanation-of-git-rebase

原文如下:

在这里它说:

此时不要从 origin/feature/my-topic 等分支进行拉取、合并或变基操作!为什么呢?因为 Git 认为:“哦,看,origin/feature/my-topic 分支有两个提交(D 和 E),而我们本地的 feature/my-topic 分支没有。那就把它们合并进来吧!”…… 这是一个问题,因为我们确实有这些提交,但是当我们运行 git rebase 后,它们的哈希值已被改写成 F 和 G。

我的问题是:

  • 我该如何恢复这些分支的状态,使得 integ 分支的 10 个提交最终出现在 master 分支上,并且 integ 分支看起来好像从来没有这些提交一样?
  • 是否可能实现这一点?
  • 如果不能,我该如何回到可以继续的位置?

提前感谢您的帮助!


1
在 rebase 之后使用 integ 分支是可能的,但这将使得任何人指向当前提交的 当前检出 副本无效。如果可以让每个人在继续对其进行更多提交之前重置他们的 integ 分支,则可以选择 rebase。然而,除了最简单的情况外,这将是一种非常痛苦的方式。 - Gareth
@Gareth,事实证明这是可能的。这个项目只有我和另一个开发人员。我在integ分支上的CI工作是为了测试如何最好地使用CI工具运行构建,而且我是唯一在integ分支上工作的人。所以,在变基之后,我需要将所有内容推送到GitHub,并要求另一个人重置他的分支副本,然后我就可以处于一个良好的位置了?谢谢! - Jon
是的。如果您不添加“--force”标志,您的推送将失败,因为git将尝试阻止您删除对现有提交的引用。然后,在其他开发人员获取(不是拉取)您的更改之后,他需要在“integ”分支上执行“git reset --hard origin/integ”。这就是“不要合并”警告的作用,如果他拉取或以其他方式合并,则git将尝试合并检出的(旧)分支和重新基于的分支,留下一个混乱的树形结构。 - Gareth
3个回答

2

你无法从Git的历史记录中“删除”某些内容。但是你可以通过使用 revert 命令来撤销提交。

git revert HEAD~n 

或者

git revert $SHA1_HASH

在完成此操作后,您需要从提交记录中创建补丁并手动将其应用于主分支,或者使用git cherry-pick,它本质上是相同的(感谢sleske提到!)


3
吹毛求疵:你可以使用 git rebase(或 git reset --hard)与 git push -f 结合使用将某些内容从历史记录中删除。然而,在这种情况下不建议这样做,因此这是正确的解决方法。 - sleske
此外,“你可以将你的分支合并到主分支”是错误的 - 这不起作用,因为提交已被还原。要将提交复制到主分支,您需要创建和应用补丁,或使用 git cherry-pick(它本质上做相同的事情)。 - sleske
谢谢@akluth!所以当我执行git revert HASH时,这将重置分支状态但保留本地代码中的更改,然后我可以从中创建补丁并将其应用于主分支,对吗? - Jon
@KlasMellbourn:不,使用rebase在这里不是一个好主意(如上所述),因为提交已经被共享。 - sleske
@slesk 我知道rebase不是解决integ提交问题的好方法。我只是试图提出一种解决主分支上提交复制问题的方式,虽然这部分问题要简单得多。 - Klas Mellbourn
显示剩余8条评论

2

以下是如何将最后3个提交从integ移动到master的步骤。

git checkout master
git cherry-pick integ^^
git cherry-pick integ^
git cherry-pick integ
git checkout integ
git reset --hard HEAD~3

我成功地将我的提交挑选到了“master”分支,然后将“integ”重置为在我挑选的提交之前的那个提交。我使用“push --force”将更改推送到了Github,并且一切都正常工作。因此,@TheBuzzSaw的建议对我很有帮助。谢谢大家! - Jon
TheBuzzSaw 可以说是 git 界的大神。 - SageMage

0

如果你想将"integ"的提交应用到"master"上,你应该进行合并。首先尝试这样做以确保不会丢失更改。 如果没有人在主分支上进行了提交,那么这将是一个快进合并。 然后你可以考虑如何从'integ'中删除那些提交(我不知道怎么做)。


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