我如何从我目前的状态转向在某个承诺上拍摄的截图?
如果我做 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 revert --no-commit 0766c053..HEAD
git commit
这将把一切从头转向承诺哈希,这意味着它将重现承诺状态在工作树上,就好像每一个承诺之后 0766c053 已被推回。
(没有承诺的旗帜允许Git同时转换所有承诺,否则你将被邀请为每个承诺在范围内发出一个消息,将你的历史与不必要的新承诺。
这是一个安全和容易的方式,回到以前的状态. 没有历史被摧毁,所以它可以用于已经公开的命令。
我已经尝试了很多方式来逆转Git的本地变化,如果你只是想逆转到最近的承诺状态,这似乎是最好的。
git add . && git checkout master -f
简短的描述:
它不会创建任何命令,因为 git revert 做. 它不会分开你的头像 git checkout <commithashcode> 做. 它将超越所有的本地变更,并删除所有的添加文件,因为最后的命令在分支。
我找到了一个更方便和简单的方式来实现上面的结果:
git add . && git reset --hard HEAD
HEAD 指向您当前分支的最新承诺。
它与 boulder_ruby 提出的代码相同,但我添加了 git add. 之前 git reset --hard HEAD 删除所有新的文件创建自最后的承诺,因为这是大多数人期望我相信,当转向最新承诺时。
说你在一个名为 ~/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
这将一切转向以前的状态,包括文件和目录创建和删除,将其承诺到您的分支和您保留历史,但您将其转向相同的文件结构。
注意! 这个命令可能会导致失去承诺历史,如果用户错误地把错误的承诺。
我有一个类似的问题,我想回到以前的承诺,在我的情况下,我不感兴趣保持新的承诺,所以我使用了硬。
这就是我这样做的:
git reset --hard CommitId && git clean -f
这将转向本地存储库,在这里使用 git push -f 后将更新远程存储库。
git push -f
例如,如果你想完全忽略与名称的承诺执行非团体管理政策从下图
此分類上一篇
你会跑
git reset --hard dd52eb9 && git clean -f
跟随的
git push -f
接下来,你不会看到这个承诺(强制非团体管理政策)在那里
此分類上一篇
好吧,回到以前的承诺在Git是相当容易的......
返回,不遵守变更:
git reset --hard <commit>
返回,保持变更:
git reset --soft <commit>
解释:使用 git 重新设置,您可以重新设置到一个特定的状态。
但当你看到区别是使用两个旗帜 - 软和 - 硬,通过默认 git 重新设置使用 - 软旗,但这是一个很好的做法,总是使用旗帜,我解释每个旗帜:
软
默认旗帜如所述,不需要提供它,不改变工作树,但它添加了所有更改的文件准备承诺,所以你回到承诺状态,这些变更到文件失踪。
硬
要小心这个旗帜,它恢复了工作树和跟踪的文件的所有变化,一切都将消失!
我还创建了下面的图像,这可能发生在与Git合作的现实生活中:
此分類上一篇