ライブラリを入れてみたけど、思ったとおりの動作をしなくて結局は別のものを使ったり、仕様が変わってそもそも使わないでもよくなったりとか。
誤字脱字を修正したり、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
だとそのままのコミットということです。
よく使うのは squash
と edit
だと思います。(というか自分はほとんどそれしか使わないです)
コマンド | 意味 |
---|---|
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しようとしてたブランチ名に書き換えて使ってください。