Git:比较本地所有提交与远程仓库版本的差异

42

我对Git还比较新,但我想要做的事情似乎应该是可以实现的。基本上,我一直在克隆的仓库上工作,已经进行了相当多的本地提交。有没有办法查看“所有更改的总和”与原始仓库版本之间的差异?我认为这应该是可能的,因为当我执行push时,Git 本质上就是这样做的。

这里是我尝试做的示例:在gitk中,我将看到类似于以下内容:
* - [mybranch] 在 answers.txt 的末尾添加了“42”(本地提交)
* - 在 my.txt 的末尾添加了“Hello World”(本地提交)
* - 在 my.txt 的开头添加了“C#/.NET”(本地提交)
* - <[RemoteRepo]>(我从中克隆的原始仓库)

如何查看我所有更改的总和与my.txtanswers.txt相比,在检出自RemoteRepo的原始版本中的区别?


如果您需要在GitHub上执行此操作 - 请查看此链接 - Pankaj Singhal
6个回答

64

有三种方法(另外两种来自其他答案)。

1) git diff origin/master master
2) git diff origin/master..master
3) git diff origin/master...master

第一和第二个是相同的,它们展示了主分支和远程主分支之间的变更。

第三个显示了自上次推送以来在主分支上发生的变更,我认为这是您正在寻找的最合适的变更列表。


谢谢,第三个方法非常好用(最终我使用了git difftool而不是git diff)。第一和第二种方法显示的差异并不是远程仓库中我的差异,所以它们并不是我需要的。 - Ian Dallas
origin/master...origin/master 是一个空集合吗?我认为你在编辑时某种程度上弄乱了语法。你是不是想说 origin/master...master - knittl
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Alexander Mills
1
主分支需要是当前检出的分支吗? - user3731622

17

最合适的答案是

 git show-branch

要获得更多的控制,你可以使用git log且带上git rev-list

 git log --left-right --graph --cherry-pick \
      --oneline branchname...remote/branchname

这是我首选的方法,它会产生类似于以下内容:

> | fff6bda remote fix
< | c8903ee local fix
< |   724373c Merge branch 'bla' into bla
|\ \  
| < | 2faf547 details
| < | abbdc47 ....
|/ /  
< | befc181 some tagged commit

添加 --decorate 参数,你将得到类似于 gitk、git-gui 和 gitweb 的东西:

> | fff6bda remote fix
< | c8903ee local fix
< |   724373c (tag_4) Merge branch 'bla' into bla
|\ \  
| < | 2faf547 details
| < | abbdc47 ....
|/ /  
< | befc181 (tag_3) some tagged commit

专业提示1:使用'git config alias.lr log --long-option1 --long-option2'方便使用

专业提示2:使用'git config color.ui auto'可立即缓解视觉疲劳

如果您想要获取所有本地分支上的所有本地头部(对应于所有本地分支),与所有远程提交(在相同的分支上)进行比较:

git log --decorate --pretty=oneline --all --not --glob=refs/remotes --no-walk

去掉“no-walk”参数以获取所有单独的修订版本。在这种情况下,我更喜欢使用之前展示的开关(--graph --left-right)。

合并

如果要清晰地查看合并,请包括--boundary参数。

各种高级查询:

过滤结果

Git的logrev-list支持一整套巧妙的过滤能力,请参阅手册。

--after '2001-01-01'
--until 'last week'
--author 'martin'
-E -i  --grep='fixes #[0123456789]+'
-S 'new_debug_function'

还有许多其他东西。这将为您提供足够的杠杆作用,以几乎不费力地获取所需信息

本地仓库中隐藏了什么?

存储在隐藏处但不在远程分支上的内容(请注意,无法引用远程分支上的隐藏,因为隐藏驻留在reflog中,而reflog始终反映本地历史[1]):

git log $(git rev-list -g stash) --not --glob=refs/remotes 

所有(其他)无法访问的提交...

注意事项:

  • 在我的工作流中,这些包括被变基/修改过的提交和已删除的存储
  • 生成这些需要一些时间,具体取决于您的历史记录图的大小
  • 这将包括任何已删除的存储,但不包括当前的存储

    git log $(git fsck --unreachable --full --lost-found | grep ' commit ' | cut -d' ' -f3) \ --no-walk --not --glob=refs/remotes --oneline --decorate

脚本编写

为了脚本编写目的,可以用git rev-list替换git log,这样只会得到哈希值(还有更多的脚本可靠性)。

[1] 另请参见我之前关于如何在仓库之间转移存储的答案:


13

最简单且易于记忆的命令(通常)会实现您所需的功能,如下:

git diff origin

这显示了你最初拉取的代码(原始版本)和你当前正在工作的分支之间的差异,其中默认为 master 分支。


5

你可以使用git diff A B命令查看两个版本间的差异,它会比较A版本和B版本之间的代码:

git diff origin/master master

origin/master 是你上次从远程仓库获取(或克隆)时的远程主分支状态,master 是本地代码的状态 - 除非你在本地工作时切换了分支。


3

查看所有修改:

git diff HEAD origin/"分支名称"

查看特定文件的修改:

git diff HEAD:"文件名" origin/"分支名称":"文件名"


或者 git diff origin/branch HEAD -- file - knittl

2
git diff origin/master..master

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