[英]git merge against an arbitrary base revision (git-svn)
我正在使用git-svn對我公司的Subversion存儲庫進行離線開發,Subversion存儲庫是項目的記錄存儲庫。 為了實現管理可見性,我需要在SVN中維護我的功能分支。 有時我需要在分支的生命周期內多次將來自主干的更改合並到功能分支。 由於我需要在SVN中保持分支最新,我必須合並; 一旦他們被推向SVN,我就無法重新提交。 此外, git svn dcommit
從合並提交中刪除第二個父級。 這意味着在第一次git merge
之后的git merge
將分支根標識為合並基礎而不是最近的合並父級。 因此,它嘗試重新合並已經合並的更改,這幾乎可以保證令人討厭的沖突。
當我合並SVN時,我手動指定基本修訂:
svn merge -r 49262:49608 $svn/trunk
有沒有辦法讓git與手動指定的基本修訂版合並?
請注意,我需要指定兩個修訂版本,包括基本版本和父版本。 我有一個歷史
trunk: A -- B -- C -- D -- H -- I
\ \
feature: E -- F -- G -- J -- K
但是git svn dcommit
刪除了G
和D
之間的父關系。 我需要在D
的基礎上運行I
到K
的合並。 簡單地跑
$ git checkout feature
$ git merge trunk
將嘗試將I
與K
合並為B
而不是D
,這將重新應用C
和D
從而導致極端合並沖突。 使用SVN,我會運行一個命令
$ svn switch $svn/feature
$ svn merge -r D:I $svn/trunk
但是git merge
沒有指定基本修訂版D
的選項。 我正在尋找類似的東西
$ git merge --base D trunk
但這樣的選擇似乎並不存在。
(編輯:對於較低級別的方式,看到以前的修訂,這種方式最快)
使用正確的合並基礎上的feature
樹作為nonce提交
git checkout `git commit-tree -p $D -m - feature^{tree}`
像往常一樣合並干線
git merge trunk --no-commit git commit # the two-stepper gets the commit message someplace known
將合並樹提交為新feature
提示
git commit-tree -p feature -p trunk -F .git/COMMIT_EDITMSG HEAD^{tree} \\ | xargs git checkout -B feature
您可以嘗試git merge <commit hashcode>
,其中可以使用git log
找到提交的哈希碼
更新:
根據您的修訂,我認為您正在尋找的是以下內容。 首先做git branch D
您應該能夠通過執行git status
獲取D的提交哈希。 然后,做git checkout feature
。 然后執行git merge newBranchFromD
。 這將使特征的狀態從主干中的D進入合並狀態。
為了保持更清晰的提交歷史記錄,您還可以在簽出功能分支后執行git rebase newBranchFromD
。 請注意,這會將H插入到提交歷史記錄中的正確位置,以便您最終得到:
trunkAtD: -- H -- I / trunk: A -- B -- C -- D -- H -- I \ \ feature: E -- F -- G -- H -- I -- J -- K
這與合並提交略有不同,因為rebase會在提交歷史記錄中按時間順序放置所有提交。 另一個選擇是在提交時使用--squash,以便合並不會嘗試自動提交。
謹慎使用rebase,因為當你知道它發生了什么時它沒有被使用會導致意想不到的結果。
這就是我們所做的。 我們首先發現合並提交的哈希失去了它的'merge' - MISSING_MERGE,其次我們發現了提交已經合並的提交 - MERGED_POINT。
然后我們去了接收分支並創建了一個假提交
git merge -s ours MERGED_POINT --no-commit
git commit -m "Fake commit because MISSING_MERGE is not marked as a merge commit"
我們可以看到
git merge-base OURS THEIRS
我們現在又有了正確的基礎。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.