2012-03-06 64 views
7

背景:我們使用github上爲我們的項目,我對我自己我們的主要倉庫的叉工作。我們使用rebase而不是merge來避免大的合併提交。git的變基長壽命(遙控)功能分支

方案:我想要的工作方式是這樣的:

  1. 當執行一個新的功能,創建我的叉子的主人的當地分支機構,並把我的變化出現。我和該組中的其他人進行了許多小的提交,因此幾乎總是會有多個提交影響分支上的同一個文件。
  2. 推動當地分支機構到我的叉子,所以我有什麼我工作的遠程副本(我不希望有,如果我的筆記本電腦去世或失去了所有的更改將丟失。我試圖在年底要做到這一點每天)。
  3. 如果它需要很長的時間來完成的功能,我偶爾會重訂在我的叉子的主人,以確保一直沒有改變,可以打破我的特點。這通常工作正常。
  4. 爲了讓分支的遠程副本保持最新,我將我的本地分支推到了rebase之後。

問題:第4步是我遇到問題的地方。我幾乎總是必須處理非快速轉發的提交併使用git push --force。

我已經看了

Git: how to maintain permanent parallel branches

How to maintain (mostly) parallel branches with only a few difference

,並沒有發現一種方法,使我的工作流程的工作。在git工作流上進行谷歌搜索通常會返回假設您都在本地分支上工作並且不在github上保留遠程副本的結果(例如http://nvie.com/posts/a-successful-git-branching-model/)。

我是比較新的Git的,所以我想知道如果我在這裏失去了一些東西。我希望能夠在沒有--force的情況下執行第4步。另一個工作流程仍然允許我使用rebase而不是merge,並保留我的本地分支的遠程副本,這也是非常有用的。

回答

8

git push --force在處理rebase和遠程分支時是生活中的事實,因爲git push在沒有它的情況下不會執行非快進操作。 git中的大部分內容都假設歷史只附加到,沒有編輯過,並且rebase會打破這個假設,所以你必須做一些相當不可思議的事情才能使它工作。

我們以前使用的基本工作流程與您所描述的非常相似,但最終會在一段時間後切換回合併工作流程。重新激活給你一個很好的,漂亮的,線性的歷史記錄,但是有很多缺點,例如需要--force,在master中合併之前失去了看到分支狀態的能力等等。

正如琥珀提到的那樣,rebase使得與同一分支上的其他人一起工作非常困難 - 在git push --force之前,您必須查看遠程分支的狀態,以查看是否有其他人首先推送到該分支,和pull --rebase那,然後git push --force。即使這有競爭條件 - 如果其他人在你之前推動push --force,他們的變化將被你的覆蓋。

+1

您可以通過使用'--force-with-lease'來避免競爭條件,如果上游比您的本地更新,則會失敗。 – mLuby 2017-08-22 22:07:03

6

如果您是rebase ing,那麼當您推送時,您將始終必須--force,因爲rebase會重寫歷史記錄。這就是它的工作原理。根據定義,重寫的歷史不會在相同的歷史之上快速前進。

另一種方法是merge代替rebase ING。您可以使用完全相同的工作流程,除了合併而不是重新綁定之外,您不必強制推送。

如果沒有其他人正在使用您的遠程分支除了你,然後使用--force本身不是壞的。如果使用遠程分支的其他人,則無論如何您應該使用merge