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

eju*_*ker 150 git mercurial

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

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

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

对于第二种:有没有办法看看有什么可用,然后挑选我想要的变化?

Ric*_*sen 110

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

模仿hg incoming:

git log ..@{u}
Run Code Online (Sandbox Code Playgroud)

模仿hg outgoing:

git log @{u}..
Run Code Online (Sandbox Code Playgroud)

我使用以下incomingoutgoing别名来使上述更容易使用:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'
Run Code Online (Sandbox Code Playgroud)

  • 如果您的本地分支未配置上游,您将收到这些错误.要修复,运行`git branch --set-upstream foo origin/foo`. (6认同)

Jor*_*ter 97

Git不能通过网络发送那种信息,比如Hg可以.但是您可以运行git fetch(更像hg pullhg 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找到它们.


Mar*_*ond 42

不是一个完整的答案,但git fetch将拉远程仓库而不进行合并.然后你可以做一个

git diff master origin/master


Gre*_*ill 32

  1. 使用"git log origin..HEAD"

  2. 使用"git fetch"后跟"git log HEAD..origin".您可以使用列出的提交ID来挑选单个提交.

当然,上面假设"origin"是远程跟踪分支的名称(如果您使用带有默认选项的clone).

  • "origin"不是远程跟踪分支的名称,它是远程的名称.只是指定远程名称不起作用,您必须指定远程跟踪分支,它将是origin/master. (4认同)
  • (如果你没有跟踪远程分支,那就是"git log origin/master..HEAD".) (3认同)

rob*_*nst 22

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

git log --branches --not --remotes=origin
Run Code Online (Sandbox Code Playgroud)

这就是git log手册页中对此的说法:

显示任何本地分支中的所有提交,但不显示原始的任何远程跟踪分支中的所有提交(原始数据没有).

以上是为了outgoing.对于incoming,只需交换:

git log --remotes=origin --not --branches
Run Code Online (Sandbox Code Playgroud)


chr*_*ris 8

我会做

$ git fetch --dry-run
Run Code Online (Sandbox Code Playgroud)

hg incoming

$ git push --dry-run
Run Code Online (Sandbox Code Playgroud)

hg outgoing.