我的存储库中有一些提交:
像:
A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D
其中 E 是我最近的提交。现在我想摆脱使用功能 C 所做的更改,但我想保留使用 D 和 E 添加的更改。
我希望你能帮助我。
谢谢
我的存储库中有一些提交:
像:
A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D
其中 E 是我最近的提交。现在我想摆脱使用功能 C 所做的更改,但我想保留使用 D 和 E 添加的更改。
我希望你能帮助我。
谢谢
交互式变基是您的朋友!
正如其他人所说:
$ git rebase -i HEAD~5
...-i
交互式标志在哪里,HEAD~5
意味着包括交互式 rebase 中的最后 5 次提交。
当您因发出上述内容而启动编辑器时,请查看打开文件中的注释:
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
对您而言,关键是如果您在此处删除一行,则提交将丢失。
因此,删除引用您想要删除的提交的行,保存并关闭,然后 git 将处理其余部分(您可能必须根据提交的性质和您尝试删除的还原来修复一些冲突)。
重要的是要注意,如果您已经推送了您的代码并且其他人已经拉取了它,则上述内容将不起作用,因为下次您的分支签出的人进行推送时,提交将重新回到那里。交互式变基会删除没有记录的提交,因此其他克隆不知道它们已被删除。下次他们推送时,他们将尝试重新恢复它们,因为本地克隆“看到”源没有您删除的对象(提交)。
如果您只想“摆脱更改”(如您的问题正文中指定)而不是实际“删除提交”(如标题中指定),一个简单的选择是添加一个新的提交,完全相反之前的提交做了什么。
它不是万无一失的,并且可能由于此后所做的更改而导致冲突,但它不会改变历史记录,允许您记录逆转及其原因,并且可以与其他工作副本一起使用。
git revert
是用于制作一组提交的此类邪恶双胞胎的工具。
为此,请按照下列步骤操作:
git rebase -i HEAD~3
然后将提交 C 移动到底部的第一个,你将拥有
D - Added Feature D
E - Added Feature D
C - Redesigned Feature C
你保存退出,然后
git reset HEAD^
这将撤消提交 C。
这被称为变基:你想要-i
开关。
阅读:https ://www.atlassian.com/git/tutorial/rewriting-git-history#!rebase-i
对于类似的问题/答案,请参阅:https ://stackoverflow.com/a/2938393/2536029
如果您仅在本地进行更改,则最好遵循变基答案。如果您已经在任何地方发布了更改,那么您不想变基,因为这会改变历史,这意味着其他人也必须变基,否则您将再次合并您的违规提交。
如果其他人有你的提交,最干净的做法是恢复有问题的更改,而不是完全删除它。用于git revert COMMIT_ID
创建撤消您在 中应用的更改的新提交COMMIT_ID
。
到目前为止,最好的解决方案是使用 git revert。这将进行一个新的提交,以撤消特定 SHA 中的更改。这是删除提交的一种非常安全的方法,并且可以轻松地与其他或远程分支合并。
git revert <insert bad commit hash here>
git reabse -i HEAD~3
您将获得 3 个最后提交消息的列表
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D
您只需在要撤消的提交之前插入 x git reset HEAD^,您想撤消提交 C,所以它会是这样的
C - Redesigned Feature C
x git reset HEAD^
D - Added Feature D
E - Added Feature D
退出 rebase 控制台,您将看到您的提交不在日志中,并且它们的文件已暂存。