今まで実質的に個人でしかコードを書いていませんでしたが、10月に入ってチームで動くようになりgitを用いた開発が増えてきました。元々はSourceTreeでgit管理していたのですが、ソースコードやブランチ量が多くなると動作が重くなり、ブランチの切り替えやgitの修正などを気軽に行うにはちょっと扱いづらくなったため、本格的にCLIのgitを覚える必要性が出てきました。
ここでは、自分がよく使うgitをまとめて、用途別で適切にgitのコマンドを引き出せるようになることを目指します。
git周りのよく使う基本コマンド
・新しいブランチを作成
$ git checkout -b new-branch
・既存のブランチに切り替え
$ git checkout exist-branch
・リモートの新しいブランチを取得
$ git fetch -a
・ブランチを更新
$ git pull
・ブランチ名の変更
$ git branch -m new-name-branch
ここから特に使うユースケースについて列挙します
一個前のコミットの名前修正したい
$ git commit --amend
もし既にリモートにプッシュしている場合はforce pushする必要があります
$ git push -f origin develop
オリジナルのブランチが更新された!変更分を今の開発ブランチに取り込みたい
$ git pull rebase origin develop-branch
この時、コンフリクトした場合はエディタで修正して
$ git add .
$ git rebase --continue
しましょう。やばくなったら
git rebase --abort
でキャンセルできます
コミットログが汚いのでコミットをまとめて綺麗にしたい
rebaseを使う方法
$ git rebase -i HEAD~3
これの場合は3つ前のコミットまで修正。不要なものをfixupして除くことで必要なコミットのみ取り出すことができる。
ただし、自分のコミット以前のコミットまでrebaseに含めるとそこも変更対象になるため注意。
一個一個確実にcommitを取り出す・修正できるがやや面倒
reset softを使う方法
$ git log --oneline
まず、gitのlogを出して、自分のまとめたいコミットのログの一番昔地点のポイントをログを確認してチェックする
次に、
$ git reset --soft old-branch
これにより、old-branchのポイントにHEADを動かすことができる。
ここで、HEADをまとめる
$ git commit --amend
この結果をpushする。こっちの方法だと、いちいちfixupとかエディタでブランチをどうするか指定する必要がないので楽は楽です。ただし、一部のコミットは残したいなどある場合は前述のrebaseの方が柔軟かと思います。
こうした修正をpushする場合は普通のpushでは弾かれるのでforce pushする必要があります
$ git push -f origin develop
pullrequestを投げたけどなぜか過去の人のコミットが混ざってしまっている
先程のリベース間違いなどで発生します。
この場合は
$ git cherry-pick old-branch
によって必要なcommitのみを再抽出できます
ミスって必要なブランチが消えてしまった
$ git reflog
$ git checkout XXXX(logのid)
gitの変更履歴・アクションを記録している。そのため、消したブランチなどは上記reflogで確認してからgitcheckoutする必要があります。
結論
今日はあっさりめでしたが、チーム開発時のgitの各々のやり方のまとめを行いました。
gitというとなんとなくsource treeとかGUIでやってしまいがちでしたがCUIも覚えておくとプロジェクトが大きい時には結構便利だと感じました。
参考文献
最新のdevelopの取り込みはgit pull --rebase派
ワーキングツリー、インデックス、HEADを使いこなす方法