Git:如何在不丢失当前提交的情况下指向上一次提交?

时间:2018-06-14 13:18:38

标签: git merge version-control branch revert

我以相当线性和基本的方式使用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

进行一些阅读

Branching and Merging

Detached HEAD

Rewriting History

但我仍然有点迷失正确的方法应该是什么。我假设我可以将HEAD指向bc6dde8,这将作为最后一次提交,以便当我合并为master时,d17be71将没有被合并到主人但仍然存在于我的qa分支上,但我没有读过任何证实这实际上会发生的事情。

我想我可以创建qa的新分支,然后回到qa并恢复到bc6dde8并删除我的最后一次提交,然后在启动后合并回qa,但我假设我不喜欢必须这样做。只是有一个困难的时间弄清楚究竟是什么,如果不是那样我应该这么做。

我该如何纠正这个错误?

2 个答案:

答案 0 :(得分:3)

我想最简单的解决方案是

$ virtualenv name_of_virtualenv_directory
$ name_of_virtualenv_directory/bin/python setup.py install

(注意git checkout master git merge qa^ ,告诉git您正在合并^引用的提交的父提交。)

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

qa

(当然,你可以删除文本Merge branch 'qa' (early part) ,如果你希望它最终看起来(大多数情况下),就像在将排除的提交添加到(early part)分支之前发生了合并一样。或者你可能会以通常用于合并提交的方式更改提交消息。)

你创建一个新分支并重置qa分支的解决方案也有效,并且 (请注意术语;这是qa。要reset创建新的提交,以撤消先前提交的更改。虽然这是另一个用户的建议答案,但我不会# 39;推荐它,因为它在历史中放置了不必要的混乱。[1])这样做的主要诀窍是,你希望revert重新合并为快进;但这不是一个伎俩,因为它应该是默认行为,只要在此期间没有其他任何内容添加到d17be71

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

qa

[1]:有些时候git checkout qa git reset --hard HEAD^ git checkout master git merge qa git checkout qa git reset --hard qa@{1} 有意义,而不是revert。主要原因是避免编辑共享历史记录。但是,如果您要分享历史记录编辑,那就非常重要了,因为历史记录编辑是暂时的,所以情况并非如此。

答案 1 :(得分:0)

你可以简单地git revert d17be71。它不会删除d17be71,而是生成一个基本上取消d17be71的还原提交。记下该还原提交的哈希值。将qa合并到master后,运行另一个git revert the-revert-commit-hash,它会取消还原,并有效恢复d17be71更改。