这是两个不同的问题,但我认为它们是相关的 .
使用Git时,如何找到我在本地提交的更改,但是't yet pushed to a remote branch? I' m正在寻找类似于Mercurial命令 hg outgoing 的内容 .
hg outgoing
使用Git时,如何在执行拉取之前找到远程分支的更改?我正在寻找类似于Mercurial命令 hg incoming 的东西 .
hg incoming
对于第二种:有没有办法看看有什么可用,然后挑选我想要的变化?
Git不能通过网络发送那种信息,比如Hg可以 . 但是您可以运行 git fetch (更像是 hg pull 而不是 hg fetch )来从远程服务器获取新的提交 .
git fetch
hg pull
hg fetch
因此,如果你有一个名为 master 的分支和一个名为 origin 的远程,在运行 git fetch 之后,你还应该有一个名为 origin/master 的分支 . 然后,您可以通过 git log master..origin/master 获取 master 需要成为 origin/master 的超集的所有提交的 git log . 颠倒那两个来反过来 .
master
origin
origin/master
git log master..origin/master
git log
我的一个朋友David Dollar创建了几个git shell脚本来模拟 hg incoming/outgoing . 你可以在http://github.com/ddollar/git-utils找到它们 .
hg incoming/outgoing
从Git 1.7.0开始,有一种特殊的语法允许您通常引用上游分支: @{u} 或 @{upstream} .
@{u}
@{upstream}
模仿 hg incoming :
git log ..@{u}
模仿 hg outgoing :
git log @{u}..
我使用以下 incoming 和 outgoing 别名来使上述更容易使用:
incoming
outgoing
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来挑选单个提交 .
当然,上面假设“origin”是远程跟踪分支的名称(如果您使用带有默认选项的clone) .
还有这个,用于比较所有分支:
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 fetch && git log ..origin/master --stat OR $ git fetch && git log ..origin/master --patch
$ git fetch && git log origin/master.. --stat OR $ git fetch && git log origin/master.. --patch
当"git log"和@ 答案最初给我"unknown revision"错误时,我尝试了Chris / romkyns的建议 git push --dry-run .
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带来的一些提交中,您可以简单地选择 .
10 回答
Git不能通过网络发送那种信息,比如Hg可以 . 但是您可以运行
git fetch
(更像是hg pull
而不是hg fetch
)来从远程服务器获取新的提交 .因此,如果你有一个名为
master
的分支和一个名为origin
的远程,在运行git fetch
之后,你还应该有一个名为origin/master
的分支 . 然后,您可以通过git log master..origin/master
获取master
需要成为origin/master
的超集的所有提交的git log
. 颠倒那两个来反过来 .我的一个朋友David Dollar创建了几个git shell脚本来模拟
hg incoming/outgoing
. 你可以在http://github.com/ddollar/git-utils找到它们 .从Git 1.7.0开始,有一种特殊的语法允许您通常引用上游分支:
@{u}
或@{upstream}
.模仿
hg incoming
:模仿
hg outgoing
:我使用以下
incoming
和outgoing
别名来使上述更容易使用:不是一个完整的答案,但git fetch将拉远程仓库而不进行合并 . 然后你可以做一个
使用“git log origin..HEAD”
使用“git fetch”后跟“git log HEAD..origin” . 您可以使用列出的提交ID来挑选单个提交 .
当然,上面假设“origin”是远程跟踪分支的名称(如果您使用带有默认选项的clone) .
还有这个,用于比较所有分支:
这就是git log手册页中对此的说法:
以上是
outgoing
. 对于incoming
,只需交换:我会做
对于
hg incoming
和为
hg outgoing
.git-out是一个非常准确地模拟
hg outgoing
的脚本 . 它解析"push -n"输出,因此如果需要指定要推送的其他参数,它会产生准确的输出 .git传入
git传出
当"git log"和@ 答案最初给我"unknown revision"错误时,我尝试了Chris / romkyns的建议
git push --dry-run
.您将获得诸如“5905..4878 master-> master”之类的输出 . 5905是遥控器具有的最新提交,并且将通过(包括)4878提交应用于遥控器 .
然后,您可以使用5905..4878作为其他几个git命令的参数来获取更多详细信息:
当你执行git fetch时,包括分支,标签(refs)在内的所有内容都临时存储在.git / FETCH_HEAD中,其内容可以通过命令查看:git log FETCH_HEAD如果你不使用后缀-a和git fetch,那么默认情况下,FETCH_HEAD的内容将被新内容覆盖 . 从这些内容中,您可以查看并决定要将它们合并到哪个分支,或者如果您只想从fetch带来的一些提交中,您可以简单地选择 .