4

情况:我有一个旧的提交,我需要有选择地与最新的提交合并。有些文件没有更改,而其他文件有重大更改,我需要有选择地查看和合并。

假设旧的提交1有文件A, B, C.

最新的提交5涉及更改文件BC自提交以来还1添加了文件D和.EF

所以在提交15文件之间BC已经发生了变化,也就是diff1:B和上运行5:B;并且1:C5:C显示差异。

我需要获取文件名B并且C 只有.

也就是说,所有不属于1但更改或添加的文件5应该显示。

4

4 回答 4

2

你可以试试

git diff --diff-filter=M 1 5

可用的过滤器是

  • A: 添加
  • C: 复制
  • D: 删除
  • M: 修改的
  • R: 重命名
  • T:类型已更改(符号链接、常规文件等)
  • U: 未合并
  • X: 未知
  • B: 配对中断

有关所有详细信息,请参阅git-diff(1)手册页。

编辑

如果您对两次提交之间的更改方式感兴趣,还可以使用该选项,该选项对于每个更改的文件都会输出上述代码之一。此选项还可用于告诉您对每个提交的哪些文件进行了何种类型的更改。--name-statusgit-log

于 2013-02-21T12:10:19.927 回答
1

要仅考虑 commit 中存在的文件1,请运行

$ git ls-tree --name-only commit1 | xargs git diff commit1 commit5 --

请注意,这将包括提交 1 中存在但在提交 5 中删除的文件(这将在差异中显示为已删除的文件)。如果您想避免这种情况,请找到文件的公共子集:

$ git ls-tree --name-only commit1 > all-files-in-commit1
$ git ls-tree --name-only commit5 > all-files-in-commit5
$ comm -1 -2  all-files-in-commit1 all-files-in-commit5 > common-files
$ xargs git diff commit1 commit5 -- < common-files
于 2013-02-23T18:45:55.853 回答
0

假设,对于5您所指的“最新提交” HEAD,您也可以对您的任务使用这种不同的策略。我发现它是迄今为止最可行的:

  1. 将旧提交中的更改应用到暂存区域,无需提交 ( -n= --no-commit):

    git cherry-pick -n <commit>
    
  2. 取消暂存您刚刚所做的所有更改:

    git reset 
    
  3. 比较这些更改是什么,相对于您的上次提交:

    git diff HEAD
    
  4. 有选择地添加您想要的更改:

    git add -p
    
  5. 最后做出新的提交:

    git commit -m "commit message"
    

资料来源:改编自这个答案

于 2014-03-02T02:10:57.440 回答
0

尝试(使用 SHA15在您的示例中):

git diff 1 5 $(git diff --raw --no-commit-id --name-only -r 1~1 1)

或者更舒适,因此您只需键入每个 SHA 一次:

c1="1"; c2="5"
git diff $c1 $c2 $(git diff --raw --no-commit-id --name-only -r $c1~1 $c1)

它的工作原理:第一个 git diff 比较两个提交。第二个生成路径列表以限制比较。$c1此列表是通过比较旧提交与其父提交之间更改了哪些文件而生成的$c1~1。(这也适用于使用 指定最后十次提交之类的东西c1="HEAD~10",因为HEAD~10~1它是 git 中的有效树形,相当于HEAD~11.)

子shellgit diff --raw也用于合并提交。否则我们可以使用git diff-tree --no-commit-id --name-only -r $c1,它会自动将提交与其父级进行比较。

TODO:尚未完全正常运行。有时它有效,有时我得到“致命:不明确的参数'<文件名>':未知修订或路径不在工作树中。”

于 2014-03-02T01:25:44.453 回答