我有一个脚本在一个分支中工作正常,在另一个分支中被破坏。我想并排看两个版本,看看有什么不同。有没有办法做到这一点?
要清楚我不是在寻找比较工具(我使用Beyond Compare)。我正在寻找一个git diff命令,它允许我将主版本与我当前的分支版本进行比较,看看有什么变化。我不是在合并或任何事情的中间。我只想说点什么
git diff mybranch/myfile.cs master/myfile.cs
答案 0 :(得分:1874)
git diff
可以显示两次提交之间的区别:
git diff mybranch master -- myfile.cs
或等同地:
git diff mybranch..master -- myfile.cs
使用后一种语法,如果任何一方HEAD
,则可以省略(例如master..
将master
与HEAD
进行比较。
您可能也对mybranch...master
(来自git diff
docs)感兴趣:
此表单用于查看包含和最多第二个
<commit>
的分支上的更改,从<commit>
的共同祖先开始。git diff A...B
相当于git diff $(git-merge-base A B) B
。
换句话说,这会在master
中产生一系列变化,因为它与mybranch
不同(但mybranch
之后没有新的更改)。
在所有情况下,文件名前面的--
分隔符表示命令行标志的结束。这是可选的,除非Git在参数引用提交或文件时会感到困惑,但包括它不是一个坏习惯。有关示例,请参阅https://stackoverflow.com/a/13321491/54249。
如果配置了一个参数,可以将相同的参数传递给git difftool
。
答案 1 :(得分:357)
你可以这样做:
git diff branch1:file branch2:file
如果您配置了difftool,那么您还可以:
git difftool branch1:file branch2:file
相关问题: How do I view git diff output with visual diff program
答案 2 :(得分:142)
更现代的语法:
git diff ..master path/to/file
双点前缀表示&#34;从当前工作目录到&#34;。你也可以说:
master..
,即与上述相反。这与master
相同。mybranch..master
,明确引用当前工作树以外的状态。v2.0.1..master
,即引用标记。[refspec]..[refspec]
,基本上可以识别为git的代码状态。答案 3 :(得分:19)
有很多方法可以比较来自两个不同分支的文件:
选项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
在此示例中,您将比较实际分支中的文件 主分支中的文件。
答案 4 :(得分:9)
我只是做git diff branch1 branch2 path/to/file
检查文件之间的差异。 branch1
中的更改将显示为红色。 branch2
中的更改将为绿色。
假设branch1
是过去而branch2
是未来。您可以通过反转diff中git diff branch2 branch1
答案 5 :(得分:4)
同意@dahlbyk建议的答案。如果要将diff写入diff文件以进行代码审查,请使用以下命令。
git diff branch master -- filepath/filename.extension > filename.diff --cached
答案 6 :(得分:2)
对于我来说,我使用以下命令:
git diff <branch name> -- <path + file name>
此命令可以帮助您比较两个不同分支中的相同文件
答案 7 :(得分:2)
如果要与当前分支进行差异化,可以省略并使用:
git diff BRANCH -- path/to/file
这样,它将从当前分支向引用分支(BRANCH)扩散。
答案 8 :(得分:0)
为了比较git bash中的两个文件,您需要使用命令:
git diff <Branch name>..master -- Filename.extension
此命令将显示bash本身中两个文件之间的区别。
答案 9 :(得分:0)
最好的方法是通过以下方式使用let items = [ 100, 200, 300, 50, 100, 200, 300, 250 ];
const timeline = document.createElement('ul');
// maybe better do this by adding class and external stylesheet
timeline.setAttribute('style', 'padding: 15px; border: 1px solid gray; list-style-type: none; height: 500px; width: 100%; position: absolute; top: 0;overflow-y: scroll;')
document.body.appendChild(timeline);
let render = function(item) {
return new Promise(function (resolve) {
// run something (in) expensive with item now.
const li = document.createElement('li');
// again, better do this with class.
li.setAttribute('style', `display: inline-block; width: 25px; margin: 5px; background-color: #c1c1c1; height: ${item}px;`);
timeline.appendChild(li);
li.scrollIntoView();
// return when done.
resolve();
});
}
const player = new TelemetryPlayer(items, render, 1500);
// now you can do things like speed up etc.
// now you can do things like speed up etc.
function speedUp() {
// speedup 3 seconds after "playback" starts.
return new Promise((resolve) => setTimeout(() => {
player.pause();
player.interval = 600;
player.unpause();
resolve();
}, 3000));
}
function playOnce() {
// add item once, but not in the array we loop around in
return new Promise((resolve) => setTimeout(() => {
player.playOnce(1000);
resolve();
}, 3000));
}
// or add a few items that will be repeated.
function addItems() {
// add a super very high item 3 seconds after function call.
return new Promise((resolve) => setTimeout(() => {
player.pause();
player.addItem(400);
player.addItem(430);
player.addItem(420);
player.unpause();
// now rewind to this block. I am off by one, likely.
player.skipTo(player.items.length - 3);
resolve();
}, 5000))
}
speedUp()
.then(playOnce)
.then(addItems);
:
git diff
它将检查这些分支中文件之间的区别。请查看本文,了解有关git commands及其工作原理的更多信息。
答案 10 :(得分:0)
按以下方式使用提交哈希:
git diff <hash1> <hash2> <filename>
其中 hash1 可以是来自任何分支的任何提交,与 hash2 相同。
答案 11 :(得分:0)
有两种方案可以比较文件:
方案1:比较远程分支上的文件(两个分支都应该存在于远程存储库中)
方案2:将本地文件(在本地工作区副本中)与远程存储库中的文件进行比较。
逻辑很简单。如果为diff提供两个分支名称,它将始终比较远程分支,如果仅提供一个分支名称,它将始终将本地工作副本与远程仓库(您提供的一个)进行比较。您可以使用range提供远程存储库。
例如结帐分支
git checkout branch1
git diff branch2 [filename]
在这种情况下,如果提供文件名,它将把文件名的本地副本与名为“ branch2 ”的远程分支进行比较。
git diff branch1 branch2 [filename]
在这种情况下,它将比较名为“ branch1 ”和“ branch2 ”
的远程分支的文件名git diff ..branch2 [filename]
在这种情况下,还将比较来自名为“ branch1 ”和“ branch2 ”的远程分支的文件名。因此,与上面相同。但是,如果刚从另一个分支创建了一个分支,说“ master”,而当前的分支在远程存储库中不存在,它将比较远程“ master ”与远程“ branch2” ”。
希望它有用。
答案 12 :(得分:0)
关于这些不同的比较方式还有另一个有趣的点:我想将当前分支中的文件与另一个分支中的同一个文件进行比较。如果我使用
git difftool otherbranch.. filespec
我最终比较了实际在我的临时文件夹中的两个文件。但是,如果我使用
git difftool otherbranch filespec
我最终将临时文件夹中的文件(otherbranch 上的版本)与我的 git 文件夹中的实际文件进行比较,这 a) 更容易分辨哪个是哪个,b) 意味着我可以使用差异工具(在我的情况下为 BC4)将更改从我的另一个分支复制到我的当前分支。 只是觉得值得一提。