簡體   English   中英

Git:在合並后的分支上工作,之后就沒有了

[英]Git: Work on merged branch, which was unmerged afterwards

我遇到了以下問題:我在分支機構A工作。分支機構A合並到主分支機構,到目前為止一直很好。

一段時間后,客戶決定撤消更改,在主分支的分支A中完成,因為它必須更新。

所以Master分支的歷史看起來像:

Some stuff
Some other stuff
Some stuff, where the merge of Branch A was reverted
Some other stuff
Some other stuff
Branch A was merged into master
The commit of Branch A (Branch A contains one Commit)

我想要改變分支A,所以我想要這樣的東西:

The commit of Branch A (From here I want to continue working)
Some stuff
Some other stuff
Some stuff, where the merge of Branch A was reverted
Some other stuff
Some other stuff
Branch A was merged into master
The commit of Branch A (Branch A contains one Commit)

請注意,我不想更改遠程主服務器的歷史記錄,我需要在我的主服務器的最后提交時提交分支A作為rebase。 然后我想再次將我更新的分支A推送給Master。

現在我想繼續研究分支A,但首先我要在當前主分支上重新定義分支A,以獲得最新狀態。

問題是現在:當我在master上重新分支我的分支A時,git似乎刪除了我在分支A中所做的更改。我認為這是因為Master分支中的合並反向。 所以:Git看到,在主分支中刪除了分支A,所以當我在主分支上重新分支A時,刪除也將完成。

我不想將我在分支A中更改的文件一個接一個地復制到另一個分支上,這是從主服務器中檢出的。 我認為有更好的解決方案,任何建議?

嗯,這有點棘手。 由於您的BranchAHEAD已經是master一部分,因此git認為master的代碼比BranchA更新。 在這種情況下,如果你們重置主分支中的更改而不是使用顯式提交恢復它們,那會更好。

以下所有選項都涉及重寫歷史記錄,因此首先在一些臨時分支中嘗試它們。

一種選擇是使用rebase --onto更改主分支,以便刪除合並和恢復提交。

git rebase --onto <commit_id_before_merge_commit> <revert_merge_commit_id> master

其次是更改BranchA的提交哈希,以便git不會像在master中那樣識別它們。

git checkout BranchA
git reset HEAD^n # n is the number of commits that are exclusive to branchA
git add -u # Add all the files. Make sure to add newly created ones.
git commit -m 'some message'
git rebase master # should work now

第三,您還可以使用交互式基礎更改BranchA的提交ID

git rebase -i <first_exclusive_initial_commit_id_of_branchA>

如果你使用git checkout branch-a && git rebase -i master ,你將在文本編輯器中獲得一個提交列表,每個提交前面都有一個pick命令。 您可以將其更改為多個選項之一,所有選項都在給定文本中進行說明。 例如,您可以skip還原提交,並且不會還原這些更改。

另一個可能的解決方案是重新綁定,然后git revert提交,它恢復了branch-a的合並。

由於您不想觸及master的歷史記錄,因此需要將更改重新應用到master的頂部,而忽略它們已經應用並還原的事實。 根據還原提交的確切性質,讓我們調用它<revert> ,我看到了兩種方法來實現這一點:

  1. 如果<revert> 取消您的更改,那么您可以再次還原它以獲得重新應用更改的提交(想想--x == x )。

  2. 如果還原提交不是純粹的,我會像這樣處理這種情況:

    • 使用git format-patch為您的分支創建補丁序列。

    • 使用git am將此補丁序列應用於master。

    關鍵是, git am與歷史無關:它只查看當前提交的狀態並將補丁應用於該狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM