45085


以下のようなブランチで作業しています。

[![画像の説明をここに入力](https://i.stack.imgur.com/DTwyV.png)](https://i.stack.imgur.com/DTwyV.png)

`bugfix1`ブランチでの作業が終わったので、`master`ブランチに取り込みます。  
ただ、`bugfix1`のコミットは`master`ブランチの先頭コミットと１つにまとめたいです。

[![画像の説明をここに入力](https://i.stack.imgur.com/mJ36K.png)](https://i.stack.imgur.com/mJ36K.png)

しかし良い方法が思いつかず、以下のような無駄の多いであろう手順で行いました。  
特にmasterブランチを一度削除している部分は「なんか違う」と感じます。

もっと短い手順で行う方法はありますでしょうか？

* * *

現在の状態は以下の通りとします。

[code]

    git log --oneline --graph --all --decorate
    
    * 557ceac (HEAD -> bugfix1) C4
    * 4c8dea5 (develop) C3
    * fb1dc6b (master) C2
    * 65947d3 C1
    * e91df3b C0
    
[/code]

手順1. C4の分岐元をC2に変更します。

[code]

    git rebase --onto master develop bugfix1
    
    * db81c6c (HEAD -> bugfix1) C4
    | * 4c8dea5 (develop) C3
    |/
    * fb1dc6b (master) C2
    * 65947d3 C1
    * e91df3b C0
    
[/code]

手順2. C3の分岐元をC4に変更します。

[code]

    git rebase bugfix1 develop
    
    * 2dd4032 (HEAD -> develop) C3
    * db81c6c (bugfix1) C4
    * fb1dc6b (master) C2
    * 65947d3 C1
    * e91df3b C0
    
[/code]

手順3. masterブランチとbugfix1ブランチを削除します。

[code]

    git branch -d master
    git branch -d bugfix1
    
    * 2dd4032 (HEAD -> develop) C3
    * db81c6c C4
    * fb1dc6b C2
    * 65947d3 C1
    * e91df3b C0
    
[/code]

手順4. C2とC4を１つのコミットにまとめます。

[code]

    git rebase -i HEAD~3
    （C2をreword、C4をfixup）
    
    * f4bfc56 (HEAD -> develop) C3
    * db88da9 C2+C4
    * 65947d3 C1
    * e91df3b C0
    
[/code]

手順5. masterブランチを作ります。

[code]

    git checkout db88
    git branch master
    git checkout develop
    
    * f4bfc56 (HEAD -> develop) C3
    * db88da9 (master) C2+C4
    * 65947d3 C1
    * e91df3b C0
    
[/code]

* * *

追記

素直にやればよいことに気付きました。なにか混乱していたようです…。

[code]

    git rebase --onto master develop bugfix1
    git checkout master
    git merge bugfix1
    git branch -D bugfix1
    git rebase -i HEAD~2
    (C4をfixup）
    git rebase master develop
    
[/code]


CC BY-SA 4.0
2018-06-26T04:45:56.363
45076
2018-06-26T07:27:24.263
2018-06-26T07:27:24.263
19759
19759
question
git
コミット履歴を変更したmasterブランチに対してリベースしたい


`cherry-pick`を使用し、以下の手順で実行することで解決できそうです。

## 実行手順

### 1\. chery-pickでコミットを取り込む

`master`ブランチに切り替えた状態で、C4のコミットIDを指定して`cherry-
pick`で取り込みます。元々のファイルの変更日時は維持されますが、コミットIDは新しいものになります。

[code]

    $ git checkout master
    $ git cherry-pick 557ceac
    
[/code]

### 2\. rebaseでコミットをまとめる

元々のmasterのコミット(C2)と、先ほど取り込んだコミット(C4')を`rebase`で1つにまとめます(最新2つ分のコミットが対象)。

[code]

    $ git rebase -i HEAD~2
    
[/code]

指定した範囲のコミットIDとコミットメッセージの一覧がエディタで開いた状態になるので、変更しないコミットはそのまま(`pick`)、ファイルの変更は取り込むが履歴は削除するものはコミットIDを`fixup`に変更し、エディタを保存・終了します。

[code]

    pick fb1dc6b C2
    pick db88da9 C4'
    
    # ↓以下のように変更
    pick fb1dc6b C2
    fixup db88da9 C4'
    
[/code]

問題なければマージされ`master`に(C2+C4)を一つにまとめたコミット(C2')ができるはずです。


CC BY-SA 4.0
2018-06-26T06:07:35.733
45085
2018-06-26T06:15:42.330
2018-06-26T06:15:42.330
3060
3060
45076
answer