ChatGPT解决这个技术问题 Extra ChatGPT

显示哪些文件在两个修订版之间发生了更改

我想合并两个已经分开一段时间的分支,想知道哪些文件被修改了。

遇到了这个链接:http://linux.yyz.us/git-howto.html,它非常有用。

我遇到的比较分支的工具是:

git diff master..分支

git log master..branch

git shortlog master..branch

想知道是否有类似“git status master..branch”的东西只能看到两个分支之间不同的文件。

在不创建新工具的情况下,我认为这是您现在可以做到的最接近的方法(如果文件被多次修改,这当然会显示重复):

git diff master..branch | grep "^diff"

想知道我是否错过了什么......

有多少人认为这个问题的标题具有误导性?它实际上是关于查找两个分支之间的文件差异。我来这里寻找的是如何查看同一分支上两个修订版之间的文件差异。还是只有我一个?
@SandeepanNath:与 git 没有区别。您总是指个人提交。
@SamuelO'Malley 我是 git 新手,考虑到看似常见的分支策略,其中所有分支最终都合并到主分支,最终主分支被推出。现在,考虑推出的事件,其中生产已经在主,但在提示之后(如果最后一次推出发生在最后一次主合并之后,则通过一个修订),我想看看这两个修订之间的差异,以找出将推出的内容。我不想查看上次合并的分支。如果我错了,请纠正我。
@SandeepanNath:您可以选择下面的答案,而不是使用分支名称,而只需指定提交 ID。或者,如果您在推出时创建标签,甚至可以通过标签名称引用提交。
@SandeepanNath 您不能比较 2 个分支,您必须指定修订版。所以比较 2 个分支就是比较 2 个版本。

N
Natim

要将当前分支与 main 分支进行比较:

$ git diff --name-status main

比较任意两个分支:

$ git diff --name-status firstbranch..yourBranchName

official documentation 中有更多 git diff 选项(特别是 --name-status 选项)。


左侧的每个索引是什么意思(我看到很多 M 和 D)?
@user446936 - 您可以在 git status 手册页 @ kernel.org/pub/software/scm/git/docs/git-status.html 中看到这些字母的含义 - 特别是 M == 已修改,D == 已删除
git diff --name-status your_branch...master 输出自创建 your_branch 以来在 master 上发生的更改
双点运算符在这里是多余的,因为差异是成对的。
我得到未知的修订或路径不在工作树中。
G
Gerry

尝试

$ git diff --stat --color master..branchName

这将为您提供有关每次更改的更多信息,同时仍使用相同数量的行。

如果您要以另一种方式合并,您还可以翻转分支以获得更清晰的差异图片:

$ git diff --stat --color branchName..master

如果您(强烈推荐,恕我直言)打开了 git color (config --global color.ui true),则可以跳过 --color。 (我有 lks - 懒惰键盘综合症。)
我和你一起上色!顺便说一句,我的意思是说 git config --global color.ui true - 是完整的。
不起作用,抛出错误:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
@TomášZato 抱歉,但您需要将“branchName”与您的分支名称交换。
E
Eric Anderson

还要记住,git 具有便宜且易于分支的功能。如果我认为合并可能有问题,我会为合并创建一个分支。因此,如果 master 有我想要合并的更改,并且 ba 是我需要来自 master 的代码的分支,我可能会执行以下操作:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

最终结果是,我必须先在一次性分支上尝试合并,然后再拧上我的分支。如果我搞砸了,我可以删除 ba-merge 分支并重新开始。


惊人的。我从来没有想过那样分支。我认为这应该被视为合并时“最佳实践”的一部分。
当您将 ba-marge 合并回 ba 时,是否有可能再次解决冲突?
@EricAnderson 是的,这是一个图表。 SVN 像口香糖一样粘在课桌下。谢谢。
如果 ba-merge 已经有了 master,为什么还需要执行最后一步 'git merge master'
@EricAnderson 如果合并期间出现故障,为什么需要丢弃分支?只是取消合并更改就足够了吗?像,git reset --hard; git clean -fd
P
Paulino III

如果有人试图从两个分支生成差异文件:

git diff master..otherbranch > myDiffFile.diff

这已经派上用场了,尤其是对于包含很多差异的大型分支。
当差异非常大时,这很有用。默认情况下,它不会在控制台中显示所有差异(我想知道为什么),在这种情况下将差异传递给文件是要走的路。
t
the Tin Man

还有一种基于 GUI 的方法。

你可以使用 gitk。

运行: $ gitk --all 右键单击某个分支的提交,然后在弹出菜单中选择标记此提交。右键单击另一个分支的提交,然后选择区分这个 -> 标记的提交或区分标记的提交 -> 这个。

然后在右下面板中将有一个更改的文件列表,在左下面板中将有差异详细信息。


