はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【ForkとCommand】rebase + squashを活用して複数のコミットを一つのコミットにまとめる方法

はじめに

今回はGit Fork or Git Commandを利用しながら、rebase + squachを使って複数のコミットを一つのコミットにまとめる方法について紹介したいと思います。

コミットを一つにまとめる

Git Forkでのやり方

Git ForkだとGUIで操作できるのでかなりとっかかりやすいです。

rebaseするコミットを指定する

Git Forkを立ち上げ、次の操作を行います。

  1. 左側にあるAll Commitsを選択
  2. まとめたいコミットの一つ下にあるコミットを右クリック
  3. Interactive Rebase/Interactively Rebase '----'を選択。
Interactive Rebaseを選択

まとめたいコミットをsquashに変更する

以下の画面が立ち上がると思うので、まとめたいコミットをsquashに変更します。squashを指定すると一つ前のコミットに結合されます。

Squashに変更する

またデフォルトでRewordになっている箇所があるかと思いますが、これはpickと異なりコミットメッセージを変更することができます。

Rewordでコミットメッセージを変更する

操作が終了したら右下のRebaseを指定します。

force pushをする

最後にPushをするのですが、普通のPushをしようとするとエラーが出てきてしまうので、Force Pushをします。

Force pushする

コマンドでのやり方

その前に

git rebase -iの際のエディタを好きに変えることができます。私の場合はVimが苦手なので、VSCodeに設定しています。

// git rebase -i 時のエディターをVSCode変更する
$ git config --global sequence.editor 'code --wait'

git rebase -i コミットID

まずはgit rebase -iコマンドを打ち込みます。

git rebase -i <commitID>

またコミットIDを知りたい場合は以下のコマンドを打つと表示されます。

$ git log --oneline
f5150fc (HEAD -> feature/sample-branch, origin/feature/sample-branch) add test2.txt
c299e93 add text
1317993 test1
2daa144 (origin/main, origin/HEAD, main) Initial commit

また以下のようないくつかの指定方法があるのでお好きな手法を利用してください。(他にもあるのかもしれません)

HEADから遡るコミット数を指定する
$ git rebase -i HEAD~2
コミットIDを指定する
$ git rebase -i 2daa144
ブランチ名を指定する
$ git rebase -i main

pickをsquashに変更する

squashを指定したコミットはその1つ前のコミットとまとめられます。

例えば以下のようなコミットログにおいて、3つのコミットを一つのコミットに修正したい場合は以下のコマンドを打ちます。

// コミットログ
$ git log --oneline
f5150fc (HEAD -> feature/sample-branch, origin/feature/sample-branch) add test2.txt
c299e93 add text
1317993 test1
2daa144 (origin/main, origin/HEAD, main) Initial commit

// f5150fc + c299e93 + 1317993 を一つのコミットにまとめる
$ git rebase -i 2daa144
// 修正前
pick 1317993 test1
pick c299e93 add text
pick f5150fc add test2.txt

// 修正後 (pickをsに修正)
pick 1317993 test1
s c299e93 add text
s f5150fc add test2.txt

ssquashの略ですね。squashと表記したコミットは一つ上にあるコミットに結合されます。

Force Pushする

Force Pushをすることで複数のコミットを一つのコミットに変更することができます。

// feature/sample-branchに対してforce pushする
$ git push origin feature/sample-branch --force
// コミットログ
$ git log --oneline
4aebcc3 (HEAD -> feature/sample-branch, origin/feature/sample-branch) test1
2daa144 (origin/main, origin/HEAD, main) Initial commit

注意点としてPullをしてしまうと変なことになってしまうこと、またPushはできないのでForce Pushをする点気をつけてください。