我的存储库中有一些提交:
喜欢:
A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D
其中E是我最近的提交。现在我想摆脱我使用功能C所做的更改,但我希望保持更改添加D和E.
我希望你能帮助我。
谢谢
答案 0 :(得分:24)
Interactive rebase是你的朋友!
正如其他人所说:
$ 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将处理其余的(您可能必须修复一些冲突,具体取决于提交的性质并恢复您的权限)试图删除)。
重要的是要注意,如果你已经推送了你的代码而其他人已经把它拉了下来,那么上面的代码将无法正常工作,因为下次有人检查你的分支机构时会提醒他们。交互式rebase删除提交到没有记录的程度,因此其他克隆不知道它们已被删除。下次他们推送时,他们会尝试重新设置它们,因为本地克隆“看到”原点没有你删除的对象(提交)。
答案 1 :(得分:7)
如果您只想“摆脱更改”(在问题正文中指定)而不是实际“删除提交”(如标题中所指定),则一个简单的选项是添加一个新的提交,与之前的提交完全相反。
这不是万无一失的,它可能会因为更改而导致冲突,但它不会改变历史记录,允许您记录撤消及其原因,并与其他工作副本一起使用。
git revert
是用于制作一组提交的邪恶双胞胎的工具。
答案 2 :(得分:1)
要执行此操作,请按以下步骤操作:
git rebase -i HEAD~3
然后将提交C移动到底部的第一个,你将有
D - Added Feature D
E - Added Feature D
C - Redesigned Feature C
保存并退出,然后
git reset HEAD^
这将撤消提交C。
答案 3 :(得分:1)
如果您只在本地进行更改,那么您可能最好遵循一个变基础答案。如果您已经在任何地方发布了更改,那么您不希望重新设置,因为这将改变历史记录,这意味着其他人也将不得不重新定义,或者您将让您的违规提交再次合并。
如果其他人有你的提交,最干净的事情是恢复违规的变化,而不是完全切除它。使用git revert COMMIT_ID
创建一个新的提交,撤消您在COMMIT_ID
中应用的更改。
答案 4 :(得分:0)
这称为变基:你需要-i
开关。
阅读:https://www.atlassian.com/git/tutorial/rewriting-git-history#!rebase-i
对于类似的问题/答案,请参阅:https://stackoverflow.com/a/2938393/2536029
答案 5 :(得分:0)
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控制台,您将看到您的提交不再出现在日志中并且他们的文件已暂存。
答案 6 :(得分:0)
如果您在Windows中使用TortoiseGit,您可以右键单击Git文件夹,然后单击TortoiseGit > Show log
。您可以查看之前完成的所有提交,然后检查您要恢复的提交。
单击提交,您可以在下面看到更改的文件。单击要还原的文件,然后单击revert to parent revision
。
答案 7 :(得分:0)
到目前为止,最好的解决方案是使用git revert。这将进行新的提交,以撤消特定SHA中的更改。这是一种删除提交的非常安全的方法,并且可以轻松地与其他分支或远程分支合并。
git revert <insert bad commit hash here>