Git:删除先前的提交但保留最近的更改

时间:2013-07-16 10:10:17

标签: git

我的存储库中有一些提交:

喜欢:

A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D

其中E是我最近的提交。现在我想摆脱我使用功能C所做的更改,但我希望保持更改添加D和E.

我希望你能帮助我。

谢谢

8 个答案:

答案 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

How to revert commits

答案 7 :(得分:0)

使用git revert

到目前为止,最好的解决方案是使用git revert。这将进行新的提交,以撤消特定SHA中的更改。这是一种删除提交的非常安全的方法,并且可以轻松地与其他分支或远程分支合并。

How to use Git Revert

git revert <insert bad commit hash here>