2016-03-12 42 views
1

組合讓我們假設,我們有這樣的提交歷史:混帳:調整基線以上的提交

A---B---C (master) 
    \ 
     D---E (branch) 

我們要壁球提交B和C到B/C它們的組合,然後我們我們希望獲得類似如下的結果:

A---(B/C)  (master) 
     \ 
     D---E (branch) 

是否有可能獲得? 你能幫我推薦一種方法嗎?

回答

2

你需要做到以下幾點:

git checkout master 
git rebase -i commit_A master 

在哪裏commit_A '是散列的承諾A.

在互動環節中,選擇squash的承諾C.

它將創建以下結構:

* 63de888 (HEAD, master) B/C 
| * cd56322 (branch) E 
| * 9cb2dd6 D 
| * 544fa17 B 
|/ 
* 2fc2859 A 

然後,重訂的分支:

git checkout branch 
git rebase master 

結果應該是這樣的:

* a14e4d6 (HEAD, branch) E 
* dc64709 D 
* 63de888 (master) B/C 
* 2fc2859 A 

我用下面的腳本來驗證的步驟:

#! /bin/bash 

set -eu 

create-commit() { 
    touch $1 
    git add $1 
    git commit -m $1 
} 

mkdir 0 
cd 0 
git init 

create-commit A 
create-commit B 

git checkout -b branch 
create-commit D 
create-commit E 

git checkout master 
create-commit C 

git log --oneline --graph --all --decorate | grep . 

commit_A=$(git log --all | grep -B4 '^ A' | head -n1) 
commit_A=${commit_A#* } 
echo $commit_A 

git rebase -i $commit_A master 
git log --oneline --graph --all --decorate | grep . 

git checkout branch 
git rebase master 

git log --oneline --graph --all --decorate | grep . 
gitk --all 
+0

非常感謝!它的工作原理:) 有一件事可能會有助於他人。 在今天的一些實驗中,我發現在「C」的變化還沒有被提交的情況下,可以執行一個提交以修改「B」以獲得被修改的「B/C」:這產生與第一個sqaush後指出的結構相同。 然後,如你所建議的那樣,下一步就是重新設定主分支。 –

0
  1. 記得老B的哈希
  2. 裂傷master分支
  3. git checkout branch
  4. git rebase --onto master <hash-from-step-1>