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

如果我做 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?


当前回答

首先,什么是头?

HEAD 仅仅是指当前的承诺(后者)在当前的分支上,在任何时间(不包括 git 工作)只能有一个 HEAD。


脱头头

如果你不是最近的承诺 - 意思是,头指的是历史上以前的承诺,它被称为分开的头。

此分類上一篇

此分類上一篇



去支票

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

在此点上,您可以创建一个分支,并从此开始工作:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog 将显示任何更改,更新了 HEAD 并检查所需的 reflog 输入将设置 HEAD 返回此承诺。

git reflog
git checkout HEAD@{...}


“移动”你的头回到所需的承诺。

# 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.

注意: (由于 Git 2.7) 你也可以使用 git rebase --no-autostash 也。


此分類上一篇

其他回答

还有另一个最简单的解决方案;你必须改变分支来做到这一点,但后来你只能运行:

git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

这里有很多复杂和危险的答案,但它实际上很容易:

git revert --no-commit 0766c053..HEAD
git commit

这将把一切从头转向承诺哈希,这意味着它将重现承诺状态在工作树上,就好像每一个承诺之后 0766c053 已被推回。

(没有承诺的旗帜允许Git同时转换所有承诺,否则你将被邀请为每个承诺在范围内发出一个消息,将你的历史与不必要的新承诺。

这是一个安全和容易的方式,回到以前的状态. 没有历史被摧毁,所以它可以用于已经公开的命令。

Rogue 编码器?

工作自己,只是想要它工作吗? 遵循下面的指示,他们已经为我和许多其他人工作了多年。

阅读下面的评论,考虑其他答案,并与你的团队讨论,在你做一些漏洞之前。

将工作复制转换为最新的承诺

要转向以前的承诺,忽略任何变化:

git reset --hard HEAD

在哪里,头部是您当前分支的最后承诺

将工作副本转换为老年委托

要转向比最近的承诺更古老的承诺:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

# Push your changes to respective branch
git push -f

信用去一个类似的 Stack Overflow 问题,转向一个承诺由一个 SHA hash 在 Git?.

注意! 这个命令可能会导致失去承诺历史,如果用户错误地把错误的承诺。

我有一个类似的问题,我想回到以前的承诺,在我的情况下,我不感兴趣保持新的承诺,所以我使用了硬。

这就是我这样做的:

git reset --hard CommitId && git clean -f

这将转向本地存储库,在这里使用 git push -f 后将更新远程存储库。

git push -f

例如,如果你想完全忽略与名称的承诺执行非团体管理政策从下图

此分類上一篇

你会跑

git reset --hard dd52eb9 && git clean -f

跟随的

git push -f

接下来,你不会看到这个承诺(强制非团体管理政策)在那里

此分類上一篇

首先,什么是头?

HEAD 仅仅是指当前的承诺(后者)在当前的分支上,在任何时间(不包括 git 工作)只能有一个 HEAD。


脱头头

如果你不是最近的承诺 - 意思是,头指的是历史上以前的承诺,它被称为分开的头。

此分類上一篇

此分類上一篇



去支票

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

在此点上,您可以创建一个分支,并从此开始工作:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog 将显示任何更改,更新了 HEAD 并检查所需的 reflog 输入将设置 HEAD 返回此承诺。

git reflog
git checkout HEAD@{...}


“移动”你的头回到所需的承诺。

# 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.

注意: (由于 Git 2.7) 你也可以使用 git rebase --no-autostash 也。


此分類上一篇