簡體   English   中英

如何在不觸摸我的工作樹的情況下將命名分支A合並到B中?

[英]How to git merge named branches A into B without touching my worktree?

我想編寫一個Shell腳本,以便可以安排兩個分支之間的合並在特定時間發生。 但是,由於到達該時間后可能正在另一個分支工作,因此我需要在后台進行。

那么,有沒有一種簡單的方法可以將分支A合並到分支B中,而不必先結帳B?

使用索引執行真正的(非快進)合並-這是因為在文件沖突的情況下,您必須將其基礎和文件的兩面都存儲在索引條目中。 git merge是一個瓷器命令,它也觸及工作樹,但這對於管道級命令不是必需的。 因此,要將A合並為B您至少需要一個單獨的索引。

因此,您有以下兩種選擇:

  • 使用git-new-workdir contrib腳本將任意目錄轉換為“ shim”存儲庫,該存儲庫具有自己的工作樹, HEAD和索引,但使用原始Git存儲庫的對象存儲。

    IMO,這是最簡單的方法,除非您要編寫腳本以重復執行多次。

  • 使用管道Git命令和環境變量來烹飪適合執行合並的環境。

    您可以將索引工作樹放在一邊, 然后在其中使用git merge執行正常的合並; 在處理其他問題的同時,說明了如何設置單獨的索引和工作樹。

    或者,您可以選擇更嚴格的路線,並僅使用單獨的索引和管道級命令來執行僅索引合並。 要做到這一點的關鍵命令(在放置單獨的索引之后)是:

    • git read-tree -m執行實際的合並,以及
    • git write-tree使樹對象脫離索引,並且
    • git commit-tree創建引用該樹對象的提交。

您已經有了要保護的工作樹,請使用另一個工作樹。 git clone的便宜之處在於:

temp=$TMPDIR/temp
git clone -s . $temp -b B
( cd $temp; git merge origin/A && git push ) && rm -rf $temp

如果存在合並沖突,則不會刪除temp,請修復它們,然后推入rm。

如果您在推送失敗時已將B檢出,則在准備就緒時git pull $temp


克隆將執行完整的簽出,合並實際上不需要執行其工作。 很容易避免,

git clone -s . $temp -b B --no-checkout   # < add --no-checkout
cd $temp
git read-tree HEAD                        # < add read-tree HEAD
git merge
# ...

暫無
暫無

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

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