据我所知,要获取某些文件的旧版本,我需要输入:
git checkout COMMIT-HASH -- file-name.ext
但是,如果我不想从某些提交中获取所有修改过的文件?我可以输入类似的内容:
git checkout COMMIT-HASH -- *
P.S。我知道我可以手动列出文件,但如果有很多文件则不方便。
答案 0 :(得分:5)
如果我理解你的要求是正确的,我认为这两个中的一个会完成这项任务:
git reset --merge <commit>
或
git checkout <commit> -- .
如果您的工作目录中当前存在的文件不在<commit>
中,它们仍会存在,这可能会使事情变得混乱,具体取决于您要执行此操作的确切原因。获得一个只有<commit>
内容的干净工作树的另一种方法是:
rm -r *
git archive --format=tar <commit> | tar xf -
就此而言,您可以在上述git reset
或git 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