2008-10-23 72 views
142

以下是兩個不同的問題,但我認爲它們是相關的。使用Git如何找到本地和遠程之間的變化

  1. 當使用Git時,如何找到哪些更改我已本地提交,但尚未推送到遠程分支?我正在尋找類似於Mercurial命令hg outgoing的東西。

  2. 當使用Git時,如何查找遠程分支在執行pull操作之前所做的更改?我正在尋找類似於Mercurial命令hg incoming的東西。

對於第二種:有沒有辦法看到什麼是可用的,然後櫻桃選擇我想拉的變化?

+11

看看答案,似乎有一些混淆'hg incoming`和`hg outgoing`實際做了什麼。我找到的最接近的Git等價物是`--dry-run`選項。只要`git pull --dry-run`,你會看到所有需要發生的事情的列表。 – 2012-09-29 10:16:48

回答

96

Git不能通過網絡發送這種信息,如汞可以。但是您可以運行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找到它們。

32
  1. 使用 「git的日誌origin..HEAD」

  2. 使用 「混帳取回獵物」,其次是 「git的日誌HEAD..origin」。您可以使用列出的提交ID挑選單個提交。

當然,上面假設「origin」是遠程跟蹤分支的名稱(如果您使用的是具有默認選項的克隆,則爲「origin」)。

+3

(如果你不跟蹤遠程分支,它是「git log origin/master..HEAD」。) – plindberg 2010-08-17 13:16:47

+4

「origin」不是遠程跟蹤分支的名稱,它是遠程的名稱。只要指定遠程名稱不起作用,就必須指定遠程跟蹤分支,這將是原點/主控。 – robinst 2011-05-25 09:53:37

41

不是一個完整的答案,但git fetch將拉動遠程回購,而不是做一個合併。 然後你可以做一個

git diff master origin/master

+1

爲我工作(但其他方式) - `git diff origin/master master` – 2015-09-01 05:22:19

19

還有這個,比較各分行:

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

這是git的日誌手冊頁說這個是什麼:以上

Shows all commits that are in any of local branches but not in any of remote tracking branches for origin (what you have that origin doesn’t).

outgoing。 對於incoming,只是交換:

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

使用Git 1.7.0開始,有一個特殊的語法,使您可以泛指上游分支:@{u}@{upstream}

要模仿hg incoming

git log [email protected]{u} 

要模仿hg outgoing

git log @{u}.. 

我用下面的incomingoutgoing別名作出上述更容易使用:

git config --global alias.incoming '!git remote update -p; git log [email protected]{u}' 
git config --global alias.outgoing 'log @{u}..' 
+0

git log .. @ {u}給了我這些錯誤。 (我有我的git配置中的起源和上游存儲庫)。 錯誤:找不到上游分支'' 錯誤:找不到上游分支'..' 錯誤:找不到'..'的上游分支 致命:模棱兩可的參數'.. @ {u}':未知版本或路徑不在工作樹中。 使用' - '分隔修訂版本的路徑 – Henrik 2011-10-01 13:42:46

+6

如果您的本地分支沒有配置上游,您會得到這些錯誤。要修復,運行`git branch --set-upstream foo origin/foo`。 – 2011-10-01 18:18:01

1

git-out是一個相當準確地模擬hg outgoing的腳本。它解析「push -n」輸出,所以如果你需要指定額外的參數來推送,它會產生精確的輸出。

0

混帳傳入

$ 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 
7

我會做

$ git fetch --dry-run 

hg incoming

$ git push --dry-run 

對於hg outgoing

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 
-1

當你混帳獲取,所有包括分支,標籤(裁判)的內容被臨時存儲在.git/FETCH_HEAD中,其內容可以通過以下命令查看: git log FETCH_HEAD 如果您沒有使用後綴-a和git fetch,那麼默認情況下,FETCH_HEAD的內容將被新內容覆蓋。 從這些內容中,您可以查看並決定要將它們合併到哪個分支,或者如果您只需從提取帶來的提交中進行少量提交,就可以簡單地進行挑選。

相關問題