使用Git如何在本地和远程之间找到更改

时间:2008-10-23 19:52:30

标签: git mercurial

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

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

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

  3. 对于第二种:有没有办法看到可用的东西,然后挑选我想要的变化?

11 个答案:

答案 0 :(得分:109)

从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}..'

答案 1 :(得分:97)

Git不能通过网络发送那种信息,比如Hg可以。但您可以运行git fetch(更像hg pull而不是hg fetch)来从远程服务器获取新提交。

因此,如果您有一个名为master的分支和一个名为origin的远程分支,则在运行git fetch之后,您还应该有一个名为origin/master的分支。然后,您可以通过git log获取master需要成为origin/master超集的所有提交中的git log master..origin/master。反过来这两个是相反的。

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

答案 2 :(得分:42)

不完整的答案,但git fetch将拉远程仓库而不进行合并。 然后,您可以执行

git diff master origin/master

答案 3 :(得分:32)

  1. 使用“git log origin..HEAD”

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

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

答案 4 :(得分:21)

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

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

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

  

显示任何提交中的所有提交   当地的分支机构,但没有任何一个   远程跟踪原始分支   (你有什么来源不是)。

上述内容适用于outgoing。 对于incoming,只需交换:

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

答案 5 :(得分:8)

我愿意

$ git fetch --dry-run

代表hg incoming

$ git push --dry-run

代表hg outgoing

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

答案 8 :(得分: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

答案 9 :(得分:0)

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

通过向您的PATH添加一个名为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之类的参数进一步调整打印日志的外观。

注意:您可能希望限制git log的返回时间,具体取决于bash变量在系统中可以容纳多少,或者出于性能原因。这可以通过添加参数--max-count=<count>来完成。

答案 10 :(得分:-1)

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