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 resetgit 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可能是更好的方法。

链接地址: http://www.djcxy.com/p/26653.html

上一篇: Git checkout all files from exact commit

下一篇: How to get the file list for a commit with JGit