题
以下是两个不同的问题,但我认为它们是相关的。
-
使用Git时,如何找到我在本地提交但尚未推送到远程分支的更改?我正在寻找类似于Mercurial命令
hg outgoing
的东西。 -
使用Git时,如何在拉取之前找到远程分支的更改?我正在寻找类似于Mercurial命令
hg incoming
的东西。
醇>
对于第二种:有没有办法看到可用的东西,然后挑选我想要的变化?
解决方案
Git不能通过网络发送那种信息,比如Hg可以。但是你可以运行 git fetch
(更像是 hg pull
而不是 hg fetch
)来从远程服务器获取新的提交。
所以,如果你有一个名为 master
的分支和一个名为 origin
的远程,在运行 git fetch
之后,你还应该有一个分支叫 origin / master
。然后,您可以通过 git log master获取
master
需要成为 origin / master
的超集的所有提交的 git log
..origin /主代码>。反过来这两个是相反的。
我的一位朋友David Dollar创建了几个git shell脚本来模拟 hg incoming / outgoing
。您可以在 http://github.com/ddollar/git-utils 找到它们。
其他提示
从Git 1.7.0开始,有一种特殊的语法允许您通常引用上游分支: @ {u}
或 @ {upstream}
。
模仿 hg incoming
:
git log ..@{u}
模仿 hg outgoing
:
git log @{u}..
我使用以下传入
和传出
别名来使上述内容更容易使用:
git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'
不完整的答案,但git fetch将拉远程仓库而不进行合并。 然后,您可以执行
git diff master origin/master
-
使用“git log origin..HEAD”
-
使用“git fetch”然后是“git log HEAD..origin”。您可以使用列出的提交ID来挑选单个提交。
醇>
当然,上述假设“起源”是指“起源”。是远程跟踪分支的名称(如果您使用带有默认选项的克隆,则为它。)
还有这个,用于比较所有分支:
git log --branches --not --remotes=origin
这就是git log手册页对此的说法:
显示任何提交中的所有提交 当地的分支机构,但没有任何一个 远程跟踪原始分支 (你有什么来源不是’)。
以上是 outgoing
。
对于 incoming
,只需交换:
git log --remotes=origin --not --branches
我愿意
$ git fetch --dry-run
用于 hg incoming
和
$ git push --dry-run
hg outgoing
。
git-out 是一个非常准确地模拟 hg outgoing
的脚本。它解析“push -n”输出,如果你需要指定其他参数来推送,它会产生准确的输出。
git incoming
$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch
git outgoing
$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch
当“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
当你进行git fetch时,包括分支,标签(refs)在内的所有内容都暂时存储在.git / FETCH_HEAD中,其内容可以通过命令查看: git log FETCH_HEAD 如果你没有使用后缀-a和git fetch,那么默认情况下,FETCH_HEAD的内容将被新内容覆盖。 从这些内容中,您可以查看并决定要将它们合并到哪个分支中,或者如果您只想提取fetch所提供的一些提交,则可以简单地选择。