git checkout is not removing files that it should
使用公共回购,我想让我的主分支从过去恢复到某种承诺。我已经检查了选项,对我来说最好的是简单地签出所需的提交,然后提交到主分支。但是,当我执行签出时,它不会删除在指定的提交哈希之后添加到master中的一些文件。
因此,例如,如果我想重新提交
1 2 3 4 5 6 | $ cd working-copy-top-dir $ git checkout master $ git checkout -- . $ git clean -fd $ git checkout aaa1 . $ git clean -fd |
但此时,在
1 2 | $ git --version git version 2.7.2.windows.1 |
号
tl;dr:首先移除所有内容
当您使用
我们假设,为了论证,您从包含两个文件的
1 2 3 4 5 6 7 8 9 | $ git checkout master [output snipped] $ ls README hello $ cat README Yay, you read me! $ cat hello world $ |
。
更进一步说,commit
1 2 3 4 | $ git checkout aaa1 -- . [output snipped] $ ls README addendum hello |
(我加上了
1 2 3 | $ git status --short M README A addendum |
。
但
1 2 3 4 | $ git ls-files --stage 100644 ac6f2cf1acbe1b6f11c7be2288fbae72b982823c 0 README 100644 7ddf1d71e0209a8512fe4862b4689d6ff542bf99 0 addendum 100644 cc628ccd10742baea8241c5924df992b5c019f71 0 hello |
。
使用
您特别想让工作树匹配commit
不过,还有一种更简单的方法:把所有东西都拿走。然后,用你的
1 2 3 4 5 6 7 8 9 10 11 12 | $ git rm -rf . rm 'README' rm 'addendum' rm 'hello' $ git checkout aaa1 -- . $ git ls-files --stage 100644 ac6f2cf1acbe1b6f11c7be2288fbae72b982823c 0 README 100644 7ddf1d71e0209a8512fe4862b4689d6ff542bf99 0 addendum $ git status --short M README A addendum D hello |
您现在可以提交,并且您将对
(这是否是一个好主意完全是另一回事,但它会让你达到理想的状态。)
你想把回购回那个状态吗?或者你只是想让你的本地回购看起来像那样?
请参阅https://git-scm.com/docs/git-reset了解git reset。
案例1:如果你愿意的话
1 | git reset --hard [commit hash] |
它将使您的本地代码和本地历史就像提交时一样。但是如果你想把这个推给其他有着新历史的人,它就会失败。
案例2:如果你这样做的话
1 | git reset --soft [commit hash] |
号
它将使您的本地文件更改为原来的样子,但将您的历史记录等保持不变。
我在这里找到了答案。你也可以在这里看到相关的答案。
git stash可能是清理工作树的最快方法。然后,git checkout-b$newbranch$commit-sha1-you-want创建一个你要使用的分支。完成所有工作后,git stash会弹出来恢复工作树。
Git签出将不会删除自上次提交以来添加的文件。要做到这一点,我需要
不过,我发现
1 | git diff --name-status HEAD thehash |