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

如果我做 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 push -f ...

不仅仅是Git Push。

其他回答

这很大程度上取决于你指的是“逆转”。

暂时转换到另一个承诺

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

git checkout -b old-state 0d1d7fc32

要回到你所在的地方,只需检查你所在的分支再次(如果你做了变化,如往常交换分支时,你将不得不处理它们,你可以重新设置,把它们扔掉;你可以打破,支票,打破,把它们带到你身边;你可以承诺它们到一个分支,如果你想要一个分支在那里。

硬删除未发表的承诺

如果,另一方面,你真的想摆脱你从那时起所做的一切,有两种可能性。

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

如果你混乱,你已经扔掉了你的地方变化,但你至少可以通过重新设置回到你以前的地方。

下一篇: 与新承诺发布的承诺

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes (non inclusive of first hash):
git revert 0d1d7fc..a867b4a

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

您也可以在此情况下找到这个答案有用:我如何将头转回以前的位置?(解密头) & Undo 承诺

因为你的承诺被推远,你必须删除它们,让我假设你的分支正在发展,它被推到起源。

首先,你需要从起源中删除:

git push origin :develop (note the colon)

然后你需要发展到你想要的状态,让我假设承诺的哈希是EFGHIJK:

git reset --hard EFGHIJK

最后, push 再次发展:

git push origin develop

返回(或逆转):

1. git revert --no-commit "commit-code-to-remove" HEAD
(e.g. git revert --no-commit d57a39d HEAD)
2. git commit
3. git push

尝试上面的两个步骤,如果你发现这是你想要的,那么 git push。

如果你发现什么是错误的,做:

git revert --abort

说你在一个名为 ~/commits-to-revert.txt 的文本文件中有下列承诺(我使用 git log --pretty=oneline 来获取它们)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

创建一个Bash Shell脚本,以逆转每一个:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

这将一切转向以前的状态,包括文件和目录创建和删除,将其承诺到您的分支和您保留历史,但您将其转向相同的文件结构。


快速和直接:取决于情况,快速和污<unk>可能实际上是非常好的。 我的解决方案在这里是不要不可逆转地取代你在工作目录中的文件,从 git 存储库的深处挖掘 / 提取的文件,在你的.git / 目录下,使用敌意聪明和恶魔强大的 git 命令,其中有许多。


Git是一個辉煌的創作,但絕對沒有人能夠只是“把它放在飛機上”:也那些試圖解釋它的人,太頻繁地承擔了其他VCS(版本控制系統)的早期知識,並且太快地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地