2017年5月20日土曜日

[git] squashでコミットをまとめる

  • 公開日:2017年05月20日
  • 最終更新日:2017年11月29日

記事概要

gitのsquashを使ってコミットをまとめる時のやり方。ターミナルコマンドを使います。

環境

  • git version 2.6.4

やりたいタスク

直近4つのコミットを一つにまとめます。
対象は色々な修正を加えたsample.txtです。

terminal

// コマンド
git log --oneline

a108a12 sample/feature completed.
ba18359 deleted comment.
a7711e0 updasted comment.
adf6be6 added comment.
2ca3f88 first commit

直近a108a12からadf6be6までの4つのコミットをまとめて、直近a108a12のコメントに変更します。
開発現場でよくあるパターンです。

順序

rebaseコマンドで直近の4つのコミットを選択します。

terminal

// コマンド
git rebase -i HEAD~4

pick adf6be6 added comment.
pick a7711e0 updasted comment.
pick ba18359 deleted comment.
pick a108a12 sample/feature completed.

# Rebase 2ca3f88..a108a12 onto 2ca3f88 (4 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

古いコミット順で表示されるので、注意してください。一番古いコミット以外をsに変更します。

terminal

pick adf6be6 added comment.
s a7711e0 updasted comment.
s ba18359 deleted comment.
s a108a12 sample/feature completed.

一番古いコミット以外をsに変更します。最初(一番古い)のコミットはsにしてはいけません。sを指定したコミットの内容が、前のコミットに統合(melt)されるイメージです。時系列が逆なので最初は理解しにくいですが、仕様なので慣れてください。
修正したら:wqで上書き保存します。

コミット内容が表示されます。

terminal

# This is a combination of 4 commits.
# The first commit's message is:
added comment.

# This is the 2nd commit message:

updasted comment.

# This is the 3rd commit message:

deleted comment.

# This is the 4th commit message:

sample/feature completed.

残したいコミットメッセージ以外を削除します。もちろんメッセージを変更しても問題ありません。

terminal

# This is a combination of 4 commits.
# The first commit's message is:

# This is the 2nd commit message:


# This is the 3rd commit message:


# This is the 4th commit message:

sample/feature completed.

変更したら:wqで上書き保存します。

terminal

Successfully rebased and updated refs/heads/master.

成功です。ログを確認します。

terminal

// コマンド
git log --oneline

4a709e3 sample/feature completed.
2ca3f88 first commit

綺麗にログがまとまりました。

ログの内容をすでにpull requestしている場合は、force pushすれば強制的に上書きできます。(他の人がファイルをいじってないことを確認しましょう)

取り消し

rebaseで間違ってしまった場合は、以下のように修正します。

terminal

git rebase --abort

例えば、merge conflictで修正箇所をまとめる時に、最初のmergeまで入れてrebaseしてしまったとか。。。ですかね。
これで元どおりになります。

サーバーのbranchを消す

terminal

// ローカルbranchを削除
git branch -D branchName

// サーバーに反映
git push origin :branchName

まとめ

gitはとても便利なのですが、ググっても間違った情報が引っかかるケースが多いと思います。
周りの人に聞いたり、公式サイトを利用して正しく効率的なやり方を身につけてください。

PICK UP オススメ書籍

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...