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