从Git中导出多个提交的修改文件

10 浏览
0 Comments

从Git中导出多个提交的修改文件

和这个问题非常类似:在Git中仅导出已修改和已添加的文件及其文件夹结构

给出的答案似乎只输出给定提交($commit_id)中更改的文件:

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id

我想获取在commit1和commit2之间被修改的文件列表...这可行吗?

0
0 Comments

问题的原因是需要从多个提交中导出修改后的文件,但是在使用git diff命令时只返回最近提交的文件列表,无论命令中的提交顺序如何。解决方法是在较早的提交后加上^字符来指示使用其父提交作为比较的起点。

可以使用commit ID来导出修改后的文件。例如:

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT 218d182e 3ef44d29d

如果要包括提交3ef44d29d的更改,则需要指定它的父提交,可以使用ID或者3ef44d29d^

以下是我的一个项目的示例。从历史记录中向后推进,我有以下提交:

1a443
fb4ae
88226
c46ba

使用各种命令我得到以下输出:

$ git diff-tree -r --name-only 1a443
1a443831fa9f797fedb397e900bd3d45e2093ea6
public/customers.en.html
$ git diff-tree -r --name-only fb4ae
fb4ae4af0ac473b8547ec1717d4b4172c0d634f4
public/checkout.en.html
$ git diff-tree -r --name-only 88226
88226fec6f1082b1dffd266d3e1bd0dc38cca520
public/finish.en.html
$ git diff-tree -r --name-only c46bac
c46bacddee7785599c2f026f53cd93357e8ad30d
public/index.php

我可以轻松地获取c46bac1a443之间的所有更改:

$ git diff-tree -r --name-only c46bac 1a443
public/checkout.en.html
public/customers.en.html
public/finish.en.html

但是请注意,它没有包括提交c46bac中对public/index.php的更改。我们真正想要的是使用该提交的父提交作为比较的起点。

$ git diff-tree -r --name-only c46bac^ 1a443
public/checkout.en.html
public/customers.en.html
public/finish.en.html
public/index.php

看起来它只返回最近提交的文件,无论命令中的顺序如何。

你的两个提交之间有多远?如果一个提交只是另一个提交的父提交,那么你得到的答案是正确的。但是如果这两个提交之间的距离更远...我会进行一些实验。

它们是相邻的。我验证了当我单独使用每个提交ID时,会得到不同的文件列表。

在较早的提交后面加上^字符来指示使用其父提交。

0
0 Comments

Git 是一个分布式版本控制系统,被广泛用于软件开发中。在使用 Git 进行版本控制时,有时我们需要从多个提交中导出修改过的文件。

出现的原因:

- 在团队协作中,可能会有多个人对同一个代码库进行修改。为了确保代码的质量和稳定性,我们需要将这些修改过的文件导出,并进行测试和审查。

- 在开发过程中,我们可能需要将某些特定的修改过的文件导出,以便在另一个项目中使用。

解决方法:

1. 首先,我们需要确定要导出的两个提交,假设为 commit1 和 commit2。可以通过以下命令来查看提交的历史记录:git log

2. 使用以下命令来导出这两个提交之间修改过的文件:git diff --name-only commit1..commit2

3. 这将返回一个包含文件路径的列表。可以将这些文件复制到另一个目录中,或者使用其他操作进行进一步处理。

通过以上步骤,我们可以轻松地从多个提交中导出修改过的文件,以满足我们的需求。这为团队协作和代码复用提供了便利。

0