本地仓库中的文件和远程仓库中的文件有何区别?

259
我想查找我本地存储库中的文件与origin master中的文件之间的区别。 我知道有git diff。但是,我只想将其隔离到这个特定的文件上。 为简单起见,假设文件名为file1.txt,它在本地具有文件路径=[local_path],而在远程则具有文件路径=[remote-path]。 我需要键入什么Git命令? 对于那些使用Eclipse的人,我刚刚发现您可以右键单击→与比较 →分支、标记或引用 →选择适当的版本,就可以了。

[remote-path]和[local-path]是否不同? - Code-Apprentice
你如何称呼“origin master”? - user8434768
Eclipse EGit方法很好。 - user1169587
8个回答

324
如果[remote-path][local-path]相同,您可以执行
$ git fetch origin master
$ git diff origin/master -- [local-path]

注意1:上述第二个命令将与本地存储的远程跟踪分支进行比较。需要使用fetch命令将远程跟踪分支更新为与远程服务器上内容同步。或者,您也可以只执行以下命令

Note 1: The second command above will compare against the locally stored remote tracking branch. The fetch command is required to update the remote tracking branch to be in sync with the contents of the remote server. Alternatively, you can just do
$ git diff master:<path-or-file-name>

注意2:在上述示例中,master可以替换为任何分支名称


18
如果当前目录下的话,甚至可以省略本地路径。 - Tony Wall
25
对于像我这样极其菜鸟的人,这是一个例子:git diff master:README.md -- README.md若需翻译其他内容,请提供更多信息。 - fabriciorissetto
33
实际上,这里有一个更好的例子:git diff origin/master -- README.md - JDiMatteo
@JDiMatteo 我已经滚动了一页又一页,寻找那个简单的命令。谢谢。 - Azor Ahai -him-
@Code-Apprentice 因为我以为 git fetch **origin** 是一种特殊的源头提取,所以感到困惑。但我意识到你是想使用类似这样的 Markdown 粗体:git fetch origin - andrvibo
显示剩余3条评论

134

查看从远程文件到本地文件的差异:

git diff remotename/branchname:remote/path/file1.txt local/path/file1.txt

要查看相反方向的差异:

git diff HEAD:local/path/file1.txt remotename/branchname:remote/path/file1.txt

基本上,您可以使用以下符号在任何位置区分两个文件:

git diff ref1:path/to/file1 ref2:path/to/file2

通常情况下,ref1ref2可以是分支名称、远程名称/分支名称、提交SHA等。


39

要将本地仓库与远程仓库进行比较,请使用以下语法:

git diff @{upstream}

2

为此我编写了一个Bash脚本:

#set -x
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | awk '{if ($1 == "modified:") print $2;}'`
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file
git difftool  FETCH_HEAD $file ;
done

在上述脚本中,我获取了远程主分支(不一定是其主分支 - 任何 分支)到FETCH_HEAD,仅列出我修改的文件,并将修改的文件与git difftool进行比较。
Git 支持许多difftool,我配置了Meld Diff Viewer以获取良好的 GUI 比较。
从上面的脚本中,我可以事先了解其他团队在相同文件中所做的更改,然后才跟随 Git 阶段 untrackedstagedcommit,这有助于我避免与远程团队冲突解决或者在主分支上创建一个新的本地分支并进行比较和合并。

2

对我来说,只使用文件名而不是分支就可以了:

git diff filename

1
我尝试了几种解决方案,但我认为最简单的方法是这样的(您在本地文件夹中):
#!/bin/bash
git fetch

var_local=`cat .git/refs/heads/master`
var_remote=`git log origin/master -1 | head -n1 | cut -d" " -f2`

if [ "$var_remote" = "$var_local" ]; then
    echo "Strings are equal." #1
else
    echo "Strings are not equal." # 0 if you want
fi

运行此脚本后,您将完成使用最后提交编号比较本地 Git 和远程 Git。

1

检查当前分支的方法:

git diff -- projects/components/some.component.ts ... origin
git diff -- projects/components/some.component.html ... origin

要检查其他分支,比如暂存区(staging):

git diff -- projects/components/some.component.ts ... origin/staging
git diff -- projects/components/some.component.html ... origin/staging

1
"staging" 是指 Git 中的暂存区吗?还是字面意思上的“分阶段”?它们是同一个东西吗?您能详细解释一下吗?请通过编辑您的答案来回复,而不是在评论中回复。 - Peter Mortensen

0
原问题是关于本地和远程可能不同路径的讨论,完整的回答如下:
  1. git fetch origin
  2. git diff master -- [local-path] origin/master -- [remote-path]

假设本地路径为 docs/file1.txt,远程路径为 docs2/file1.txt,使用 git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

这是从 GitHub 帮助页面 这里 和之前的 Code-Apprentice 回答 改编而来。


非常有帮助,但对我没有起作用。 - Avv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接