2013-12-16 38 views
3

每次,我看到merged狀態對我在Gerrit的變化和我做git pull origin,我可以清楚地看到,我的變化/分支並沒有實際合併到主。分支/更改沒有合併,雖然Gerrit聲稱,它是

請查看我的格里特的工作流程,並告訴我,我在做什麼錯誤或我缺少什麼:

  1. 創建本地&結賬分支。

    git checkout -b 77-blah

  2. 魔術和評論的所有變化。

    git commit -am "changes to 77-blah"

  3. 創建使用的用戶界面和其修訂設置HEAD同一分支(這should be automated soon)。

  4. 推變化(即特定分支),以格里特,在適當的裁判裁判:

    git checkout 77-blah

    git push origin HEAD:refs/for/77-blah

  5. 訪問URL,格里特給我,請查看我的改變或等待別人審查它。

  6. 再次訪問更改的URL,請確保Status = Merged

  7. 從格里特拉最新變化:

    git checkout master

    git pull origin

最後一個命令的結果與Already up-to-date,這(如果我不傻)意味着,我的主人是結束最新。在正常的Git回購中,在這一點上,這將是真實的。我的master分支會變成最新的,我最新的(77-blah)分支已經合併到它。

在Gerrit上,我刷新了我目前正在工作的網頁(當我在master上時),只是爲了發現在特定分支中引入的所有更改都已消失,並且整個網站處於狀態然後創建最新的分支。 Gerrit 只聲稱,我的master是最新的。

而且我可以證實的是,通過執行git branch -d 77-blah和獲得的結果是:

error: The branch '77-blah' is not fully merged. 
If you are sure you want to delete it, run 'git branch -D 77-blah'. 

其實,我必須合併本地我的最新分支手動。我錯過了什麼?

是什麼意思(在格里特而言),其變化合併,而它實際上不合並呢?

回答

3

在幾個類似的問題,一個共同的主題似乎是,你覺得你應該把你的本地特性分支到在Gerrit中具有相同名稱的分支,並且提交更改(即,使更改顯示爲合併)意味着Gerrit應該將更改合併到master。這是不正確的。

當您推送到refs/for/whatever並稍後提交該更改時,提交結束於分支whatever。不是master。如果您希望更改以master結尾,則應推送至refs/for/master。因此,Git聲稱master是最新版本是正確的(該分支不受您提交的更改爲77-blah的影響),Gerrit聲稱您的更改已合併也是正確的(該更改合併到77-blah)。

本地主題分支與維護在服務器上的分支無關。它們之間具有1:1的關係是很不尋常的,也是非常不可取的。事實上,在Gerrit服務器上創建分支(即擁有refs/heads/*的Push權限)通常是大多數用戶無法執行的特權操作。他們可以做的是推送到refs/for/*上傳他們的變化進行審查。當地他們可以創建他們想要的任何分支。

+0

所以,你說我可以創建儘可能多的本地分支,但總是使用'refs/for/master'並始終只推送主分支,並且不創建任何遠程分支?但是,如果我這樣做,我會遇到依賴關係的問題,並且在放棄更改時我會遇到很多麻煩](http://stackoverflow.com/q/20496959/1469208)。有人告訴我,使用分支機構解決了這個問題,因爲從一個分支機構放棄更改不會影響其他分支機構的更改。這是如何與你在這裏陳述的?生活的問題是:在Gerrit中分支還是不分支? :] – trejder

+1

如果您爲每個獨立更改啓動一個新的_topic分支_,您將不會以任何intercommit依賴關係結束。如果你仔細想想,當你推送一個或多個提交來檢查時,你本質上是分支存儲庫。只是你的分支是隱含的,短暫的,並且沒有用來附加名字。 –

+0

即使我每次更改每個主題分支,我仍然只需要推'master'分支(帶'--all'參數?)並始終使用'refs/for/master'?我是否正確地獲得這些東西? – trejder

1
  • 創建本地分支:git checkout -b 77-blah origin/master
  • 創建遠程分支,以及:git push origin 77-blah或經由格里特UI。
  • 做到了魔力,承諾吧。
  • 確保當地分公司是最新的 - git pull(我建議git pull --rebase
  • 推的變化 - git push origin 77-blah:refs/for77-blah
  • 提交更改到遠程分支
  • 從77嗒嗒合併變更主分支如果你願意,並且該步驟在你的工作流程中不正確 - git checkout master並且使用git pull來更新所有本地分支而不是git pull origin,因爲這將通過git被解析爲git pull origin/master,其中沒有新的改變。所以77嗒嗒合併到主 - 直接git merge origin/77-blah
  • 更改推送到遠程主git push origin master
+0

讓我檢查一下。通過「_submit the change to remote branch_」,你的意思是檢查用戶界面的變化並提交它(Gerrit會「合併」它,無論它意味着什麼)? – trejder

+0

是的,我的意思是 - 它會將chage合併到相應的遠程分支 - 而不是遠程主 – HiB