簡體   English   中英

git rebase和遠程推送

[英]git rebase and remote push

我是git的新手,我做了一個噓聲。 我開始了一個新的分支(poly_attr),檢查了它,做了一些提交。 當我還在那個分支的時候,我還做了一些應該去另一個分支的事情。 所以我提交了應該在poly_attr中的所有內容,然后創建並檢出了一個新分支(issue1),提交了更改,並推送了兩個分支。 猜猜我忘了做什么? 在創建issue1之前檢查master。 所以我的issue1分支脫離了poly_attr。 好的,簡單的修復,我認為,檢查master和rebase issue1到master。 不,現在我有一個問題1分支關閉poly_attr(遠程),一個關閉主(本地)。 如何從poly_attr獲取issue1分支?

換句話說,你從這開始:

... - M5 - M6               <-- master, origin/master

也就是說,有一些提交系列(我編號, M n )。 你創建了一個新的分支名稱poly_attr指向與master的提示相同的提交,並進行了更多的提交,我將標記為P n

... - M5 - M6                   <-- master, origin/master
             \
              P0 - P1           <-- poly_attr

然后你在issue1結束時開始了一個新的分支問題poly_attr (不是你打算開始的地方),並做了更多的提交:

... - M5 - M6                   <-- master, origin/master
             \
              P0 - P1           <-- poly_attr
                     \
                      I0 - I1   <-- issue1

然后你做了一個git pushpoly_attrissue1都推送到你的遙控器(第二個goof)。

遙控器現在提交I0I1 (遙控器上的分支標簽與你當地的相同),你不能從那里刪除它們,除非你可以登錄並做包括git gc在內的東西。 更糟糕的是,假設origin的回購是共享的, 其他人現在可能會擁有它們。 這反過來又意味着,你如何解決這個問題取決於你是如何確保沒有其他人有他們,你有多大的影響力有過任何人誰有他們,和/或你是如何不顧一切地有最終的分支歷史“看起來很簡單” 。

在您自己的回購中,很容易運行git rebase -i master issue1並選擇僅提交I0I1提交,或者甚至git rebase --onto master poly_attr issue1來繼承I0I1而無需編輯交互式rebase東西。 無論哪種情況,您的最終結果是:

... - M5 - M6                   <-- master, origin/master
            |\
            | P0 - P1           <-- poly_attr, origin/poly_attr
            |        \
            |         I0 - I1   <-- origin/issue1
             \
              I0' - I1'         <-- issue1

請注意,提交的I仍然存在 ,並且它們具有的剩余標簽是“遠程分支” origin/issue1

如果你確定沒有其他人從遙控器上獲取了issue1 ,並且你有足夠的權限,你可以在執行你的rebase后git push -f origin issue1:issue1 這將通過新的提交I0'I1'發送並使遠程移動他的issue1標簽指向I1' ,即你的新issue1分支的提示。 舊的提交( I0I1 )仍然會存在一段時間,但沒有人會看到它們,它們不會擋路,最終它們將被垃圾收集:

... - M5 - M6                   <-- master, origin/master
            |\
            | P0 - P1           <-- poly_attr, origin/poly_attr
            |        \
            |         I0 - I1       [invisible and eventually gc'd]
             \
              I0' - I1'         <-- issue1, origin/issue1

即使其他人已經抓住它,如果你有足夠的許可和權力,你也許可以強迫他們接受你的改變。 (“對不起,伙計們,如果你克隆並得到問題1,請注意我已經強行重新設定它,你必須弄清楚如何修復你所依賴的任何東西。”)

如果你不確定或沒有許可或其他什么,你將不得不忍受更糟糕的事情。 您不必進行新的提交( I n ' ),只需添加,在issue1鏈的末尾,提交撤消每個P n提交的效果。 你可以相當簡單地做到這一點,從原始(非重新定義)鏈開始:

... - M5 - M6                   <-- master, origin/master
             \
              P0 - P1           <-- poly_attr
                     \
                      I0 - I1   <-- issue1

只需使用git revert應用P系列中所做更改的反轉:

$ git checkout issue1
$ git revert master..poly_attr

這為您提供了新的鏈條:

... - M5 - M6                   <-- master, origin/master
             \
              P0 - P1           <-- poly_attr
                     \
                      I0 - I1 - RP1 - RP0   <-- issue1

其中RP1是一個恢復(反轉) P1的提交,而RP0是一個恢復P0的提交。 如果您在P1添加了一個文件,它將在RP1刪除。 如果您刪除了P0的一行代碼,它將被放回RP0 這意味着最終結果,即在檢出RP0時獲得的文件 ,就像在I0I1中在提交M6之上進行了更改一樣。 當然,歷史看起來非常不同,並且(在恢復提交中)解釋為什么會發生這種情況是個好主意。 但最終的結果是一樣的,你只是在I n鏈的末尾添加新的提交,這意味着擁有提交的其他人可以毫不費力地獲取新的東西。

暫無
暫無

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

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