首页 > 解决方案 > Git:如何在不丢失当前提交的情况下指向先前的提交?

问题描述

我以相当线性和基本的方式使用 git,但我遇到了一个我很少遇到的问题,我不确定如何解决。

我在我的一个分支机构中过早地做了一些事情。它很快就会推出,但我还没有准备好推出它。我试图找出最好的方法,让我正在处理的分支在我将此分支合并到主分支之前指向先前的提交,这样当这个分支合并到主分支时,它不会引用最近的提交。

使用 git log ( git log --oneline),我有以下内容:

d17be71 (HEAD -> qa, origin/qa) Fix footer in jsp.
bc6dde8 (featureBranch1) Correct company logo.

所以d17be71不小心被加到了qa中,而qa会被合并到master中。我不希望将这些更改合并到 master 中,但我不想丢失它们。我想bc6dde8被合并到master中,在这段代码成功启动后,我会d17be71重新合并到qa中,然后将它合并到master中,然后也启动它。

阅读有关合并、分支和HEAD

分支和合并

分离头

改写历史

但是对于正确的方法应该是什么,我仍然有些迷茫。我假设我可以只指向HEADbc6dde8这将作为最后一次提交,这样当我合并到 master 时,d17be71不会合并到 master 但仍然存在于我的 qa 分支上,但我还没有阅读任何确认的内容这实际上会发生。

我想我可以从 qa 创建一个新分支,然后返回 qa 并恢复bc6dde8并删除我的上一次提交,然后在启动后合并回 qa,但我假设我不必这样做。只是很难弄清楚如果不是那样我应该做什么。

我应该如何纠正这个错误?

标签: gitmergeversion-controlbranchrevert

解决方案


我想最简单的解决方案是

git checkout master
git merge qa^

(注意^,它告诉 git 你正在合并引用的提交的父提交qa。)

在我的测试中,git 看到了我在做什么,甚至修改了默认的合并消息说

Merge branch 'qa'  (early part)

(当然,(early part)如果您希望它最终看起来(大部分)就像在将排除的提交添加到qa分支之前发生合并一样,您可以删除文本。或者您可以以通常用于合并的任何方式更改提交消息提交,就此而言。)

您创建新分支和重置 qa 分支的解决方案也可以工作,并且由于 git 分支非常轻量级,因此不需要太多额外的工作(但请注意术语;这是一个reset.Torevert是创建新的提交,以撤消先前提交的更改。虽然这是另一个用户的建议答案,但我不推荐它,因为它在历史中留下了不必要的混乱。[1 ]) 这样做的主要技巧是,您希望重新合并d17be71成为快进;但这不是一个技巧,因为它应该是默认行为,只要同时没有添加任何其他内容qa

还有许多其他可能的解决方案。您的解决方案的变体,使用 reflog 而不是临时分支,例如:

git checkout qa
git reset --hard HEAD^
git checkout master
git merge qa
git checkout qa
git reset --hard qa@{1}

[1]:有时revert有意义而不是reset. 主要原因是避免编辑共享历史。但这只有在您要共享历史编辑时才真正重要,这里不是这种情况,因为历史编辑是临时的。


推荐阅读