我有一个这样的提交列表:
Author: xyz
Date: Fri Jul 30 11:48:40 2021 -0700
update tests
commit 76810c2bdf91cd84661fabb06f00f37fc0e6b264
Author: abc
Date: Thu Jul 29 16:38:33 2021 -0700
fix for issue
commit b9a1642c3d778524291c98895425aa0248ed5766
Merge: baeb6428 6b722171
Author: abc
Date: Thu Jul 29 16:36:58 2021 -0700
Merge branch
commit 6b722171718f7aa70236613c544d8ca9f6cdeea9
Author: abc
Date: Thu Jul 29 17:15:02 2021 +0000
Use new type
commit baeb642886c19135c6057fba94849768b5ffc5a3
Author: abc
Date: Wed Jul 28 16:24:10 2021 -0700
old commit
我想回到旧的提交,但有一个提交76810c2bdf91cd84661fabb06f00f37fc0e6b264
包括在内。我该怎么做呢?
我为每个提交手动尝试git revert <hash>
和git revert -m 1 <merge hash>
合并提交,但它没有像预期的那样工作。此外,我有一长串的恢复要做,这是一个繁琐的任务,手动去做。有更简单的方法吗?
这种情况有时会发生在我们团队的发布/集成分支中,某些特性的发布将被中止/取消,但这些特性已经在发布/集成分支上提交或合并了。
从你的评论:
我希望A <- B <- C <- D像B <- D
与其试图找到git revert
的解决方案,我们宁愿这样做:
- 在D上创建一个新的分支
- 查看如何从旧提交创建新的Git分支?
- 如果B是一个单一或小的提交集,只需
git cherry-pick
it/them
在您的示例中,它将是:
# git checkout -b <new-branch-name> <old commit>
$ git checkout -b new-branch baeb642886c19135c6057fba94849768b5ffc5a3
# git cherry-pick <specific commit>
$ git cherry-pick 76810c2bdf91cd84661fabb06f00f37fc0e6b264
# make new branch available to rest of team
$ git push -u origin new-branch
现在我们有new-branch,它是基于旧的提交+在它上面的一个提交。如果您选择的提交依赖于C的更改,则cherry-pick
上可能存在冲突。这里不再包含
D -> C -> B -> A [old-branch]
-> B [new-branch]
注意,这里没有真正的还原,因为包含您不再需要的提交的旧分支仍然在那里。但至少在这里,人们的本地副本被弄乱的机会更少,因为他们只需要签出这个new-branch。(我们通常保留old-branch一段时间作为参考,因为有时人们会改变主意…)
要完成一个恢复操作,我们可以简单地删除old-branch,这将删除所有你不再包含在new-branch中的提交。这与git revert
具有相同的破坏性效果,因此请注意确实不再需要任何这些提交,特别是合并的分支(您可能想要重新创建这些分支)。