使用Git如何find本地和远程之间的变化
这里有两个不同的问题,但我认为他们是相关的。
-
在使用Git时,如何查找我在本地提交的更改,但尚未推送到远程分支? 我正在寻找类似于
hg outgoing
的Mercurial命令。 -
在使用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}..
我使用以下incoming
和outgoing
别名,以使上述更易于使用:
git config --global alias.incoming '!git remote update -p; git log ..@{u}' git config --global alias.outgoing 'log @{u}..'
不是一个完整的答案,但混帐抓取将拉动远程回购,而不是做一个合并。 你可以做一个
git diff主起源/主
-
使用“git log origin..HEAD”
-
使用“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。