使用Git将两次提交之间的不同文件复制到特定文件夹

spi*_*ula 6 git

我试图弄清楚如何从给定提交中修改的Git存储库中获取文件.我想将'delta'存储在一个单独的文件夹中.我对Git很新,所以这可能是一个相对基本的问题,但仍然......

我以为我应该先在版本中获取存储库:

git reset --hard a02ea0d
Run Code Online (Sandbox Code Playgroud)

然后列出提交的内容:

git show --pretty="" --name-only a02ea0d
Run Code Online (Sandbox Code Playgroud)

但那又怎样?我可以将这个连接在一起以获得一些额外的文件夹,结果只是版本中的实际文件?

Bee*_*Bee 5

解决方案

git checkout <SHA of old commit>
git diff --name-only <SHA of old commit> <SHA of newer commit> | xargs git checkout-index -f --prefix='C:\changes\'
Run Code Online (Sandbox Code Playgroud)

解释

git checkout <SHA of old commit>将导致以下内容git checkout-index从旧提交中复制文件。

git diff --name-only <SHA of old commit> <SHA of newer commit> 将返回在旧提交和新提交之间更改的所有文件的列表。

xargs git checkout-index -f --prefix='C:\changes\'将获取第一个命令返回的所有文件(通过使用管道),并将使用每一行作为以下git checkout-index命令的参数。

例子

本示例中使用的环境是使用 Git Bash 运行 Windows 10 的机器。

  • git init 在某个文件夹内
  • 创建两个文件
    • file1.txt 包含 abc
    • file2.txt 包含 cba
  • git add之后,将所有的文件git commit他们
  • 更改 file1.txt 和 file2.txt
    • file1.txt 包含 abcabc
    • file2.txt 包含 cbacba
  • git add之后,将所有的文件git commit他们
  • git log 并找到第一次和第二次提交的 SHA1
  • 应用我上面提供的解决方案

命令中指定的文件夹现在将包含在两个提供的提交之间更改的所有文件,如下所示。

  • file1.txt 包含 abc
  • file2.txt 包含 cba