2009-09-03 21:23:58 +0000 2009-09-03 21:23:58 +0000
133
133

如何回滚1个提交?

我有2个提交没有推送:

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

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

我如何回滚第一个提交(最老的提交),但保留第二个提交? git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

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

我只需要做:

&001

那是什么?

答案 (9)

99
99
99
2009-09-03 21:32:01 +0000
git rebase -i HEAD^^
git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

或者, &001

&001

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

你可以用git revert还原一个提交,但它会在历史记录中增加更多的提交信息,这可能是不可取的。使用-n参数来告诉Git不要马上提交还原。

如果你的两个提交影响到同一个文件,你可能会看到合并冲突。

54
54
54
2011-08-05 17:52:58 +0000

这个方法来自http://nakkaya.com/2009/09/24/git-delete-last-commit/ ,对我来说很管用

Git删除最后一次提交

有一次在深夜,当我喝完咖啡后,我提交了一些不该提交的东西。然后我花了10-15分钟的时间去搜索如何删除最后一次提交。所以第三次之后,我想把它记录下来,以便以后可以参考。

如果你已经提交了垃圾,但没有推送,

git reset --hard HEAD~1 >

HEAD~1是head前的提交的速记。或者你也可以参考你想重置为哈希的SHA-1。

如果你不想删除你已经做的工作,你可以使用 --soft 选项,它可以删除提交,但会留下所有的修改文件 “Change to be committed",就像 git status 那样。但是你可以做一个 git revert,

git revert HEAD

这将创建一个新的提交,将意外提交的所有内容都还原。

8
8
8
2009-09-03 21:26:55 +0000

不,git-reset -hard 会让你回到历史上。你要找的是git revert,它可以撤销任何提交。

6
6
6
2011-12-12 04:39:48 +0000

我刚刚做了这个:

git rebase -i HEAD^^

我把它搞砸了,所以我做了

git rebase --abort

然后又做了一次。然后我不得不这样推送:

git push origin master -f

&001

然后它破坏了比我回滚的提交更早的提交。效果很好。

4
4
4
2010-01-28 03:48:38 +0000

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

4
4
4
2009-09-03 21:46:37 +0000

不,git reset --hard baf8d5e会删除3368e1c的提交,之后head会在baf8d5e处。这个命令将启动你的提交信息编辑器,你会看到最后两个提交的每一行。在这里,你只需删除 3368e1c 提交行并保存,然后 git 会重写你的历史记录,第二个提交就会消失。交互式重写是非常强大的!

如果有人已经看到了这些提交(从你的版本库中推送或拉取),请不要这样做

1
1
1
2012-10-12 09:23:13 +0000
git checkout <treeish> -- /path/to/dir

这将使目录从给定的 “树状 "中返回/path/to/dir

1
1
1
2012-02-28 20:17:27 +0000
git reset --hard {ref}

是唯一可以撤销提交的方法,如果 repo 中只有一个其他的提交(例如初始提交和另外一个提交)。其余的方法(revert、rebase)都是无效的,至少在git 1.7.5.1版本中是这样。

0
0
0
2014-06-13 00:08:14 +0000

我通过手动编辑仓库文件夹内的HEAD文件中最后提交的哈希码来实现这个功能:

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

之前,我在本地做的UNMERGE操作一直无法推送到源码。它一直说它 “未能将一些 refs 推送到 Central Repository。