我如何从我目前的状态转向在某个承诺上拍摄的截图?
如果我做 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重新设置选项:
git reset --hard <commitId> && git clean -f
这对我来说是最好的选择!它是简单的,快速和有效的!
** 注意:** 如在评论中提到的,不要这样做,如果你与其他人分享你的分支,他们有旧承诺的副本。
也从评论中,如果你想要一个更少的“可爱”方法,你可以使用
git clean -i
注意:这得到了很多注意力. 它是超重要,你不这样做,如果你在一个分支,其他人从工作,也(取决于时间框架)不是一个远程,已经与大师合并。
说你在一个名为 ~/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
这将一切转向以前的状态,包括文件和目录创建和删除,将其承诺到您的分支和您保留历史,但您将其转向相同的文件结构。
首先,什么是头?
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 reset --hard CommitId && git clean -f
这将转向本地存储库,在这里使用 git push -f 后将更新远程存储库。
git push -f
例如,如果你想完全忽略与名称的承诺执行非团体管理政策从下图
此分類上一篇
你会跑
git reset --hard dd52eb9 && git clean -f
跟随的
git push -f
接下来,你不会看到这个承诺(强制非团体管理政策)在那里
此分類上一篇