Git检出所有来自确切提交的文件
据我所知,要得到某个文件的旧版本,我需要输入:
git checkout COMMIT-HASH -- file-name.ext
但如果我不想从一些提交获取所有修改的文件? 我可以输入如下内容:
git checkout COMMIT-HASH -- *
PS我知道我可以手动列出文件,但如果文件很多,这并不方便。
如果我明白你问的是正确的话,我认为其中的一个可以完成这项工作:
git reset --merge <commit>
要么
git checkout <commit> -- .
如果工作目录中的文件不在<commit>
,它们仍然存在,这可能会让事情混淆,具体取决于您为什么要这样做。 得到一个只有<commit>
内容的干净工作树的另一种方法是:
rm -r *
git archive --format=tar <commit> | tar xf -
对于这个问题,你可以在上面的git reset
或git checkout
命令之前清空你的工作树,以及......
这些都不会实际移动你的HEAD
,我认为这是你想要达到的效果......
只是不要传递文件名。
git checkout COMMIT-HASH
我相信这个问题可能是有用的:如何列出提交中的所有文件?
基本上,要获得文件列表,你可以使用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
可能是更好的方法。