LoginSignup
4
6

More than 5 years have passed since last update.

あとからGitでcommitをキレイにするメモ

Last updated at Posted at 2017-08-02

ライブラリを入れてみたけど、思ったとおりの動作をしなくて結局は別のものを使ったり、仕様が変わってそもそも使わないでもよくなったりとか。
誤字脱字を修正したり、Lintに怒られて動作に関係のない修正したりとか。
そんなどうでもいい履歴がチラホラあって汚いので、PullRequestするときには整えてからpushするためのメモ。
こういう気遣いがレビューを早く回すコツかと思うのです。

つかうGitコマンド

コミットされていない変更したファイルの一覧を表示できます。

$ git status

ファイルをインデックスに登録できます。
うしろにファイル名を書けば、ファイル単位で登録できます。

$ git add

インデックスに追加されたファイルをコミットできます。
"..."のところはコミットコメントを書きます。分かりやすく書きましょう。

$ git commit -m "..."

コミットのログをファイル名付きで見られます。

$ git log --name-only

コミットのログをネットワーク図みたいに見られます。

$ git log --oneline --graph --decorate

コミットの履歴を編集できます。今回の大切なところです。

$ git rebase -i

コミットの履歴を編集をやめます。
コンフリクトしたら、迷わず使うと事故りません。

$ git rebase --abort

コミットの履歴を編集し終わったら、次の編集に進みます。
最後の編集だったら、完了まで処理が流れます。

$ git rebase --continue

viのつかいかた

以下のことを覚えておけばなんとかなります。

モード コマンド 意味
コマンドモード dd 一行切り取り
コマンドモード p カーソルの右側に貼り付け
入力モード i コマンドモード→入力モード切り替え
入力モード esc 入力モード→コマンドモード切り替え

修正が終わったら、 :wq で保存して終了。
(もし、保存したくないときは :q で終了)

キレイにする

編集中のファイルとかがない状態にします。
安全のためにも、やり直せるように git push しておくといいと思います。
もし、うまく行かなかった場合にはやり直せるので。
そうしたら、以下のコマンドをたたきます。
(HEAD^のうしろの数字はいくつ前のコミットまで遡るかということ。今回の例だと5個前まで遡ります)

$ git rebase -i HEAD~5

下記のようなコミットメッセージが表示されます。

pick e33ef21 api連携を追加
pick 67f8b9d Cssの調整
pick 857067c api連携先の変更
pick cec94cc 画像の追加
pick 44335ac CssLintの対応

# 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

このときの操作はviです。
コマンドは書いてある通りで、 pick だとそのままのコミットということです。
よく使うのは squashedit だと思います。(というか自分はほとんどそれしか使わないです)

コマンド 意味
s, squash 前のコミットにまとめる
e, edit コミットを編集する

こんな感じに編集したとする。
並べ替えたり、コミットをまとめたり。

pick e33ef21 api連携を追加
s 857067c api連携先の変更
pick 67f8b9d cssの調整
s 44335ac CssLintの対応
e cec94cc Componentと画像の追加

そうしたら、 :wq します。

コンフリクトしなければ、コミットをまとめるときのコメントをどうするか聞かれます。
ここもviで編集します。
もしコンフリクトしたなら、ヤバいので git rebase --abort して一旦落ち着きましょう。

で、 edit のところでrebaseが止まります。
ちょっと焦ると思いますが、ここで以下のコマンドをたたきます。

$ git reset HEAD^

これで、edit したところのコミットをなかったことにできます。
あとは git add して git commit -m をすることで、コミットを分けることができます。
コミットし終わったら git rebase --continue で続きをします。

先ほどの例で言うと、こんな感じになります。
こうするとキレイでレビュワーさんにも優しいと思うんです!

* d05bec6 api連携を追加
* a94b258 cssの調整
* 549ac93 Componentの追加
* e33ef21 画像の追加

で、既に git push をしてしまっていたら、 git push -f で強制的にリモートにプッシュをすれば、上書きされるので大丈夫です。

もし、うまくできなかったらリセット!

1.リモートの最新を取ってきておいて・・

$ git fetch origin master

2.ローカルのmasterを、リモート追跡のmasterに強制的に合わせるだけ!

$ git reset --hard origin/master

※ 例はブランチ名をmasterにしてますが、そこはrebaseしようとしてたブランチ名に書き換えて使ってください。

4
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6