從我收集的,這是在你的倉庫情況:
develop
↓
A -- A -- B -- C -- C
\
F -- F -- F
↑
feature1
因此,提交A
上提交開發以前存在。 B
是開發的基礎提交在創建特徵分支時處於打開狀態。F
是在功能分支上提交的提交,並且C
是在功能分支已經創建並正在處理之後在上開發的提交。
現在,你想要做的是繼續在功能分支上工作,同時取決於提交C
引入的更改。是對的嗎?
在這種情況下,假設你是不一樣的開發者爲用戶1,引進這些變化爲特徵的分支最安全的方式是簡單地將它們合併。因此,儘管有特徵1查出來,只是合併發展使用`git merge develop *。然後,歷史記錄如下所示:
develop
↓
A -- A -- B ---- C ----- C
\ \
F -- F -- F -- M
↑
feature1
因此,您只需簡單地合併更改,然後就可以繼續使用它。事實上,你可以繼續做這一行多次既是特徵1和發展成長:
develop
↓
A -- A -- B ---- C ----- C -- C -- C -- C
\ \ \ \
F -- F -- F -- M -- F -- M -- M -- F
↑
feature1
而且一旦你與功能分支了,你可以將其合併到發展:
develop
↓
A -- A -- B ---- C ----- C -- C -- C -- C ------ M
\ \ \ \ /
F -- F -- F -- M -- F -- M -- M -- F
當然,這使歷史看起來有點凌亂,但它代表了正確的特性分支是如何隨着時間而演變,而相關的變化仍然發生在發展。
如果你想避免這樣的歷史,有幾種選擇。如果您只需要很少的更改,例如有些是在單個提交中引入的,而其他提交與您無關,您也可以在功能分支上挑選那個提交。櫻桃採摘允許你拷貝一個提交,基本上重用它,同時仍然作爲一個單獨的提交。
比方說,您只需要從上面顯示的第一個圖表中第一次提交C
。然後,你可以做git cherry-pick C1
超過它複製到新特性分支:
develop
↓
A -- A -- B -- C1 -- C2
\
F -- F -- F -- C1'
↑
feature1
這將創建一個副本C1'
其中包括同樣的變化其原有C1
(但仍是一個不同的提交對象)。然後,您可以繼續使用包含這些更改的功能分支進行工作。
最後,剩下的選擇是rebasing。重訂重寫的歷史,所以再次從第一個圖開始,你可能最終與運行git rebase develop
如下:
develop
↓
A -- A -- B -- C -- C
\
F' -- F' -- F'
↑
feature1
要記住的重要一點是,歷史上真正改寫,所以特性1上的所有提交都被修改,而被重新創建爲。這導致它們是具有不同提交標識符的完全不同的對象,使它們與分支的先前狀態不兼容。
這會導致其他開發人員(尤其是那些正在致力於功能部件的「用戶1」)在分支上嘗試合併您的更改時遇到衝突。修復這將需要他們手動修復它,除非你告訴他們,他們可能甚至沒有注意到(使歷史非常混亂,並因此而被破壞)。
所以,除非你知道你在做什麼,否則你應該絕不會重新提交在之前發佈的提交。即使這意味着你的歷史看起來不太好。
正如旁註:*無*是「遠程」分支。 (事實上,「遠程分支」實際上並不是一個Git術語,有一種叫做遠程跟蹤分支的東西,這就是你所看到的名稱,如「origin/develop」和「origin/master」。你的Git從其他Git獲得的最後一次Git與其他Git的最後一次交談這意味着你永遠不會改變它當你的Git再次與其他Git交談時,讓你的Git更新它們,但是,只有其他Git應該以任何方式更改它們。) – torek