使用Git如何找到本地和远程之间的更改


152

这是两个不同的问题,但我认为它们是相关的。

  1. 使用Git时,如何查找已在本地提交但尚未推送到远程分支的更改?我正在寻找类似于Mercurial命令的内容hg outgoing

  2. 使用Git时,如何在进行拉取之前找到远程分支的更改?我正在寻找类似于Mercurial命令的内容hg incoming

第二:是否有办法查看可用的内容,然后选择要提取的更改?


11
纵观答案,似乎有一些混乱至于什么hg incominghg outgoing怎么做。我找到的最接近的Git等效项是该--dry-run选项。正义git pull --dry-run,您将看到所有需要发生的事情的列表。
罗曼·斯塔科夫

Answers:


97

Git无法像Hg一样通过网络发送此类信息。但是您可以运行git fetchhg pull比起来更像hg fetch)从远程服务器获取新的提交。

因此,如果您有一个名为的分支master和一个名为的远程服务器origin,则在运行后git fetch,还应该有一个名为的分支origin/master。然后,你可以得到git log所有提交的master需要是的超集origin/mastergit log master..origin/master。倒转这两个得到相反的结果。

我的一个朋友David Dollar创建了几个git shell脚本来进行仿真hg incoming/outgoing。您可以在http://github.com/ddollar/git-utils上找到它们。


113

从Git 1.7.0开始,有一种特殊的语法可让您通用地引用上游分支:@{u}@{upstream}

模仿hg incoming

git log ..@{u}

模仿hg outgoing

git log @{u}..

我使用以下incomingoutgoing别名使上面的内容更易于使用:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'

git log .. @ {u}给了我这些错误。(我在git config中既有原始资源又有上游资源库)。错误:找不到“”的上游分支错误:没有找到“”的上游分支错误:没有找到“”的上游分支致命:模棱两可的参数“ .. @ {u}”:未知版本或路径不在工作树。用“ - ”分隔的路径从修订
亨里克

6
如果您的本地分支未配置上游,则将收到这些错误。要修复,请运行git branch --set-upstream foo origin/foo
理查德·汉森

git log @{u}..为我列出仓库中的每一个更改。它们还不存在。
罗曼·斯塔科夫

@romkyns:您的本地分支可能将错误的远程分支配置为上游。确保git rev-parse --symbolic-full-name @{u}打印适当的远程参考。另外,git log @{u}..显示上游分支无法到达的提交,其中可以包括远程存储库中已经存在的提交(如果通过其他引用可以到达)。在合并到一个已经按下的分支中之后,这将立即发生。
理查德·汉森

@RichardHansen恐怕我太笨了,不知道什么适合远程参考,但是这是一个新克隆的回购协议,我只做了a checkout <somebranch>merge <otherbranch>。此时,我做了,log @{u}..并看到了列出的所有更改。
罗曼·斯塔科夫

42

不是一个完整的答案,但是git fetch会拉出远程仓库并且不做合并。然后,您可以

git diff master来源/ master


1
为我工作(但相反)git diff origin/master master
Nick Grealy 2015年

34
  1. 使用“ git log origin..HEAD”

  2. 使用“ git fetch”,然后使用“ git log HEAD..origin”。您可以使用列出的提交ID挑选单个提交。

当然,以上假设“ origin”是远程跟踪分支的名称(如果您使用具有默认选项的clone,则为该名称)。


3
(如果您不跟踪远程分支,则为“ git log origin / master..HEAD”。)
plindberg 2010年

4
“来源”不是远程跟踪分支的名称,而是远程的名称。并且仅指定远程名称不起作用,您必须指定远程跟踪分支,该分支将是原始服务器/主服务器。
罗宾斯特2011年

22

还有,用于比较所有分支:

git log --branches --not --remotes=origin

这是git log手册页关于此内容的内容:

显示在任何本地分支中但不在任何远程跟踪分支中的所有提交(对于原点,您没有该原点)。

以上是针对outgoing。对于incoming,只需交换:

git log --remotes=origin --not --branches

8

我会做

$ git fetch --dry-run

hg incoming

$ git push --dry-run

hg outgoing


抱歉,我已经忽略了此内容,已作为对OP的评论。
克里斯

1

git-out是一个hg outgoing非常准确地模拟的脚本。它解析“ push -n”输出,因此如果您需要指定其他参数来推送,它将产生准确的输出。


0

git进来

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

git传出

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch

0

当“ git log”和@ {u}回答最初给我“未知修订”错误时,我尝试了Chris / romkyns的建议git push --dry-run

您将得到诸如“ 5905..4878 master-> master”的输出。5905是遥控器具有的最新提交,并且通过(包括)4878提交的最新提交将应用于遥控器。

然后,您可以将5905..4878用作其他几个git命令的参数,以获取更多详细信息:

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment

-1

进行git fetch时,所有内容(包括分支,标签(引用))都临时存储在.git / FETCH_HEAD中,可以使用以下命令查看其内容:git log FETCH_HEAD如果不对git fetch使用后缀-a,则默认情况下,则FETCH_HEAD的内容将被新内容覆盖。从这些内容中,您可以查看并决定要将它们合并到哪个分支,或者如果您只希望从fetch带来的提交中进行少量提交,则可以简单地进行选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.