2012-11-30 33 views
2

我通常的方式創建一個git特性分支:我的git分支是如何忘記父母的?

git checkout develop 
git checkout -b new_feature_branch 

當時間來到合併功能回到主開發分支,合併產生了巨大的衝突(方式更多量,因爲高於預期總線沒有太大變化)。

在調查中,似乎我的功能分支設法成爲父母的孤兒。從歷史上來看,這個分支的前24個承諾都是缺失的,因爲主線的初始分支也是如此。

我知道它正是24提交,因爲它們在git reflog --all | grep new_feature_branch中列出。

由於缺少這些早期提交,分支現在似乎開始於整個存儲庫的重複,當我嘗試將其合併回開發時,會產生大量衝突。

這是怎麼發生的?

如何恢復丟失的提交?

+0

你有'git branch -b'或'git checkout -b'嗎? –

+0

糟糕。不,它是一個'git checkout -b'。謝謝! –

回答

2

這是怎麼發生的?

  • develop分支 - 你確定你的本地副本(而不是說origin/develop)上漲了最新的,當你支?
  • develop絕對是你想要的父分支(而不是master或別的東西)?
  • 分支之後,您是否重新分配了develop?這可能改寫了develop的父承諾,但不是new_feature_branch的歷史記錄。
  • 您是否在某個時間點重新設置了new_feature_branch,並且意外地在您的分支點之前重新編寫了父提交?

如何恢復丟失的提交?

只是衍合分支所需的分支點(見this question,或this book等)

+0

感謝您的參考。 「rebase --onto」是解決方案的一部分(公佈完整步驟)。這仍然是一個謎。我通常不使用rebase,並且repo在創建時絕對是最新的。 –

0

好了,這裏就是我所做的修復它:

  1. 運行git reflog --all | grep <new_feature_branch>獲取特性分支上的完整提交列表,包括歷史記錄中缺少的早期提交。
  2. 打開.git/logs/HEAD並搜索最早的可見提交以找到其原始父代的完整SHA(hat tip)。
  3. 簽出父提交(現在從分支歷史記錄丟失的提交),然後從此提交中籤出新的「恢復」分支以創建新基本。做完這些之後,'lost'提交作爲恢復分支的一部分重新出現在樹中,從develop分支正確地分出。
  4. 運行git cherry-pick <SHA>,使用「孤立」分支中最舊的提交將該分支的基底複製到恢復分支的頂端。解決合併衝突。
  5. 檢出孤兒分支。
  6. 運行git rebase --onto <new-parent> <old-parent>其中new-parent是我剛剛複製到恢復分支上的提交,而old-parent是我從該複製提交的孤立分支上最早的提交。完整的分支歷史成功移植,衝突最小。
0

要恢復,只需使用一個graft or a replace它允許您重新指定孤立分支的基礎(根)的父母。

如果一旦合併後不需要保留特徵分支,那麼一個簡單的移植就足以讓您看到正確的分支結構。

但是,合併時的父鏈接仍然會保持孤立分支,並且您的回購將會有兩個根提交[可能不是您所期望的]。

簡單的改進是做一個或移植後filter-branch(你的孤兒到其應有的分支點)rebase

這聽起來像你不小心簽出了原始分支點的具體提交而不是創建分支(提示),以便你有一個detached HEAD的情況,並且在出現一些錯誤消息後以不適當的順序修正了ups - 這很容易做到。

相關問題