我如何从我目前的状态转向在某个承诺上拍摄的截图?

如果我做 git 登录,那么我会得到以下输出:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

我如何转向11月3日的承诺,即承诺0d1d7fc?


当前回答

但是,为了完整性,我也想展示这些其他替代解决方案,也可以用来逆转一个承诺(在这个意义上,你创建一个新的承诺,阻止了以前的承诺的变化,就像Git的逆转一样)。

替代方案1:硬和软重组

这是查尔斯·贝利(Charles Bailey)的解决方案的一个非常轻微修改的版本,以便在Git中通过SHA的Hash转向一个承诺吗?

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}

# Commit the changes
git commit -m "Revert to <commit>"

这基本上是通过使用软重组将离开指数/重组区域的前承诺的状态,然后你可以承诺。

替代方案2:删除现有树,并用新树取代

git rm -r .
git checkout <commit> .
git commit

类似于替代 #1,这重复了当前工作副本中的 <commit> 状态. 首先需要做 git rm 因为 git checkout 不会删除自 <commit> 以来添加的文件。

其他回答

首先,拿到在某个日期内识别承诺的线条,这样做:

git rev-list -n 1 --before="2009-07-27 13:37" origin/master

它打印承诺识别器,采取线(例如XXXX)并:

git checkout XXXX

如果你想“不承诺”,删除最后的承诺消息,并将修改的文件重新排序,你会使用命令:

git reset --soft HEAD~1

--soft 表明未订购的文件应该作为工作文件相反的 --hard 将排除它们. HEAD~1 是最后的订单. 如果你想旋转 3 订单,你可以使用 HEAD~3. 如果你想旋转到一个特定的修订号码,你也可以这样做,使用它的 SHA 标签。

这是一个非常有用的命令,在你犯了错误的事情的情况下,你想放弃最后的承诺。

来源: http://nakkaya.com/2009/09/24/git-delete-last-commit/

对于我和其他人来说,最好的选择是Git重新设置选项:

git reset --hard <commitId> && git clean -f

这对我来说是最好的选择!它是简单的,快速和有效的!


** 注意:** 如在评论中提到的,不要这样做,如果你与其他人分享你的分支,他们有旧承诺的副本。

也从评论中,如果你想要一个更少的“可爱”方法,你可以使用

git clean -i

注意:这得到了很多注意力. 它是超重要,你不这样做,如果你在一个分支,其他人从工作,也(取决于时间框架)不是一个远程,已经与大师合并。

但是,这里被问及如何取消具体的承诺,在这种情况下,它是取消过去的三个承诺,回到11月3日的承诺。

你可以用下调来做到这一点:

git rebase -i HEAD~4

这将列出你的最后四个承诺。

现在你有取消命令的选项,你用 drop 文本这样做。

只需在键盘上点击我,并在承诺旁边,您要删除写下滴,而不是默认选择在键盘上,点击输出和 :wq

要确保承诺被删除,写下:

git log

你會看到,當滴滴被移除時,你得救的行為。

要将这些变化推到您的远程分支,请写下:

git push --force

重新定位的变革和承诺

Git 的能力正如你想要的那样创作承诺,这意味着有时你需要在 git 添加中进行的更改中取消更改。

Git 不知道这些变化,因为它们从未被承诺,一旦你运行这个命令,就没有办法恢复这些变化。

最后,您可以使用 --mixed 重新设置工作树,而无需排序任何变更。

回归承诺

你可以使用 -no-commit,或者你可以使用 -n 告诉 Git 进行逆转,但停止承诺改变。

否则,您可能会通过尝试转换尚未存在的代码来混淆 Git。