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

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.


我该如何回滚我的第一个(最早的一个),但是保留第二个? >
 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...


来自这里:

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

我只需要做:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e


那是吗?

评论

这个问题似乎与主题无关,因为它与编程工具有关。它属于Stack Overflow。

@PeterMortensen同意。这是SuperUser的范围

#1 楼

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

git rebase -i HEAD^^


或者,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^


来自在那里您可以压缩提交,这会将一个或多个提交放到上一个提交中。要从历史记录中完全删除提交,请从列表中删除行。

您可以使用git revert还原提交,但是它将向历史记录中添加更多提交消息,这可能是不可取的。使用-n参数告诉Git不要立即提交还原。您可以交互地重新设置基础,并压缩之前的命令以保持环境整洁。

如果您在此处使用的两个提交影响了同一文件,则可能会看到合并冲突。

使用git reset --hard重置存储库时应格外小心,因为无法撤消。

重写历史记录时应格外小心。

评论


如何在“ git rebase”期间删除提交?只有3个命令:pick,edit,squash。没有删除AFAIK。

–n179911
09年9月4日在4:22

从列表中完全删除该行,并删除该提交

– jtimberman
09年9月4日在5:10

当我想还原更改时,我不想留下任何痕迹。如果您也不想留下任何还原的痕迹,这是最好的方法。

– Phillip Whelan
2011年4月14日在1:52

“最安全且可能最干净的方法是交互式地重新设置基准”,如果您不使用vim,则可能不会。我很幸运,找到了摆脱困境的出路。仍在投票,因为我应该学习vim :-)

–isimmons
2013年12月13日在3:42

我建议尽量减少使用rebase。如果您与其他人一起工作,则只需还原即可。

–boldnik
13年12月31日在12:08

#2 楼

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


Git Delete Last Commit

不时地在深咖啡中,我犯下了我不应该拥有的东西。然后,我在接下来的10到15分钟内使用Google搜索
如何删除我所做的最后一次提交。因此,第三次之后,我想对其进行记录,以便以后参考。

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

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”的情况。

–亚伦·哈伦(Aaron Harun)
13年7月18日在10:45

#3 楼

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

评论


好吧,这行得通,但同时也会污染您的提交日志。如果尚未提交/拉出这些提交,最好使用交互式的基准库进行清理。与其他版本控制系统相比,更改历史记录的能力是git的主要优点之一。

–knweiss
09年9月3日在21:49

#4 楼

我只是这样做了:

git rebase -i HEAD^^


我把它拧紧了,所以我做了

git rebase --abort


然后又做了一次。然后我必须像这样推送:

git push origin master -f


它破坏了比我回滚的提交新的提交。很棒。

#5 楼

否,git reset --hard baf8d5e将删除3368e1c提交,之后HEAD将位于baf8d5e

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

在提交消息编辑器中可以使用其他有用的命令,例如squashedit等。交互式rebase非常强大! />
如果有人已经看到了这些提交(从存储库中推送或拉出),请不要执行此操作!

#6 楼

关于jtimberman关于git reset --hard是不可撤消的评论,那不是完全正确的。看到这里:https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

#7 楼

如果仓库中只有一个其他提交(例如初始提交和另外1个),则
git reset --hard {ref}


是撤消提交的唯一方法。其余方法(还原,重新设置)至少在git 1.7.5.1。之前无法正常工作。

如果在git reset之后加上git gc,则git实际上会从git中删除旧的提交数据。完全回购。

#8 楼

git checkout <treeish> -- /path/to/dir


这将从/ path / to / dir
的给定“目录”中带回目录。

#9 楼

我通过手动编辑存储库文件夹内HEAD文件中最后一次提交的哈希码来实现此目的:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"


在此之前,我从来没有推送到起源于我在本地进行的UNMERGE操作。
一直说它“没有推送一些引用”到中央存储库。