$ 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
那是吗?
#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然后将重写您的历史记录,第二次提交也将消失。在提交消息编辑器中可以使用其他有用的命令,例如
squash
,edit
等。交互式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操作。
一直说它“没有推送一些引用”到中央存储库。
评论
这个问题似乎与主题无关,因为它与编程工具有关。它属于Stack Overflow。@PeterMortensen同意。这是SuperUser的范围