28

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

像:

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

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

我希望你能帮助我。

谢谢

4

8 回答 8

45

交互式变基是您的朋友!

正如其他人所说:

$ 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 将处理其余部分(您可能必须根据提交的性质和您尝试删除的还原来修复一些冲突)。

重要的是要注意,如果您已经推送了您的代码并且其他人已经拉取了它,则上述内容将不起作用,因为下次您的分支签出的人进行推送时,提交将重新回到那里。交互式变基会删除没有记录的提交,因此其他克隆不知道它们已被删除。下次他们推送时,他们将尝试重新恢复它们,因为本地克隆“看到”源没有您删除的对象(提交)。

于 2013-07-16T11:22:41.980 回答
9

如果您只想“摆脱更改”(如您的问题正文中指定)而不是实际“删除提交”(如标题中指定),一个简单的选择是添加一个新的提交,完全相反之前的提交做了什么。

它不是万无一失的,并且可能由于此后所做的更改而导致冲突,但它不会改变历史记录,允许您记录逆转及其原因,并且可以与其他工作副本一起使用。

git revert是用于制作一组提交的此类邪恶双胞胎的工具。

于 2013-07-16T12:15:00.313 回答
2

为此,请按照下列步骤操作:

git rebase -i HEAD~3

然后将提交 C 移动到底部的第一个,你将拥有

D - Added Feature D
E - Added Feature D
C - Redesigned Feature C

你保存退出,然后

git reset HEAD^

这将撤消提交 C。

于 2013-07-16T11:13:25.617 回答
1

这被称为变基:你想要-i开关。

阅读:https ://www.atlassian.com/git/tutorial/rewriting-git-history#!rebase-i

对于类似的问题/答案,请参阅:https ://stackoverflow.com/a/2938393/2536029

于 2013-07-16T10:13:25.400 回答
1

如果您仅在本地进行更改,则最好遵循变基答案。如果您已经在任何地方发布了更改,那么您不想变基,因为这会改变历史,这意味着其他人也必须变基,否则您将再次合并您的违规提交。

如果其他人有你的提交,最干净的做法是恢复有问题的更改,而不是完全删除它。用于git revert COMMIT_ID创建撤消您在 中应用的更改的新提交COMMIT_ID

于 2013-07-16T12:01:14.093 回答
0

如果您在 Windows 中使用 TortoiseGit,您可以右键单击 Git 文件夹,然后单击TortoiseGit > Show log。您可以查看之前完成的所有提交,然后检查您想要恢复到的提交。

单击提交,您可以在下面看到更改的文件。在要恢复的文件上单击鼠标右键,然后单击revert to parent revision

如何还原提交

于 2017-09-20T17:09:13.003 回答
0

使用 git 还原

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

如何使用 Git 还原

git revert <insert bad commit hash here>
于 2018-06-21T18:38:19.120 回答
-1
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 控制台,您将看到您的提交不在日志中,并且它们的文件已暂存。

于 2013-07-16T15:27:15.120 回答