这是两个不同的问题,但我认为它们是相关的。
使用 Git 时,如何找到我在本地提交但尚未推送到远程分支的更改?我正在寻找类似于 Mercurial 命令的东西
hg outgoing
。使用 Git 时,我如何找到远程分支在拉取之前所做的更改?我正在寻找类似于 Mercurial 命令的东西
hg incoming
。
第二:有没有办法查看可用的内容,然后挑选我想要的更改?
从 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 不能像 Hg 那样通过网络发送那种信息。但是您可以运行git fetch
(这更像是hg pull
)hg fetch
从远程服务器获取新提交。
所以,如果你有一个叫做的分支master
和一个叫做远程的origin
,在运行之后git fetch
,你应该也有一个叫做的分支origin/master
。然后,您可以通过 do 获得需要成为超集的git log
所有提交中的。颠倒这两个以获得相反的结果。master
origin/master
git log master..origin/master
我的一个朋友 David Dollar 创建了几个 git shell 脚本来模拟hg incoming/outgoing
. 您可以在http://github.com/ddollar/git-utils找到它们。
不是完整的答案,但 git fetch 将拉取远程仓库而不进行合并。然后你可以做一个
git diff 主起源/主
使用“git log origin..HEAD”
使用“git fetch”后跟“git log HEAD..origin”。您可以使用列出的提交 ID 挑选单个提交。
当然,上面假设“origin”是您的远程跟踪分支的名称(如果您使用带有默认选项的克隆)。
还有这个,用于比较所有分支:
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-outhg 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”和@{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-diff
通过添加一个调用git-fetch-diff
到您的 PATH 的可执行文件变得可用,其中包含:
#!/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
。
注意:您可能希望git log
根据 bash 变量可以在您的系统上保留多少或出于性能原因来限制时间回溯的距离。这可以通过添加参数来完成--max-count=<count>
。
当您执行 git fetch 时,包括分支、标签(refs)在内的所有内容都临时存储在 .git/FETCH_HEAD 中,可以使用以下命令查看其内容: git log FETCH_HEAD 如果您不使用 git fetch 后缀 -a 则默认情况下, FETCH_HEAD 的内容将被新内容覆盖。从这些内容中,您可以查看并决定要将它们合并到哪个分支,或者如果您只想从 fetch 带来的内容中提交一些提交,则可以简单地挑选。