这里有两个不同的问题,但我认为它们是相关的。
在使用 Git 时,如何查找已经在本地提交但尚未推送到远程分支的更改?我正在寻找类似于 Mercurial 命令 hg outgoing的东西。
hg outgoing
在使用 Git 时,如何查找远程分支在执行提取之前所做的更改?我正在寻找类似于 Mercurial 命令 hg incoming的东西。
hg incoming
对于第二个问题: 有没有一种方法可以查看可用的内容,然后挑选我想要拉出的更改?
使用“ git 日志原点. . HEAD”
使用“ git 获取”后跟“ git 日志 HEAD.. 起源”。您可以使用所列出的提交 ID 选择单个提交。
当然,上面假设“原点”是您的远程跟踪分支的名称(如果您使用带默认选项的 clone,那么就是这个名称)。
不是一个完整的答案,但 git 的取回将拉远程回购和不做合并。 然后可以执行 < pre > git diff master source/master
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,您可以获得所有提交的 git log,即 master需要成为 origin/master的超集。把这两个倒过来,得到相反的结果。
master
origin
origin/master
git log master..origin/master
git log
我的一个朋友 DavidDollar 创建了几个 gitshell 脚本来模拟 hg incoming/outgoing。你可以在 http://github.com/ddollar/git-utils找到他们。
hg incoming/outgoing
还有这个,用来比较所有的分支:
git log --branches --not --remotes=origin
Git 日志手册页是这么说的:
中的所有提交 本地分行,但不属于任何一个 远程跟踪原点分支 (你有什么,起源没有)。
以上是 outgoing。 对于 incoming,只需交换:
outgoing
incoming
git log --remotes=origin --not --branches
从 Git 1.7.0开始,有一种特殊的语法允许您通用地引用上游分支: @{u}或 @{upstream}。
@{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-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 fetch --dry-run
hg incoming及
$ git push --dry-run
hg outgoing.
当“ git log”和@{ u }回答最初给我出现“未知修订”错误时,我尝试了 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 获取时,所有内容(包括分支、标记(参考文献))都临时存储在。Git/FETCH _ HEAD,其内容可以通过命令查看: Git 日志 FETCH _ HEAD 如果不使用后缀 -a 和 git 提取,那么默认情况下,FETCH _ HEAD 的内容将被新内容覆盖。 从这些内容中,您可以查看并决定想要合并它们的分支,如果需要的话,也可以进行简单的初选,如果您只想从提取所带来的内容中提交一些内容。
可以使用以下方法显示所有分支的传入提交。
通过向 PATH 中添加一个名为 git-fetch-diff的可执行文件,命令 git fetch-diff变得可用,其中包含:
git-fetch-diff
git fetch-diff
#!/bin/bash set -e # get hashes before fetch old_hashes=$(git log --all --no-color --pretty=format:"%H") # perform the fetch git fetch # get hashes after fetch new_hashes=$(git log --all --no-color --pretty=format:"%H") # get the difference added_hashes=$(comm -1 -3 <(echo "$old_hashes") <(echo "$new_hashes")) # print added hashes [ ! -z "$added_hashes" ] && echo "$added_hashes" | git log --stdin --no-walk --oneline
在提取之前和之后对提交哈希进行比较。差异是管道回到 git log的漂亮打印。通过使用诸如 --pretty=<format>和 --graph之类的参数,可以进一步根据您的喜好调整打印日志的外观。
--pretty=<format>
--graph
注意 : 您可能希望根据 bash 变量在您的系统上能够保存多少内存,或者出于性能原因,限制 git log在时间上能够回溯多久。这可以通过添加参数 --max-count=<count>来完成。
--max-count=<count>