154

这是两个不同的问题,但我认为它们是相关的。

  1. 使用 Git 时,如何找到我在本地提交但尚未推送到远程分支的更改?我正在寻找类似于 Mercurial 命令的东西hg outgoing

  2. 使用 Git 时,我如何找到远程分支在拉取之前所做的更改?我正在寻找类似于 Mercurial 命令的东西hg incoming

第二:有没有办法查看可用的内容,然后挑选我想要的更改?

4

11 回答 11

116

从 Git 1.7.0 开始,有一个特殊的语法允许你泛指上游分支:@{u}@{upstream}.

模仿hg incoming

git log ..@{u}

模仿hg outgoing

git log @{u}..

我使用以下内容incomingoutgoing别名使上述内容更易于使用:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'
于 2011-06-17T17:18:37.267 回答
99

Git 不能像 Hg 那样通过网络发送那种信息。但是您可以运行git fetch(这更像是hg pullhg fetch从远程服务器获取新提交。

所以,如果你有一个叫做的分支master和一个叫做远程的origin,在运行之后git fetch,你应该也有一个叫做的分支origin/master。然后,您可以通过 do 获得需要成为超集的git log所有提交中的。颠倒这两个以获得相反的结果。masterorigin/mastergit log master..origin/master

我的一个朋友 David Dollar 创建了几个 git shell 脚本来模拟hg incoming/outgoing. 您可以在http://github.com/ddollar/git-utils找到它们。

于 2008-10-23T20:31:36.523 回答
43

不是完整的答案,但 git fetch 将拉取远程仓库而不进行合并。然后你可以做一个

git diff 主起源/主

于 2008-10-23T20:07:24.890 回答
34
  1. 使用“git log origin..HEAD”

  2. 使用“git fetch”后跟“git log HEAD..origin”。您可以使用列出的提交 ID 挑选单个提交。

当然,上面假设“origin”是您的远程跟踪分支的名称(如果您使用带有默认选项的克隆)。

于 2008-10-23T19:55:45.410 回答
22

还有这个,用于比较所有分支:

git log --branches --not --remotes=origin

这是 git log 手册页对此的说明:

显示在任何本地分支中但不在任何远程跟踪分支中的所有提交(您拥有的源没有)。

以上是针对outgoing. 对于incoming,只需交换:

git log --remotes=origin --not --branches
于 2011-05-25T09:57:40.900 回答
8

我会做

$ git fetch --dry-run

对于hg incoming

$ git push --dry-run

hg outgoing.

于 2014-01-21T14:30:36.983 回答
1

git-outhg outgoing是一个非常准确地模拟的脚本。它解析“push -n”输出,因此如果您需要指定要推送的其他参数,它会产生准确的输出。

于 2011-11-05T00:33:57.393 回答
0

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
于 2013-12-09T12:45:29.490 回答
0

当“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
于 2014-07-07T16:32:42.677 回答
0

可以使用以下方法显示跨所有分支的传入提交。

该命令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>

于 2020-10-08T09:37:59.923 回答
-1

当您执行 git fetch 时,包括分支、标签(refs)在内的所有内容都临时存储在 .git/FETCH_HEAD 中,可以使用以下命令查看其内容: git log FETCH_HEAD 如果您不使用 git fetch 后缀 -a 则默认情况下, FETCH_HEAD 的内容将被新内容覆盖。从这些内容中,您可以查看并决定要将它们合并到哪个分支,或者如果您只想从 fetch 带来的内容中提交一些提交,则可以简单地挑选。

于 2015-10-21T21:02:58.587 回答