2012-10-31 72 views
39

我最近重新設計了一個我正在研究的分支。樹的歷史看起來是這樣的:重新綁定後我是否失去了更改?

1 = 2 = 3 = 4 
    \ 
     5 = 6 = 7 
      \ 
      8 

我想變基我的變化(圖中的數字8)要對主分支(到圖上提交4現在)。所以,我做了以下內容:

git checkout my_branch 
git rebase master 

<很多git的合併工具的/混帳變基--skip解決衝突>

只有現在,當我運行:

git checkout my_branch 
git diff master 

我得到零個差異。我還沒有失去我的分支(我仍然可以從我保存的補丁重新創建我的更改),但是我找不到我所做的合併/重新分配。我做錯了什麼?我的變更是否與主人合併,還是必須重新執行?

+0

當你做了'git rebase --skip'(而不是'--continue')是否有可能「跳過」了在rebase期間實際上仍然有意義變化的變化? –

+0

查看此答案:http://stackoverflow.com/a/4851776/450609。我必須使用git rebase --skip才能跳過我手動合併的更改。 – dave

+1

如果你手動合併,你通常要「繼續」。如果合併的結果是「不變」,則只需跳過。你跳過了多少變化,你實際應用了多少變化? –

回答

97

如果你沒有看到任何區別,我懷疑你失去了你的改變。您可以使用git reflog來標識rebase之前存在的分支,並使用git reset --hard <my-branch-tip-before-rebase>來取回原始分支。是的,你將不得不再次通過這個過程。 :-(

我不太清楚你如何結束了與他們長得一模一樣,雖然我沒有料想到會看到你給的命令如下:

1 = 2 = 3 = 4    (master) 
    \  \ 
     \  5' = 6' = 8' (my_branch) 
     \ 
     5 = 6 = 7 

在這種情況下,你或許應該已經使用rebase --onto

git rebase --onto master <commit id for 6> my_branch 

那會離開你看起來像這樣的圖表:

1 = 2 = 3 = 4    (master) 
    \  \ 
     \  8'   (my_branch) 
     \ 
     5 = 6 = 7 

就失去你的改變而言,處理合並衝突確實需要一些練習,特別是當你有幾個看起來幾乎相同的大塊時。我總是訴諸於看一個提交引入的實際差異,試圖梳理出這種變化,並以適當的方式將它與分支上已有的內容合併。我可以很容易地看到你的改變可能在那裏失去了。

有一點要記住。如果你不希望發生一連串的合併衝突 - 因爲你不覺得信息源有足夠的分歧,那麼看到的是一個警告標誌,說明做錯了什麼。通過執行git rebase --abort,對分支進行調查並再次檢查是否您期望有衝突,這是很好的備份。確保記下發生衝突的位置(在rebase將你引導到命令行之前,通常會有「應用...」)。這通常是一個開始的好地方。

有時候,衝突是不可避免的,而且很繁瑣。但我懷疑在練習時,你會遇到這樣的問題。

有關在分支之間移植更改的更多信息,請參閱git rebase手冊頁。搜索「rebase --onto」。第一次打擊應該讓你在一個討論將變更移植到另一個分支的章節中。

+0

你說得對;我使用了錯誤的命令。我需要說 - - 。我已經得到了我的基金會補丁:)(並且我必須重做它,但第二次修復衝突要容易得多)。 – dave

+0

太棒了!很高興幫助!是的,我發現同樣的事情:第二次衝突肯定更容易。一個有趣的特點是rerere。 Scott Chacon在該設施上有一篇[好文章](http://git-scm.com/2010/03/08/rerere.html),如果你發現你遇到了這個問題,這對解決衝突非常有幫助。一遍又一遍。 – jszakmeister

+6

'git reset --hard xxxxx'救了我!我以爲一切都已經消失了!即使'git reset xxxx'沒有'--hard'也不行! – Chloe

相關問題