使用公共repo,我想让master分支回到过去的某个提交。我已经检查了选项,对我来说最好的事情是简单地 checkout 到所需的提交,然后提交到master分支。但是,当我 checkout 时,它不会删除一些在指定提交哈希之后添加到master分支的文件。
例如,如果我想返回到提交aaa1
:
$ cd working-copy-top-dir
$ git checkout master
$ git checkout -- .
$ git clean -fd
$ git checkout aaa1 .
$ git clean -fd
但此时,在aaa1
之后添加的一些文件仍在工作副本中。要使工作副本 data 恢复到aaa1
时的状态,checkout
命令是什么?
$ git --version
git version 2.7.2.windows.1
6条答案
按热度按时间7y4bm7vi1#
TL;DR:首先删除所有内容
当你使用
git checkout aaa1 .
时,你告诉Git把aaa1
转换成一个提交,找到那个提交(更准确地说,它的树),然后把那个提交中的每个文件复制到你的索引/暂存区和工作树。为了便于讨论,我们假设从
master
开始,其中包含两个文件README
和hello
:我们进一步假设提交
aaa1
存在并且有两个文件,README
和addendum
,它的README
表示Thank you for reading.
我们来 checkout :(我添加了
--
:这里实际上并不需要,但这是一种很好的做法。)README
的内容是更新后的README
。文件addendum
也已解压缩。文件hello
* 未 * 删除,与master
中找到的版本相比保持不变。更新后的README
和hello
将暂存:但是
hello
没有被去除:使用
git clean
,即使使用-x
,也不会有任何效果:没有东西需要清洗;没有未暂存的文件(hello
已暂存,只是未 * 修改 *)。你特别想让工作树与提交
aaa1
匹配,为了做到这一点,你必须找到现在在索引中,但不在aaa1
中的文件,并删除它们。不过,还有一种更简单的方法:然后,使用你的
git checkout aaa1 -- .
从aaa1
中提取所有的内容。这将填充aaa1
中的索引和工作树:任何需要恢复到删除前状态的文件都将恢复(恢复到aaa1
中的状态,与HEAD
中的状态 * 相同 *)。任何需要更改以匹配aaa1
中状态的文件都将恢复(恢复到aaa1
中的状态,与aaa1
中的状态 * 不同 *)。现在你可以提交了,你将在
master
上有一个新的提交,不管之前有什么,它和aaa1
有完全相同的树。(这是否是一个“好主意”完全是另一回事,但它会让你达到理想的状态。)
tuwxkamq2#
你想把你的回购协议回滚到那个状态吗?或者你只是想让你的本地回购协议看起来像那样?
git重置请参见https://git-scm.com/docs/git-reset。
**案例1:**如果您这样做
它会让你的本地代码和本地历史就像它在那个提交时一样,但是如果你想把它推给其他拥有新历史的人,它会失败。
**案例2:**如果您这样做
它将使您的本地文件更改为像他们当时,但离开您的历史等相同。
我找到了答案here。您还可以看到相关的答案here。
zzwlnbp83#
Git checkout will not remove files added since a previous commit .要完成这个操作,我需要
git revert
。但是,我发现
git checkout thehash .
更易于使用,并且不难看出自该散列之后添加了哪些文件:oug3syen4#
我发现这个命令同时更新了我想要的提交的索引和工作副本,在本例中由变量
treeish
给出:要更新工作副本而不更新索引,您可能需要执行以下操作:
js4nwp545#
(开发工具2.22.0,2019年6月)**
运行此选项时:
删除所有在
<commit>
之后添加到<directory>
下的文件。我希望这是默认行为,但这就是生活。选项是added by Thomas Gummerer at 091e04bc8cbb0c89c8112c4784f02a44decc257e,它进入了git
v2.22.0
。试验:
结果:
输出:
所以我们看到
b/b
只会被--no-overlay
删除,目录b
也会像往常一样被git命令删除,因为git命令会让它变成空目录。在Ubuntu 22.10和Git 2.37.2上测试。
5n0oy7gb6#