インタラクティブモードで、リベース先でコミットが行われる度にシェルコマンドを実行し、リベースを行う
「インタラクティブモード」では、リベース先でコミットが行われる度に、ユーザーが指定したシェルコマンドを実行しながらリベースを行うことができます。オプションの値について
コミットごとに実行するシェルコマンドは、コマンドのオプションの値で指定します。ショートオプション | ロングオプション | オプションの値 |
---|---|---|
-x | --exec | 実行するシェルコマンド |
実行するシェルコマンド
実行するシェルコマンドは、「"」か「'」で括って記述します。例えば、以下のように記述します。
git rebase --verbose --interactive --exec "実行するシェルコマンド" master
複数のシェルコマンドを指定可能
複数のシェルコマンドを指定することもできます。複数のシェルコマンドを指定する場合、複数のオプションを指定します。
例えば、以下のように記述します。
git rebase --verbose --interactive --exec "実行するシェルコマンド" --exec "実行するシェルコマンド" master
この場合、オプションで指定した順番でシェルコマンドが実行されます。
コマンドの実行例
コマンドの実行例です。1.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。現在のブランチは、「fix」ブランチであることが分かります。
同様に、「HEAD」は「fix」ブランチを指していることが分かります。
ここでは例として、「fix」ブランチを「master」ブランチにリベースし、「mastsr」ブランチに「fix」ブランチの変更内容を結合します。
2.ブランチの構成
現在のブランチの構成を図にすると、以下のようになっています。「fix」ブランチを「master」ブランチにリベースするため、リベース対象の「コミットオブジェクト」は、以下のようになります。
- Commit4
- Commit5
- Commit6
3.コマンドの実行
コマンドのオプションは、以下のオプションを指定します。ショートオプション | ロングオプション | オプションの値 |
---|---|---|
-i | --interactive | ー |
-x | --exec | 実行するシェルコマンド |
「端末」から、以下のコマンドを実行します。
コマンドの詳細は、以下を参考にしてください。
ここでは例として、コミットごとに「HEAD」のコミットログを出力します。
ポイントは、赤字の箇所です。
git rebase --verbose --interactive --exec "git log HEAD^..HEAD" master
4.todoリストの編集
以下のようにテキストエディターが起動し、「todoリスト」が表示されます。オプションで指定したシェルコマンドが、「exec」コマンドに展開されています。
「todoリスト」の編集が終わったら、ファイルを上書き保存して、テキストエディターを終了します。
5.リベースの実行
以下のように「todoリスト」の記述内容に従って、リベースが行われます。赤字の箇所が、シェルコマンドの実行結果です。
ubuntu@ubuntu-vb-1504:~/git/myCloneProject$ git rebase --verbose --interactive --exec "git log HEAD^..HEAD" master
Changes from 2537d065f4f34d5c75093e1091a0ddcd4681c5fe to acb648c5ac895850a1b0c7735f6f7c66eb8d199f:
master.txt | 2 ++
1 file changed, 2 insertions(+)
Note: checking out 'acb648c5ac895850a1b0c7735f6f7c66eb8d199f'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at acb648c... master
Rebasing (1/6)
a7e1f73ecfe9ed0b1361850826c2ea0a96d97c30
[detached HEAD ba6f271] BugFix-001
Date: Fri Sep 25 18:12:14 2015 +0900
1 file changed, 1 insertion(+)
create mode 100644 fix.txt
Rebasing (2/6)
Executing: git log HEAD^..HEAD
commit ba6f271a604ed38865b0f1f9ed57f7077819167e
Author: kledgeb <kledgeb@kledgeb.com>
Date: Fri Sep 25 18:12:14 2015 +0900
BugFix-001
Rebasing (3/6)
7ad66df5e4c413f64ad53905c284d183de0829af
[detached HEAD e848d30] BugFix-002
Date: Fri Sep 25 18:12:27 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (4/6)
Executing: git log HEAD^..HEAD
commit e848d30e60878de785d533f50ee104b5fa5c069a
Author: kledgeb <kledgeb@kledgeb.com>
Date: Fri Sep 25 18:12:27 2015 +0900
BugFix-002
Rebasing (5/6)
455b9273894e8f4f2fee4fd1f951c8c37b1d79a0
[detached HEAD be2320c] BugFix-003
Date: Sun Sep 27 22:13:14 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (6/6)
Executing: git log HEAD^..HEAD
commit be2320c6f348623684c92df644525b1f9be3419e
Author: kledgeb <kledgeb@kledgeb.com>
Date: Sun Sep 27 22:13:14 2015 +0900
BugFix-003
master.txt | 2 ++
1 file changed, 2 insertions(+)
Successfully rebased and updated refs/heads/fix.
Changes from 2537d065f4f34d5c75093e1091a0ddcd4681c5fe to acb648c5ac895850a1b0c7735f6f7c66eb8d199f:
master.txt | 2 ++
1 file changed, 2 insertions(+)
Note: checking out 'acb648c5ac895850a1b0c7735f6f7c66eb8d199f'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at acb648c... master
Rebasing (1/6)
a7e1f73ecfe9ed0b1361850826c2ea0a96d97c30
[detached HEAD ba6f271] BugFix-001
Date: Fri Sep 25 18:12:14 2015 +0900
1 file changed, 1 insertion(+)
create mode 100644 fix.txt
Rebasing (2/6)
Executing: git log HEAD^..HEAD
commit ba6f271a604ed38865b0f1f9ed57f7077819167e
Author: kledgeb <kledgeb@kledgeb.com>
Date: Fri Sep 25 18:12:14 2015 +0900
BugFix-001
Rebasing (3/6)
7ad66df5e4c413f64ad53905c284d183de0829af
[detached HEAD e848d30] BugFix-002
Date: Fri Sep 25 18:12:27 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (4/6)
Executing: git log HEAD^..HEAD
commit e848d30e60878de785d533f50ee104b5fa5c069a
Author: kledgeb <kledgeb@kledgeb.com>
Date: Fri Sep 25 18:12:27 2015 +0900
BugFix-002
Rebasing (5/6)
455b9273894e8f4f2fee4fd1f951c8c37b1d79a0
[detached HEAD be2320c] BugFix-003
Date: Sun Sep 27 22:13:14 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (6/6)
Executing: git log HEAD^..HEAD
commit be2320c6f348623684c92df644525b1f9be3419e
Author: kledgeb <kledgeb@kledgeb.com>
Date: Sun Sep 27 22:13:14 2015 +0900
BugFix-003
master.txt | 2 ++
1 file changed, 2 insertions(+)
Successfully rebased and updated refs/heads/fix.
6.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。「fix」ブランチが指す「コミットオブジェクト」の識別子が、「1.」と異なっています。
7.ブランチの構成
現在のブランチの構成を図にすると、以下のようになっています。「Commit4」の変更内容を元に、「Commit4’」が新規に生成されています。
「Commit5」の変更内容を元に、「Commit5’」が新規に生成されています。
「Commit6」の変更内容を元に、「Commit6’」が新規に生成されています。