使用Git如何find本地和远程之间的变化

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

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

  2. 在使用Git时,如何查找远程分支在执行pull操作之前所做的更改? 我正在寻找类似于Mercurial命令的hg incoming

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

Git不能通过networking发送这样的信息,比如Hg可以。 但是你可以运行git fetch (它比hg fetch更像hg pull )从远程服务器获取新的提交。

所以,如果你有一个名为master的分支和一个名为origin的远程,在运行git fetch ,你也应该有一个叫做origin/master的分支。 然后你可以通过执行git log master..origin/master来获得master需要成为origin/master的超集的所有提交的git log master..origin/master 。 颠倒这两个相反。

我的一个朋友David Dollar创build了几个git shell脚本来模拟hg incoming/outgoing 。 你可以在http://github.com/ddollar/git-utilsfind它们。;

从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 diff主起源/主 
  1. 使用“git log origin..HEAD”

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

当然,上面假定“origin”是远程追踪分支的名称(如果你使用了默认选项的克隆)。

还有,比较所有分支机构:

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

这就是git log man page所说的:

显示任何本地分支中的所有提交,但不包含任何源的远程跟踪分支(您拥有该源的任何分支)。

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

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

我会做

 $ git fetch --dry-run 

hg incoming

 $ git push --dry-run 

hg outgoing

git-out是一个相当准确地模拟hg outgoing的脚本。 它parsing“push -n”输出,所以如果你需要指定更多的参数来推送,它会产生精确的输出。

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 

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

你会得到一个输出,如“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 

当你做混帐抓取时,包括分支,标签(ref)在内的所有内容都被临时存储在.git / FETCH_HEAD中,其内容可以通过命令查看:git log FETCH_HEAD如果你没有使用后缀-a和git fetch,那么默认情况下,FETCH_HEAD的内容将被新的内容覆盖。 从这些内容中,您可以查看并决定要将哪个分支合并到一起,或者如果您只需从提取带来的提交中进行一些提交,就可以进行简单的select。