Skip to content

Instantly share code, notes, and snippets.

@hkuno9000
Last active October 14, 2022 05:20
Show Gist options
  • Save hkuno9000/398fc4000655e7b6617fd76733b5fa94 to your computer and use it in GitHub Desktop.
Save hkuno9000/398fc4000655e7b6617fd76733b5fa94 to your computer and use it in GitHub Desktop.
git reabse --onto の動作解説

git rebase --onto の動作解説

https://git-scm.com/docs/git-rebase に記載されている説明を、厳密な正確性よりも分かりやすさを優先して書き換えたものです。 git reabse の使い方に悩む方々の参考になればと思い公開します。

コマンドライン

git rebase [--onto 接続先] 上流ブランチ [対象ブランチ]

引数解説

  • 対象ブランチ: 省略時はカレントのブランチが対象となる。
  • 上流ブランチ: 省略時は対象ブランチに設定されたリモートブランチを使う。
  • 接続先: 省略時は上流ブランチを使う。

<接続先> と <上流ブランチ> は、ブランチ名である必要はなく任意のタグ名やコミットハッシュ値でもよい。 そこを最終コミットとする仮ブランチとして扱う。

動作

  1. <対象ブランチ> にスイッチし、それをカレントブランチとする git switch <対象ブランチ>
  2. <カレントブランチ>の履歴に含まれる全コミットのうち、<上流ブランチ>の履歴に含まれていないコミット git log <上流ブランチ>..HEAD をリベースによる移動対象として選択する。
  3. カレントブランチを<接続先>に強制リセットする git reset --hard <接続先>
  4. 上記2で選択した移動対象コミットの内容を順番に1つづつ再コミットしてゆく。そのとき、git log HEAD..<上流ブランチ> に含まれる同内容のコミットはスキップされる

具体例

カレントブランチを、mainの最新コミットから新規ブランチしたものとして再生成する.

git rebase main
  1. main..HEAD の差分コミットを退避し
  2. カレントブランチをmain最新コミットに強制リセットし
  3. 退避した差分コミットを適用する.

featXブランチを、mainの最新コミットから新規ブランチしたものとして再生成する.

git rebase main featX
  1. カレントブランチを featX に切り替え
  2. main..featX の差分コミットを退避し
  3. featX をmain最新コミットに強制リセットし
  4. 退避した差分コミットを適用する.

featXブランチを、tag3から新規ブランチしたものとして再生成する.

git rebase --onto tag3 main featX
  1. カレントブランチを featX に切り替え
  2. main..featX の差分コミットを退避し
  3. featX をtag3コミットに強制リセットし
  4. 退避した差分コミットを適用する.

featXブランチを、tag3から新規ブランチして featX~3..featX の内容で再生成する.

git rebase --onto tag3 featX~3 featX
  1. カレントブランチを featX に切り替え
  2. featX~3..featX の差分コミットを退避し
  3. featX をtag3コミットに強制リセットし
  4. 退避した差分コミットを適用する. featX~3以前のコミット main..featX~4 は適用されない.

END

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment