2016-12-02 45 views
0

描述爲git rebase--abort選項如下:如何退出rebase但未檢出原始分支?

中止和退房的原分公司

如何一箇中止衍合沒有檢查出分支?( 「原始」 分支在這裏實際上是底墊中指定的主題分支。)

一個典型的用例:

  1. 我開始master簽出:

    o---o---o---o---o---o---o---o---o---o---o---o---o---o (HEAD, master) 
        \ 
         o---A 
    
  2. 我輸入git rebase master A以將A重新分配到master

  3. 我要麼收到大量的衝突,要麼沒有時間去工作,而是決定把A放回去,並讓它再過一天。

  4. 實質上,我想中止並返回到我所在的位置(即master)。但是,我想這樣做,而不需要在A獲得傾銷的中間步驟,因爲它非常遙遠,很多文件已經更改,我不想重新啓動或以其他方式對IDE和其他自動工具刷新和自動構建功能可以處理各種不愉快的事情。

+0

我想你可能會誤讀 - 'abort'檢出「原始」分支,而不是「原點」。所以你會在中止後返回你的主分支。 – user2045006

+0

@ user2045006'--abort'選項的文檔中顯示「*如果* * * *在啓動rebase操作時提供,那麼* HEAD' *將重置爲*''。 – Leon

+0

不幸的是,沒有好的方法可以做到這一點。你只能'rm -rf .git/rebase-merge && git checkout -f master'。 – j6t

回答

1

你不能。您只能設置git rebase --abort,這將使HEAD設置爲指向分支A,而A指向與之前相同的舊提示提交。這是因爲git rebase在實際啓動真正的rebase進程之前首先執行git checkout A,然後忘記您曾經在其他任何地方。

而且,這樣的:

從本質上說,我想放棄,回到我在那裏(即master)。但是,我想這樣做,而不需要在A獲得傾銷的中間步驟,因爲它非常遙遠,很多文件已經更改,我不想重新啓動或以其他方式對IDE和其他自動工具刷新和自動構建功能可以處理各種不愉快的事情。

...不幸已經完全吹出來的水,因爲git rebase工作通過檢查出其他部門和承諾。 (它過去常常檢查你給它的分支名稱參數,但現在它有點複雜了。)重建過程通過將你的頭部分開在--onto目標(如果你沒有給出一個上游--onto),然後對每個要複製的提交執行一系列的操作git cherry-pick

每一步都嚴重影響你的工作樹和你的索引,因爲checkout,cherry-pick和合並機制都使用這些。這意味着無論是否完成rebase,您的工作樹和索引都可能與您開始時的方式完全不同。

鑑於目標是擊敗IDE的不良行爲,使這項工作的訣竅是在單獨的工作樹中進行重新綁定。單獨的工作樹(顯然)與IDE的工作樹分離,並且也有其自己的單獨索引。無論基礎工作是否有效,您的IDE都會充滿無知,因此不會受到干擾。

要獲得單獨的工作樹可以使用git worktree add如果你的Git版本夠新,或者只是在一個單獨的克隆工作(如果可能的話本地克隆將通過硬鏈接共享大部分庫數據)。

+0

你確定'git checkout A'?每次我使用它時,'git rebase'首先執行'git checkout ',這是'git rebase master A'的'master'。或者,如果我已經指定了 - --onto的提交。如果我已經在主人身上,這實際上是沒有用的。無論哪種情況,工作樹永遠不會在'A'附近,直到我'--abort'。 – antak

+0

@antak:這就是爲什麼我說「有效」:效果就像*你自己一樣,單獨運行'git checkout A',然後通過執行'git checkout --detach '來開始rebase並且做其餘的工作。 Git會記住要返回的位置(在完成或中止之後)爲「將HEAD設置爲'A'」。 (很久以前,爲了提高效率,在腳本被想象出來之前,它實際上做了'git checkout',就像我記得的那樣)。 – torek

+0

好吧,一部分混亂似乎是我想'A'是一個*提交*表示問題中的位置,而您將「A」作爲分支名稱進行討論。即使這樣,當rebase檢測失敗時(例如'--abort'),實際上沒有理由檢出commit或branch'A',特別是當我沒有在分支'A'上啓動時。這一點以及歷史上的情況只是間接的。我喜歡你使用一次性工作樹的建議,但前兩段的前提只是一種可能的觀察方式,在實踐中並不完全正確。 – antak

0

不幸的是,在Git 2.11版中,rebase doesn't have的選項類似於cherry-pick --quit,因爲此時停止。

我們可以做到這一點手動但是:

$ rm -r .git/rebase-apply 

$ git checkout -f 

rm -r .git/rebase-apply是使混帳忘記,這是在一個變基的中間。這是必需的或者會出現一些怪異現象,例如無法啓動新的rebase。這個目錄實際上是記錄在git-rebase documentation作爲git rebase --abort刪除路徑:

要檢查出原來並刪除git的/底墊申請工作文件,使用命令git rebase --abort代替。

我們不能這樣做,因爲沒有「檢出原件」是問題的要點。

git checkout -f用於重置工作樹和索引。 (即刪除任何髒文件。)如果您想跳到其他地方而不是停留在停止的地方,則可以在此指定checkout<branch>參數。