@Orwellophile 我上传了一个 video 来展示如何做到这一点。我希望它对你有帮助。
哇,就我而言,我觉得很特别。我已经在delicious.com 中添加了书签以供将来参考和额外的google-foo。
被严重低估的答案。谢谢!
r
rsilva4

另一种选择,在这种情况下使用融合:

git difftool -d master otherbranch

这不仅允许查看文件之间的差异,还提供了一种简单的方法来指向和单击特定文件。


可能想将 meld 设置为默认 difftool: git config --global diff.tool meld
这是我最喜欢的,因为它将使用您配置的任何 difftool。
在 OSX 上不支持。 :-(
@迈克。请查看此答案stackoverflow.com/a/12815806/151918,其中包含 OSX 的说明。它至少对我有用,希望它有帮助。
谢谢!一直在搜索,这个命令可以很容易地看到 2 个分支之间的差异。
D
David Plumpton

请注意,如果您不喜欢结果,git 可以很容易地尝试合并并避免出现任何问题。这可能比提前寻找潜在问题更容易。


大卫,这是一个很好的观点,尽管事先知道发生了什么会很好......
B
Brad Koch

如果您只在某些文件中寻找更改,那么:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 是可选的,如果没有提供 branch1,将默认考虑您当前的分支(您所在的分支)。例如:

git diff master -- controller/index.js

A
Alex Brown

在协作工作或同时处理多个功能时,上游甚至您的 master 包含未包含在您的分支中的工作,并且会错误地出现在基本差异中,这是很常见的。

如果您的上游可能已经移动,您应该这样做:

git fetch
git diff origin/master...

仅使用 git diff master 可以包含或不包含相关更改。


W
Wim Deblauwe

如果您使用 IntelliJ IDEA,您还可以将任何分支与您当前的工作分支进行比较。有关详细信息,请参阅 http://www.jetbrains.com/idea/webhelp/merging-deleting-and-comparing-branches.html#d288093e3827。这在 free edition 中也可用。


s
selftaught91

有两个分支可以说

A(您正在工作的分支)

B(您要与之比较的另一个分支)

在分支 A 中,您可以输入

git diff --color B

那么这会给你一个输出

https://i.stack.imgur.com/Xn3Pb.png

关于这一点的重要一点是

绿色文本存在于分支 A 中 红色文本存在于分支 B


V
Vim Diesel

这里有很多答案,但我想添加一些我常用的东西。如果您在要比较的分支之一,我通常会执行以下操作之一。为了这个答案,我们会说我们在我们的二级分支中。取决于您当时需要的视图取决于您选择的视图,但大多数时候我使用的是两者中的第二个选项。如果您要恢复到原始副本,第一个选项可能会很方便 - 无论哪种方式,都可以完成工作!

这会将 master 与我们所在的分支(次要)进行比较,原始代码将是添加的行,新代码将被视为删除的行

git diff ..master

或者

这也会将 master 与我们所在的分支(次要)进行比较,原始代码将是旧行,新代码将是新行

git diff master..

V
Valy Dia

https://i.stack.imgur.com/D4mWv.png

差异将显示在 github 界面中的 url /compare/{x1}...{x2} 处,其中 x2x1 是您要比较的分支/提交/标记,例如:https://github.com/http4s/http4s/compare/main...dotty

您可以在 Github Doc 中查看更多信息。


非常感谢。一直在努力寻找这个。
k
kerner1000

对于正在寻找 GUI 解决方案的人,Git Cola 有一个非常不错的“Branch Diff Viewer (Diff -> Branches..)。


R
Robert
git diff revision_n revision_m

如果 revision_nrevision_m 是连续提交,则输出与 git show revision_m 相同


非常适合我的用例。我只需要文件名,所以我使用 --name-only 来获取已更改文件的列表。 git diff --name-only rev_old rev_new
s
sonny

您也可以使用 visual diff

例如,如果您使用 Sourcetree,则只需 select any two commits in log view

(我个人更喜欢在大多数情况下使用 GUI,我将这个发布给那些可能不熟悉 GUI 选项的人。)


M
Marius Matioc

如果您喜欢 GUI 并使用 Windows,这里有一个简单的方法。

下载 WinMerge 将两个分支签出到不同的文件夹中 使用 WinMerge 逐个文件夹进行比较。如果其中一个分支是您正在处理的分支,您也可以轻松地进行修改。


这不是最简单的方法,实际上不需要下载 repos 来区分分支。
这确实不是最简单的方法,但它是 GUI 方式,这通常更容易,尤其是在查看所有文件中的差异时
P
Piotr

您还可以使用 TortoiseGit 轻松比较已更改文件的分支。只需单击 Browse References 并选择要比较的分支。

例如,如果您将您的分支与 master 进行比较,您将得到一个文件列表,如果您决定将您的分支合并到 master 中,这些文件将在 master 中更改。

请记住,如果将 master 与 your-branch 以及 your-branch 与 master 进行比较,您将得到不同的结果。


问题似乎与本机 git 实用程序有关