如何回滚 1 次提交?

n17*_*911 144 git

我有 2 个没有推送的提交:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.
Run Code Online (Sandbox Code Playgroud)

如何回滚我的第一个(最旧的),但保留第二个?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...
Run Code Online (Sandbox Code Playgroud)

从这里:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

我只需要做:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
Run Code Online (Sandbox Code Playgroud)

那是?

jti*_*man 102

最安全也可能是最干净的方法是交互式地变基。

git rebase -i HEAD^^
Run Code Online (Sandbox Code Playgroud)

或者,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^
Run Code Online (Sandbox Code Playgroud)

从那里你可以压缩提交,将一个或多个提交放在前一个提交中。要从历史记录中完全删除提交,请从列表中删除该行。

您可以恢复提交,git revert但它会向历史记录中添加更多提交消息,这可能是不可取的。使用该-n参数告诉 Git 不要立即提交还原。您可以交互式地重新设置基础并将其压缩到先前的承诺以保持清洁。

如果您在此处处理的两个提交影响相同的文件,您可能会看到合并冲突。

重置存储库git reset --hard应该小心完成,因为它无法撤消。

重写历史应该小心。

  • 从列表中完全删除该行,并删除该提交 (8认同)

小智 65

这如果来自http://nakkaya.com/2009/09/24/git-delete-last-commit/ 并且对我有用

Git 删除上次提交

偶尔在深夜喝完咖啡时,我会犯一些我不应该做的事情。然后我在接下来的 10 - 15 分钟内搜索如何删除我所做的最后一次提交。所以第三次之后,我想把它记录下来,以便以后参考。

如果你犯了垃圾但没有推送,

git reset --hard HEAD~1

HEAD~1 是 head 之前提交的简写。或者,您可以参考要重置为的哈希值的 SHA-1。请注意,当使用 --hard 时,对工作树中跟踪文件的任何更改,因为 head 之前的提交都丢失了。

如果您不想清除您所做的工作,您可以使用 --soft删除提交的选项,但它将保留所有更改的文件“要提交的更改”,正如 git status 所说的那样。

现在,如果你已经推了,有人拉了,这通常是我的情况,你不能使用 git reset。但是,您可以执行 git revert,

git revert HEAD

这将创建一个新的提交,以逆转意外提交引入的所有内容。

  • 使用 --soft 选项,它非常适合您重命名文件并意外“git commit -a”而不是首先使用“git add”。 (2认同)

Pel*_*ier 8

不。git-reset --hard 将带你回到历史。您正在寻找的是 git revert,它将撤消任何提交。

  • 嗯,这行得通,但它也会污染你提交日志。如果这些提交尚未推送/拉出,最好使用交互式 rebase 清理它们。更改历史记录的能力是 git 相对于其他版本控制系统的主要优势之一。 (5认同)

小智 6

我只是这样做了:

git rebase -i HEAD^^
Run Code Online (Sandbox Code Playgroud)

我搞砸了所以我做到了

git rebase --abort
Run Code Online (Sandbox Code Playgroud)

然后又做了。然后我不得不像这样推动:

git push origin master -f
Run Code Online (Sandbox Code Playgroud)

它销毁了比我回滚到的提交更新的提交。工作得很好。


knw*_*iss 5

不,git reset --hard baf8d5e将删除3368e1c提交,然后 HEAD 将在baf8d5e

如果您想保留3368e1c提交并删除bad8d5e提交,最简单的解决方案是执行“ git rebase -i HEAD~2”(即最后两次提交的交互式变基)。此命令将启动您的提交消息编辑器,您将看到最后两次提交中的每一个都对应一行。在那里您只需删除bad8d5e提交行并保存。然后 git 将重写您的历史记录,第二次提交将消失。

您可以在提交消息编辑器中使用其他有用的命令squash,例如edit、 等。交互式变基非常强大!

如果有人已经看到这些提交(从您的存储库推送或拉取),请不要这样做!