2012-03-15 51 views
1

我正在研究我們當前即將發佈的發佈分支「base」。最後一刻,我的功能被拔出,我在基本分支上有一些未推送的更改。這是一個很大的集合,包括大約400次提交的巨大合併。由於它被推動,我無法將其推到基地。另外,我不想重新合併。如何在不影響主線代碼的情況下使用git分支提交我的代碼

所以,我在想,如果我能做到這一點:從具有合併的更改樹

,分出一個新的分支,說:「釋放後」,然後按它的倉庫,但不會改變基地。可能嗎?我想防止意外提交基地(我有時會看到多次更新在一次推送中得到更新)。

此圖可能有助於觀察問題。由於基地將被釋放,我不想推進我的本地變化,但保留在某些分支(我可以推到回購)的這些變化。

理想情況下,我應該開始創建基於「基」分支的分支,然後再合併它,但我沒有這樣做。

+0

有點混亂:你可以添加一個圖表顯示你的分支結構? – 2012-03-15 23:00:01

+0

@MattGibson,謝謝,用圖表編輯了這個問題。 – 2012-03-15 23:09:38

回答

1

首先,如果您所擔心的是保存合併,那麼這就是rerere的作用。除此之外,你想要做的是:在分支中「保存」你的修改很容易。

只需git branch my_new_branch,然後git reset --hard base(確保所有的工作副本更改都先提交!reset --hard刪除非索引更改!)。現在您有兩個分支,當前的HEAD位於(及其後)base,第二個分支(my_new_branch)仍包含您的未修改更改並跟蹤base。您可以多次使用git mergegit rebase,以便在重新整合前保留my_new_branch最新的base

1

我不知道我理解你的問題。從你的圖表中,我們嘗試構建一些新的圖表。顯然你有,在遠程共享回購:

[master] * --- [possibly more commits] 
      \ 
[release1] * --- A --- B --- C 
        \ 
[base]    D --- E 

而且是在自己的私人回購協議:

[master] * --- [possibly more commits] 
      \ 
[release1] * --- A --- B --- C 
        \ 
[base]    D --- E 
         \ 
[devel]     F --- G --- I --- J 
         \    /
          --- H -------- 

使分支「devel的」的尖端提交j,它是FGI的合併+ H,全部指向D(在「基地」),其指向「A」(在版本1中)。現在有人計劃通過合併ABC + DE來發布他們將要發佈的「release2」?

如果您希望您的「devel」分支基於該合併,您只需將該合併結果(尚不存在,因此您必須等待)重新綁定。

或者,也許你的意思是上面的遠程共享回購或多或少是準確的,但你不要有你自己的「devel」分支。也許你的(本地)回購承諾樹看上去更像是這樣的:

[master] * --- [possibly more commits] 
      \ 
[release1] * --- A --- B --- C 
        \ 
[base]    D --- E --- F --- G --- I --- J 
            \    /
            --- H --------- 

如果你希望它看起來像這個:

[master] * --- [possibly more commits] 
      \ 
[release1] * --- A --- B --- C 
        \ 
[base]    D --- E 
          \ 
[devel]      F --- G --- I --- J 
           \    /
           --- H --------- 

,那麼你可以通過創建一個「devel的」分支啓動掛起關閉提交E:

git branch devel E # use the commit-ID for commit E 

,然後重新指向本地分支 「基地」 提交E:

git branch -d base; git branch base E # again you'll want the sha1 
# or: git update-ref refs/heads/base E 

你完成了(現在,無論如何;你最終仍然必須重新綁定你的「devel」分支)。 (我認爲這可能對理解分支有很大的幫助):我已將分支標籤放在圖中每個樹級的左側,但事實上,分支標籤位於「右側」 (在每個分支的「尖端」,就像它一樣)。當您在分支上執行「git commit」時,會添加一個新的提交,然後更新分支提示。我懷疑大多數人會「考慮」分支,就像標籤設置一次,當你執行「git分支」命令,然後永遠呆在那裏 - 但這不是他們的工作方式。分支標籤緊跟分支的頂端。如果按照我在這裏繪製它們的方式繪製提交樹時,分支的「水平部分」是必須根據提交樹結構進行處理的東西。

相關問題