[英]Can I move pushed commits from one branch to another existing branch?
我有3個分支: develop
, feature-1
和feature-2
。 我當時正在研究feature-1
,然后切換到feature-2
。 然后,我完成了feature-2
工作,提交並推送到存儲庫,然后為該功能創建了一個合並請求。 然后,我看到feature-2
包含一些應該在feature-1
提交。 我可以將它們從feature-2
本地移動到feature-1
,然后在存儲庫中反映相同的移動嗎?
git cherry-pick <commit-id>
是您的朋友,親愛的。
feature-2
移動到的commit-id(s)
復制到feature-1
現在,櫻桃選擇您在上面的步驟2中復制的所有提交。
git cherry-pick <commit-id>
如果您有多個提交要移至feature-1
則將所有提交ID依其提交日期/時間排列。
例如:
git cherry-pick <commit-id-1> <commit-id-2> . . <commit-id-n>
您的問題是,所涉及的提交屬於feature-1
而不屬於feature-2
branch 。 接受的答案不能完成此任務。
cherry-pick
是在一個分支上創建新提交的一種好方法,該提交可以復制另一分支上的提交所做的更改。 但它不會更改另一個分支。
例如,如果您開始
x <--(master)
|\
| A1 -- A2 <--(feature_1)
\
B1 -- A3 -- B2 <--(feature_2)
A3
是用於feature_1
,在執行了選擇cherry-pick
步驟之后,您將擁有
x <--(master)
|\
| A1 -- A2 -- A3' <--(feature_1)
\
B1 -- A3 -- B2 <--(feature_2)
因此feature_1
看起來像您現在想要的一樣,但是feature_2
仍然有一些可能不應該的更改。 將兩個功能都合並到master
時,這可能會引起一些麻煩。 (我的意思是,可能存在合並沖突,但並沒有多大意義git
確實會在這里提供幫助,但它並不完美。)
在您的問題中,您注意到提交已經被推送,並且響應於“ cherry-pick
回答,您詢問更改是否可以干凈地push
; 因此,我認為您已經(至少在某些情況下)遇到過在您推送的分支上重寫歷史記錄的問題。
雖然這是事實,該結果cherry-pick
會push
干凈,那是因為在cherry-pick
沒讓你自找的(如上所述)的所有更改。 這是對feature-2
的修復,實際上導致了push
問題。
一種解決方案是使用cherry-pick
來修復feature-1
,然后使用revert
來修復feature-2
。 在我們的示例中,使用feature-2~1
作為標識要“移動”的提交的表達式(通常可以使用提交ID或適合實際情況的表達式):
git checkout feature-1
git cherry-pick feature-2~1
git checkout feautre-2
git revert feature-2~1
給你
x <--(master)
|\
| A1 -- A2 -- A3' <--(feature_1)
\
B1 -- A3 -- B2 -- !A3 <--(feature_2)
這仍將push
干凈(因為沒有提交從任何一間分行的歷史刪除)和兩個分支現在有正確的改變。 從好的方面來說,這使您不太可能遇到合並問題; rebase
一面是,某些rebase
操作現在可能會出現問題。 還有,你可能采取的減輕步驟,但如果你擔心只是做的更改push
干凈,那么你不會做那種rebase
反正。
如果有很多提交要“移動”,那么您可能想要用交互式rebase
替換cherry-pick
,如下所示:
git checkout feature-2
git branch temp
git rebase -i feature-1 temp
將打開一個編輯器,顯示一個用於rebase
的“待辦事項”列表。 列表上的每個條目都是有關如何處理提交的說明。 刪除要“留下”的提交行。 (您還可以對提交如何在feature-1
上表示的方式進行其他調整;但這是一個漫長的兔子漏洞,因為到目前為止您所要問的是如何“移動”提交,因此只需執行以下步驟即可“按原樣”。)
當你保存並退出編輯器,在rebase
將開始,重寫所有選定的提交。 完成更新到feature-1
git checkout feature-1
git merge temp
git branch -d temp
您仍然需要轉到feature-2
來還原不應存在的提交; 您可能想在帶有-n
標志的單個命令中執行此操作,以便僅創建單個還原提交。 (這將有減少我上面提到的風險一定的,的副作用rebase
演戲了,你做的作業后revert
;但同樣,我希望你不會做這些類型的rebase
都會給出這個隱含的約束題。)
現在,有些人不喜歡將revert
用於這種情況,因為歷史記錄顯示了發生的情況-包括進行更改以及以后刪除更改,這似乎很煩人,因為不應該進行更改。
避免的唯一方法是“改寫歷史”的feature-2
,無論你怎么做,不會push
干凈。 你可以得到它的push
,但這樣做你會為所有誰擁有副本的其他開發人員創建工作feature-2
-如果他們這樣做了錯誤的事情,這將撤消你的工作。 因此,如果要重寫歷史記錄,則必須與使用該存儲庫的其他所有人進行協調。 有關此問題的更多信息,請參見“從上游rebase恢復”下的git rebase
文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.