如何在git分支之间找到更改的公共文件?

时间:2009-06-24 14:03:34

标签: git

我有一个带有一些更改的上游存储库。我有本地更改,我想改变上游的变化。我想知道我在本地更改的文件也改变了上游,所以我可以检查任何自动合并。或者,我想在rebase期间手动执行任何合并。

4 个答案:

答案 0 :(得分:12)

列出已更改的文件

由于rebase / merge可能非常耗时,因此最好避免做一个不必要的事情。根据您需要的信息,有多种方法可以查看已更改的内容。

如果您有兴趣知道每次提交哪些文件已更改,我建议git-log

git log [--pretty=<format>] --name-only <common-branch>..<local-branch>

您可以使用--pretty选项获取所需的标题信息; <format>可以有多种选择,包括带字段的自定义字符串 - 有关详细信息,请参阅手册页。

--name-only选项实际上已传递给git-diff,因此如果您不关心每次提交结果,您可以直接访问源代码:

git diff --name-only <common-branch> <local-branch>

请注意,两个命令的分支指定方式不同。

您也可以将其应用于上游更改,将<local-branch>更改为<upstream-branch>,最后会有两个文件列表。我会告诉你如何比较它们,虽然grep的-f选项可以很方便...

手动合并

专制统治打败了我。如果您已根据git-log的输出进行了一些智能处理,则只能编辑您看到的重叠文件更改的提交。如果您要合并而不是重新定位,则可以使用--no-commit选项。

另请参阅git-merge手册页的配置部分。您可能希望将merge.conflictstyle设置为diff3,以便您可以查看原始文本以及任何一方的更改。

如果你真的绝望地压制所有自动解决冲突的尝试,我相信你可以插入一个虚拟的合并工具(通过merge.tool和mergetool.cmd),什么也不做,然后返回失败。

说完所有这些之后,我还应该说,根据我对git merge的经验,我看到了很多冲突但是不记得一次不正确的自动合并。我个人相信它的合并能力。之后检查它应该是充足的。

答案 1 :(得分:4)

扩展了一下:对于你的第一部分问题,建立一个新的分支,自动在那里进行rebase,然后与你的工作副本进行比较。

git branch workBranch
git commit #throw your locals into your own branch for a brief moment
git branch testBranch
git rebase otherBranch
git diff workBranch

你可能也只是做了一个“git diff origin / branchToMerge”

对于互动部分:

git rebase --interactive.

将所有提交设置为“编辑”,您将逐个完成每个提交,让您有机会查看该提交的所有内容并编辑您的内容。

编辑回复评论

好的,为了严格查看已更改的文件,请执行以下操作:

git log a0a0a0..b1b1b1 --name-only --pretty=oneline | egrep -v '^[a-f0-9]{40} ' | sort | uniq > lista
git log a0a0a0..c2c2c2 --name-only --pretty=oneline | egrep -v '^[a-f0-9]{40} ' | sort | uniq > listb
cat lista listb | sort | uniq -d

这个shell kludgery只显示两个日志中都有变化的文件。对于a0a0a0,请使用您的共同点。用两个发散分支的尖端替换b1 / c2弦。

答案 2 :(得分:1)

我知道这是一个非常古老的主题,但我们发现git diff --name-only只返回了太多误报修改过的文件,如果这两个分支太差了。 以下是我们在工作中使用的功能,用于针对我们的功能分支执行新分支的提交的审阅代码(可能已在功能分支中部分合并)。

在我们的new_branch和* nix系统中,我们使用此命令:

git show --name-only $( git cherry -v feature_branch | grep '^+' | awk '{ print($2) }' ) | egrep -v '^(commit |Author:|Date:|\s|$)' | sort -u

将feature_branch替换为您想要检查已修改文件的分支的名称。

这种技术的优点在于它实际上只对通过属于您的分支的提交修改的文件进行排序,并且这些文件尚未在您的feature_branch中合并。

如果你想在两个提交SHA1和SHA2之间进行检查,你也可以这样做:

git show --name-only $( git cherry -v SHA1 SHA2 | grep '^+' | awk '{ print($2) }' ) | egrep -v '^(commit |Author:|Date:|\s|$)' | sort -u

答案 3 :(得分:0)

这将列出最常更改的分支的前20个文件

git log --pretty = format: - name-only |排序| uniq -c | sort -rg |头-20 -