2015-02-11 48 views
-2

我想問你兩種方法有什麼區別。Git - 這些過程是否相同?

開始的情況是:

master branch 
| 
E F - test branch 
| | 
D C 
|/
B 
| 
A 

第一種方法:

git checkout test 
git merge master 
git rebase -i master 
git checkout master 
git merge test 

第二種方法:

git checkout test 
git rebase -i master 
git checkout master 
git merge test 

我想要做的是南瓜C和F成一個提交然後r在主機上進行簡單的描述,以便在主機上顯示爲一個新的提交。

但是,我爲實驗使用第一種方法(通常使用第二種方法),它最終壞了。使用第一種方法後,主人的一些變化丟失了。

所以我的問題是什麼區別?如果我在兩個方法都正確後得出最終的圖表,應該如下所示:

master branch 
| 
G = C + F + old master 
| 
E 
| 
D 
| 
B 
| 
A 
+0

我不完全理解最後的圖,因爲'D'顯示兩次。 – 2015-02-11 19:57:17

+0

@RichardFearn對不起,這是錯誤的,我編輯了問題 – 2015-02-11 20:03:49

回答

1

這很難說兩種方法之間的區別是什麼都不知道你在交互式rebase期間做了什麼。

但在第一種方法中,合併將向test分支添加一個新的提交(我們稱之爲M)。合併後,於是立即,回購將是這樣的:

master branch 
| 
| M - test branch 
|/ | 
E F 
| | 
D C 
|/
B 
| 
A 

(注意:master不變)

現在,當你做的互動變基,GIT中認識到,只有CF(而不是合併提交M)需要應用於master。在變基文件,而無需對命令的任何更改/提交名單,你結束了這一點:

master branch 
| 
E --- C --- F - test branch 
| 
D 
| 
B 
| 
A 

(再次提醒,master沒有改變。)

在互動變基,如果你改變picksquash/fix的承諾F,它會被合併到C。所以,你會擁有:

master branch 
| 
E --- C+F - test branch 
| 
D 
| 
B 
| 
A 

最後,合併testmaster之後,你結束了:

E --- C+F - test/master branch 
| 
D 
| 
B 
| 
A 

的兩種方法之間的區別在於,第一種方法創建一個合併提交在test分支,然後test重新分配到master時消失。

+0

對不起,我做了合併,我忘了寫它的問題。所以你的答案意味着如果現在我的主人出了什麼問題,我做了交互式重新定義(解決衝突)是錯誤的。 – 2015-02-11 20:10:29

+0

不確定。正如我所說的,rebase不應該從'master'中拿走任何東西,只是增加新的提交。 – 2015-02-11 20:12:32

0

將主合併到測試中,重新分配沒有意義。由於在合併時測試的更改已經存在。

達到你想要什麼,你需要使用--squash

  1. 結帳測試
  2. 合併或重訂主(無所謂哪一個)
  3. 結帳主
  4. 混帳合併測試 - -squash
  5. 用你想要的信息提交。

--squash將您所有的測試提交壓縮成一個,所以在您的歷史中它看起來像一個提交。