Git从完全提交中检出所有文件

时间:2014-05-30 14:07:59

标签: git git-checkout

据我所知,要获取某些文件的旧版本,我需要输入:

git checkout COMMIT-HASH -- file-name.ext

但是,如果我不想从某些提交中获取所有修改过的文件?我可以输入类似的内容:

git checkout COMMIT-HASH -- *

P.S。我知道我可以手动列出文件,但如果有很多文件则不方便。

4 个答案:

答案 0 :(得分:5)

如果我理解你的要求是正确的,我认为这两个中的一个会完成这项任务:

git reset --merge <commit>

git checkout <commit> -- .

如果您的工作目录中当前存在的文件不在<commit>中,它们仍会存在,这可能会使事情变得混乱,具体取决于您要执行此操作的确切原因。获得一个只有<commit>内容的干净工作树的另一种方法是:

rm -r *
git archive --format=tar <commit> | tar xf -

就此而言,您可以在上述git resetgit checkout命令之前清空您的工作树,以及......

这些都不会实际移动你的HEAD,我认为这是你想要达到的效果......

答案 1 :(得分:1)

根本不要传递文件名。

git checkout COMMIT-HASH 

答案 2 :(得分:0)

我相信这个问题可能有用:How to list all the files in a commit?

基本上,要获取文件列表,您可以使用git diff-tree

git diff-tree --no-commit-id --name-only -r COMMIT_ID

一旦你有了,你就可以把它喂给git checkout:

git diff-tree --no-commit-id --name-only -r COMMIT_ID | \
    xargs git checkout COMMIT_ID --

因此,git diff-tree将有助于获取文件列表,xargs git checkout COMMIT_ID --将帮助将受影响的文件重置回到它们在该提交时所处的状态(您只是回滚那些特定文件)。

您可能需要在工作树的顶部执行此操作。此外,我没有尝试看到如果涉及重命名会发生什么,所以可能还有另一个边缘情况你可能需要考虑。路径名中的空格也可能是一个问题,但我没有找到一种方法来使用git diff-tree以空终止格式获取路径。在这种情况下,git diff可能会更好:

git diff --name-only -z COMMIT_ID^ COMMIT_ID | \
    xargs -0 git checkout COMMIT_ID --

另外,如果你真的想以这种方式回归并且实际上只有一个提交是问题,那么git revert可能是更好的方法。

答案 3 :(得分:0)

没有承诺的情况下如何采摘

git cherry-pick COMMIT-HASH --no-commit