我如何从我目前的状态转向在某个承诺上拍摄的截图?
如果我做 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/HEAD 并更改转向您转向的分支。
如如:
echo 'ref: refs/heads/example' > .git/HEAD
如果你做 git 状态,你应该看到你所在的分支和你想转向的分支之间的所有变化。
如果一切都看起来很好,你可以承诺. 你也可以使用 git diff revert..example 确保它是相同的。
但是,这里被问及如何取消具体的承诺,在这种情况下,它是取消过去的三个承诺,回到11月3日的承诺。
你可以用下调来做到这一点:
git rebase -i HEAD~4
这将列出你的最后四个承诺。
现在你有取消命令的选项,你用 drop 文本这样做。
只需在键盘上点击我,并在承诺旁边,您要删除写下滴,而不是默认选择在键盘上,点击输出和 :wq
要确保承诺被删除,写下:
git log
你會看到,當滴滴被移除時,你得救的行為。
要将这些变化推到您的远程分支,请写下:
git push --force
这里有很多复杂和危险的答案,但它实际上很容易:
git revert --no-commit 0766c053..HEAD
git commit
这将把一切从头转向承诺哈希,这意味着它将重现承诺状态在工作树上,就好像每一个承诺之后 0766c053 已被推回。
(没有承诺的旗帜允许Git同时转换所有承诺,否则你将被邀请为每个承诺在范围内发出一个消息,将你的历史与不必要的新承诺。
这是一个安全和容易的方式,回到以前的状态. 没有历史被摧毁,所以它可以用于已经公开的命令。
首先,什么是头?
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 也。
此分類上一篇
快速和直接:取决于情况,快速和污<unk>可能实际上是非常好的。 我的解决方案在这里是不要不可逆转地取代你在工作目录中的文件,从 git 存储库的深处挖掘 / 提取的文件,在你的.git / 目录下,使用敌意聪明和恶魔强大的 git 命令,其中有许多。
Git是一個辉煌的創作,但絕對沒有人能夠只是“把它放在飛機上”:也那些試圖解釋它的人,太頻繁地承擔了其他VCS(版本控制系統)的早期知識,並且太快地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地深入地