超でかいPRのmerge方法
可能であれば、でかいPRを作らないでください
Tonny Xu
まず、上記の通り、でかいPRは作らないでね!を念頭に入れてもらえれば。
実際の開発に、うっかり超でかいPRを作ってしまうことはあるんでしょう。その時は、まず、念入りしてもらいたいのは、rebase
がいい友達だよ。要は、定期的に、他の方の作業をrebaseして、解消しづらいconflictを回避すべきだね。
目安
普通のPR
- commits <= 10
- changed files <= 10
でかいPR
- commits <= 20
- changed files <= 20
これ以上のPRは超でかいと言えるんでしょう!
それ以上に大きくなりそうな場合には、可能であれば、機能を分割して実装する。それでも必要なら、やるしかない。
分割
cherry-pick
分割可能なCommitをpickして、別のブランチにするのは一つ良いアイディアだね。この場合、順番が重要だ。
- でかいブランチ
K
の元のブランチD
から別のブランチA
を作る cherry-pick
したいcommitをA
に入れる- ビルドや、テストなどを実行して、通ったら、
A
をPRにする K
ブランチでrebase -i HEAD~<n>
を使って、cherry-pick
したブランチを外すK
でビルドやテストを確認する
rebase -i
が友達
rebase -i
を使う。どんなrebaseをしても-i
入れて使えばなんとかなると思う。rebaseは本当に強力なツールなので、必ず習得してください。
(仮にdevelop
ブランチにrebaseしたい場合)
(your-branch)$ git rebase -i develop
手動修正+マージ
rebaseをする際に、ローカルのconflictが多いかもしれないが、特に、他の方が自分が修正したコード周りにrefactoringなどをした場合は辛いと思う。その場合、僕の経験ではconflict内容を一旦残す。
//>>>>>>> HEAD
//some modifications by others
//=======
//your modifications
//<<<<<<< {SHA1} {your commit message}
こういう方法で、後ほど他のconflictを一緒に見てみたら、他のチームメンバーがどんな修正を入れたのかわかりやすい。そのconflictを解消するのも簡単になる。
push --force
あとは、rebase後のlocalブランチとremoteブランチをどうする問題だ。
rebase前にK
ブランチがすでにPRとして出した場合、rebase後は同じremoteのブランチK'
にpush --force
を使ってください。なぜなら、remoteのK'
ブランチはrebase前のものなので、各Commitの内容は少し違うかもしれない(ローカルにconfilicを修正したなど)。従って、remoteのK'
ブランチは破棄しても大丈夫のようなものになる。逆に、push --force
を使わないと、大変なことになる。(興味があれば、自分で試してみてね)
(your-branch)$ git push --force origin K
最後に、もう一度言う
可能であれば、でかいPRを作らないでください
Tonny Xu