我有一个脚本在一个分支中运行良好,但在另一个分支中被破坏。我想并排查看这两个版本,看看有什么不同。有没有办法做到这一点?
需要明确的是,我不是在寻找比较工具(我使用Beyond Compare)。我正在寻找一个 Git diff 命令,它允许我将主版本与我当前的分支版本进行比较,以查看发生了什么变化。我不在合并或任何事情的中间。我只想说类似
git diff mybranch/myfile.cs master/myfile.cs
我有一个脚本在一个分支中运行良好,但在另一个分支中被破坏。我想并排查看这两个版本,看看有什么不同。有没有办法做到这一点?
需要明确的是,我不是在寻找比较工具(我使用Beyond Compare)。我正在寻找一个 Git diff 命令,它允许我将主版本与我当前的分支版本进行比较,以查看发生了什么变化。我不在合并或任何事情的中间。我只想说类似
git diff mybranch/myfile.cs master/myfile.cs
git diff
可以向您展示两次提交之间的区别:
git diff mybranch master -- myfile.cs
或者,等效地:
git diff mybranch..master -- myfile.cs
请注意,您必须指定文件的相对路径。所以如果文件在 src 目录中,你会说src/myfile.cs
而不是myfile.cs
.
使用后一种语法,如果任何一方都HEAD
可以省略(例如,与master..
比较)。master
HEAD
您可能还对mybranch...master
(来自git diff
文档)感兴趣:
此表单用于查看包含和直到第二个的分支上的更改
<commit>
,从两者的共同祖先开始<commit>
。git diff A...B
相当于git diff $(git-merge-base A B) B
。
换句话说,这将给出变化的差异,master
因为它偏离了mybranch
(但从那时起没有新的变化mybranch
)。
在所有情况下,--
文件名前的分隔符都表示命令行标志的结束。这是可选的,除非如果参数指的是提交或文件,Git 会感到困惑,但包含它并不是一个坏习惯。有关一些示例,请参阅Dietrich Epp对“Git checkout double dashes 的含义”的回答。
git difftool
如果您配置了一个参数,则可以传递相同的参数。
你可以这样做:
git diff branch1:path/to/file branch2:path/to/file
如果您配置了 difftool,那么您还可以:
git difftool branch1:path/to/file branch2:path/to/file
更现代的语法:
git diff ..master path/to/file
双点前缀表示“从当前工作目录到”。你也可以说:
master..
,即与上述相反。这与master
.mybranch..master
,显式引用当前工作树以外的状态。v2.0.1..master
,即引用标签。[refspec]..[refspec]
,基本上任何可识别为 Git 的代码状态的东西。有很多方法可以比较来自两个不同分支的文件:
选项 1:如果要将文件从 n 个特定分支与另一个特定分支进行比较:
git diff branch1name branch2name path/to/file
例子:
git diff mybranch/myfile.cs mysecondbranch/myfile.cs
在此示例中,您将“mybranch”分支中的文件与“mysecondbranch”分支中的文件进行比较。
选项2:简单的方法:
git diff branch1:file branch2:file
例子:
git diff mybranch:myfile.cs mysecondbranch:myfile.cs
此示例类似于选项 1。
选项 3:如果要将当前工作目录与某个分支进行比较:
git diff ..someBranch path/to/file
例子:
git diff ..master myfile.cs
在此示例中,您将实际分支中的文件与主分支中的文件进行比较。
如果你想对当前分支进行比较,你可以提交它并使用:
git diff $BRANCH -- path/to/file
这样,它将从当前分支与引用分支 ( $BRANCH
) 进行区分。
我只是做git diff branch1 branch2 path/to/file
这将检查文件之间的差异。更改branch1
将显示为红色。更改branch2
将显示为绿色。
假设这branch1
是过去,branch2
也是未来。您可以通过反转 diff 中分支的顺序来反转这一点:git diff branch2 branch1
我同意dahlbyk 的回答。如果您希望将差异写入差异文件以进行代码审查,请使用以下命令。
git diff branch master -- filepath/filename.extension > filename.diff --cached
比较文件有两种情况:
场景 1:比较远程分支的文件(两个分支都应该存在于远程存储库中)
场景 2:将本地文件(在本地工作区副本中)与远程存储库中的文件进行比较。
逻辑很简单。如果您提供两个分支名称来 diff,它将始终比较远程分支,如果您只提供一个分支名称,它将始终将您的本地工作副本与远程存储库(您提供的那个)进行比较。您可以使用 range 来提供远程存储库。
例如,检查一个分支:
git checkout branch1
git diff branch2 [filename]
在这种情况下,如果您提供filename,它会将您的本地文件名副本与名为“ branch2 ”的远程分支进行比较。
git diff branch1 branch2 [filename]
在这种情况下,它将比较名为“ branch1 ”与“ branch2 ”的远程分支的文件名
git diff ..branch2 [filename]
在这种情况下,它还将比较名为“ branch1 ”与“ branch2 ”的远程分支的文件名。所以,和上面一样。但是,如果您刚刚从另一个分支创建了一个分支,比如说“master”并且您当前的分支在远程存储库中不存在,它将比较远程“ master ”与远程“ branch2 ”。
对于 Visual Studio Code,我强烈建议扩展:
Git 历史差异 文档
您可以使用它在文件甚至分支之间进行两个比较!
从控制台,您可以简单地使用以下命令:
git diff <Your_Branch> <Branch_To_Compare_With> -- myfile.cs
就我而言,我使用以下命令:
git diff <branch name> -- <path + file name>
该命令可以帮助您比较两个不同分支中的同一个文件。
像这样使用提交哈希:
git diff <hash1> <hash2> <filename>
其中hash1可以是来自任何分支的任何提交,对于hash2 也是如此。
最好的方法是通过git diff
以下方式使用:
git diff <source_branch> <target_branch> -- file_path
它将检查这些分支中文件之间的差异。查看这篇文章,了解有关Git 命令及其工作方式的更多信息。
关于这些不同的比较方法还有一个有趣的点:我想将我当前分支中的一个文件与另一个分支中的相同文件进行比较。如果我使用
git difftool otherbranch.. filespec
我最终比较了实际上在我的临时文件夹中的两个文件。但是,如果我使用
git difftool otherbranch filespec
我最终将我的临时文件夹中的文件(otherbranch上的版本)与我的 Git 文件夹中的实际文件进行比较,这 a) 更容易分辨哪个是哪个,并且 b) 意味着我可以使用 diff 工具(Beyond在我的情况下比较 4)将更改从我的另一个分支复制到我当前的分支。
为了比较Git Bash中的两个文件,您需要使用以下命令:
git diff <Branch name>..master -- Filename.extension
此命令将显示 Bash 本身中两个文件之间的差异。