Git: 如何在不丢失当前提交的情况下指向上一个提交?
Git: How to point to a previous commit without losing current commit?
我以相当线性和基本的方式使用 git,但我 运行 遇到了一个我很少 运行 遇到的问题,我不确定如何解决。
我的一个女人 运行 太早犯了错。它很快就会推出,但我还没有准备好推出它。在将 b运行ch 合并到主 b运行 之前,我正在尝试找出使我正在处理的 b运行ch 指向先前提交的最佳方法ch,这样当这个 b运行ch 合并到主 b运行ch 时,它不会引用最近的提交。
使用 git 日志 (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 中,然后再启动它。
阅读合并、b运行ching 和 HEAD
:
但对于正确的方法应该是什么,我仍然有点迷茫。我 假设 我可以将 HEAD
指向 bc6dde8
,这将作为最后一次提交,这样当我合并到 master 时,d17be71
不会合并到 master 中,但仍然存在于我的 qab运行ch 中,但我还没有读到任何可以证实这确实会发生的内容。
我想我可以从 qa 创建一个新的 b运行ch,然后返回到 qa 并恢复到 bc6dde8
并删除我的最后一次提交,然后在启动后合并回 qa ,但我假设我不必那样做。只是很难弄清楚如果不是那样我应该做什么。
我该如何纠正这个错误?
你可以 git revert d17be71
。它不会删除 d17be71
,而是生成一个基本上取消 d17be71
的还原提交。记下该还原提交的哈希值。在 qa
合并到 master
、运行 另一个 git revert the-revert-commit-hash
后,它将取消还原,并有效地恢复 d17be71
更改。
我想最简单的解决方案是
git checkout master
git merge qa^
(注意 ^
,它告诉 git 您正在合并 qa
引用的提交的 父提交 。)
在我的测试中,git 看到了我在做什么,甚至将默认的合并消息修改为
Merge branch 'qa' (early part)
(当然你可以删除文本 (early part)
如果你希望它最终看起来(大部分)就像合并发生在被排除的提交被添加到 qa
分支之前。或者,就此而言,您可以按照通常用于合并提交的任何方式更改提交消息。)
您创建新分支和重置 qa 分支的解决方案也有效,并且 没有太多额外工作,因为 git 分支非常轻量级。 (不过请注意术语;这是 reset
。revert
是创建新的提交以撤消先前提交的更改。虽然这是另一个用户建议的答案,但我不推荐它,因为它在历史上造成了不必要的混乱。[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
更有意义。主要原因是避免编辑共享历史记录。但这只有在您要共享历史编辑时才真正重要,这里不是这种情况,因为历史编辑是临时的。
我以相当线性和基本的方式使用 git,但我 运行 遇到了一个我很少 运行 遇到的问题,我不确定如何解决。
我的一个女人 运行 太早犯了错。它很快就会推出,但我还没有准备好推出它。在将 b运行ch 合并到主 b运行 之前,我正在尝试找出使我正在处理的 b运行ch 指向先前提交的最佳方法ch,这样当这个 b运行ch 合并到主 b运行ch 时,它不会引用最近的提交。
使用 git 日志 (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 中,然后再启动它。
阅读合并、b运行ching 和 HEAD
:
但对于正确的方法应该是什么,我仍然有点迷茫。我 假设 我可以将 HEAD
指向 bc6dde8
,这将作为最后一次提交,这样当我合并到 master 时,d17be71
不会合并到 master 中,但仍然存在于我的 qab运行ch 中,但我还没有读到任何可以证实这确实会发生的内容。
我想我可以从 qa 创建一个新的 b运行ch,然后返回到 qa 并恢复到 bc6dde8
并删除我的最后一次提交,然后在启动后合并回 qa ,但我假设我不必那样做。只是很难弄清楚如果不是那样我应该做什么。
我该如何纠正这个错误?
你可以 git revert d17be71
。它不会删除 d17be71
,而是生成一个基本上取消 d17be71
的还原提交。记下该还原提交的哈希值。在 qa
合并到 master
、运行 另一个 git revert the-revert-commit-hash
后,它将取消还原,并有效地恢复 d17be71
更改。
我想最简单的解决方案是
git checkout master
git merge qa^
(注意 ^
,它告诉 git 您正在合并 qa
引用的提交的 父提交 。)
在我的测试中,git 看到了我在做什么,甚至将默认的合并消息修改为
Merge branch 'qa' (early part)
(当然你可以删除文本 (early part)
如果你希望它最终看起来(大部分)就像合并发生在被排除的提交被添加到 qa
分支之前。或者,就此而言,您可以按照通常用于合并提交的任何方式更改提交消息。)
您创建新分支和重置 qa 分支的解决方案也有效,并且 没有太多额外工作,因为 git 分支非常轻量级。 (不过请注意术语;这是 reset
。revert
是创建新的提交以撤消先前提交的更改。虽然这是另一个用户建议的答案,但我不推荐它,因为它在历史上造成了不必要的混乱。[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
更有意义。主要原因是避免编辑共享历史记录。但这只有在您要共享历史编辑时才真正重要,这里不是这种情况,因为历史编辑是临时的。