2014-01-14 53 views
0

我想弄清楚一件奇怪的事情。我不知道我是否做錯了什麼,但這裏有:Git做一個奇怪的合併

我有兩個分支:「Web」和「ios-web-dev」。

git status

# On branch ios-web-dev 
nothing to commit, working directory clean 

我用下面的命令:

git add -A . 
git commit -m "[SIMULATOR] brightness control // get results // local storage" 
git pull 
git push origin ios-web-dev 

這裏是我的git log

commit e38c75f73c2d3b1ee40d41f87f1a09c0a51b3161 
Merge: 0bc2991 f617068 
Author: Mauricio Giordano <[email protected]> 
Date: Tue Jan 14 01:16:51 2014 -0200 

    Merge branch 'ios-web-dev' of github.com:estudiotrilha/InEvent into ios-web- 

commit 0bc29916e10861c40aafc208a86e7a4db9fafc4b 
Author: Mauricio Giordano <[email protected]> 
Date: Tue Jan 14 01:16:28 2014 -0200 

    [SIMULATOR] brightness control // get results // local storage 

爲什麼合併存在,這意味着什麼?

謝謝!

+1

這就是爲什麼開始使用'git fetch'而不是'git pull'有用的原因吧 – zerkms

回答

1

Git總是必須在歷史上工作。所以如果你提交了一個提交,然後從遠程倉庫提交 commit,它將不得不在你的本地倉庫歷史記錄之上合併該提交。如果您本地沒有任何新的提交,您的本地回購將只是fast-forward並在頂部添加遠程提交。但是,由於您提交了一個(+)提交,所以git會自動將您的更改合併到歷史記錄之上。您可以在技術上隱藏您的更改,從遠程拉,然後應用您的更改頂部。但我不一定會推薦。

假裝您進行了初始提交(1)並將其推送到遠程回購。如果同事在提交之前提交了該提交併添加了提交(2),則現在該遠程將位於2(歷史記錄爲2-1)。現在你添加另一個提交(3),並試圖從遠程拉。 Git會意識到您的本地歷史記錄爲3-1,而遠程歷史記錄爲2-1你的2在哪裏提交? Git必須將它記錄到您的歷史中,不管怎樣,它都會合並。你並沒有要求git重寫歷史記錄(3-2-1),所以它試圖將它合併到頂端(2-3-1)。現在它只是在3之上應用2的更改,所以它必須提交一個提交,因此Merge branch 'ios-web-dev' of github.com:estudiotrilha/InEvent into ios-web-

現在,如果您試圖推送到遠程(具有歷史記錄2-1),您會收到錯誤,因爲您的本地回購(歷史記錄3-1)缺少一些歷史記錄。你可以(但不應該)做一個git push <branch> -f這將強制推(並覆蓋你的本地與遠程,有效地刪除提交2)。如果您在推送到遠程設備後從未做過提交3,那麼git將不會牽扯2,因爲它只能在本地12-1)之上附加(快速前進)2

有時我會在提交之前做一個git-stash來保存這個提交,但通常如果我知道某人已經做出了我需要的更改,並且我沒有在本地回購(沒有任何需要提交)上做過多的工作。這方面的一個例子的工作流程可能是:

git status # a few working changes 
git stash # save your working changes to a temporary commit 
git pull origin <branch> # merge in the remote, fast-forwarding your repo 
git stash apply # apply your working changes from before 

如果您對您的本地回購多次提交,技術上可以使用git-rebase獲得歷史「之下」你的提交,以避免這些額外的提交信息。因此,如果您在本地有3-1且遙控器位於2-1,則可以在您的3之前重新綁定您的本地分支以推動2,並且有3-2-1。然而,這並不值得(在我看來)麻煩,也不在這個答案的範圍之內。

+1

爲什麼一個rebase會成爲一個麻煩?它有兩個明顯的優勢;它提供了一個更清晰的歷史記錄,它更加友好,可以在提交本身時保持衝突解決。 –

+1

你應該總是變硬,它應該是你的默認工作流程。有兩件事情可以考慮,如果你認爲重新考慮一個麻煩:'git pull --rebase'和[git-smart](https://github.com/geelen/git-smart)。 – meagar

+0

這不一定是麻煩,但就問題的範圍而言。不要認爲它需要解釋來回答OP。 – Sam

1

其他人已經將更改推送到您所在的分支。當你做了git pull,git獲取了原來的變化,並將它們合併到本地副本中。這是爲什麼你正在運行git pull,這是明確的。

如果你看看你的命令之間的輸出,Git會清楚地解釋它在做什麼。

+0

所以如果我沒有在本地進行任何修改,然後做一些修改,它就不會合並? –

+0

除非有人在該窗口中進行了更改,但實際上您需要做的只是*嘗試*推送。 Git會警告你是否需要首先進行更改。 – meagar