##はじめに
今回あることがきっかけでメインブランチにマージされた大量のPull Requestマージをひとつずつrevertして大きなrevert pull requestを作ることがあってちょっと苦労するポイントがあったので忘備録を兼ねてメモしておく。
##前提
本記事においては、基本的にメインブランチへのPull Requestマージが行われているプロジェクトであるという前提が必要となります。
##実際に起きた問題
実際におきた問題というのは、Pull Requestマージされたリストを取得しようとしたときに何も考えずマージのログだけを取得して、対象のコミットハッシュだけをrevertしようとした途中でおきました。
$ git log --merges --oneline
xxxx1a Merge pull request ....
xxxxbd Merge pull request ....
xxxx38 Merge pull request ....
xxxx8e Merge pull request ....
基本的に上記のログで出力されたcommit hashを順番にrevertしていけば大丈夫だと思って実行していきました。
最初は順調にrevertされたのですが、あるところでrevertしても通常の変更コミットの記録がなくなり、特に気にせず進めていたら、途中でエラーが出てしまったのです。
$ git revert -m 1 --no-edit xxxxa0
[revert_topic_branch xxxxaa] Revert "Merge pull request ...."
1 file changed, 11 insertions(+)
$ git revert -m 1 --no-edit xxxx5a
On branch revert_topic_branch
nothing to commit, working directory clean
... (中略)
$ git revert -m 1 --no-edit xxxx57
error: could not revert xxxx57... Merge branch 'topic_branch_hogehoge' into revert_topic_branch
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
##原因
結局原因は、何だったかというと途中にトピックブランチへのPull Requestのマージログも含まれていて、それもgit revertコマンドでrevertしようとしていたのが問題でした。
では、どのようにしてトピックブランチへのPull Requestのマージを省くかというと、--graph
オプションを使うことでそれを見分けることができます。
簡単に言うと下記の例では一番左に*
マージのある行だけをピックアップしてrevertしていけばいいということです。
$ git log --oneline --merges --graph
* xxxxxd0 Merge pull ....
* xxxxx48 Merge pull ....
* xxxxx30 Merge pull ....
* xxxxx82 Merge pull ....
* xxxxx25 Merge pull ....
* xxxxx9d Merge pull ....
* xxxxx95 Merge pull ....
* xxxxx08 Merge pull ....
* xxxxxa0 Merge pull ....
* xxxxx26 Merge pull ....
|\
| * xxxxx5a Merge pull .... (← git revert対象外)
| * xxxxxf9 Merge pull .... (← git revert対象外)
| * xxxxxaf Merge pull .... (← git revert対象外)
| * xxxxxf7 Merge pull .... (← git revert対象外)
| * xxxxx17 Merge pull .... (← git revert対象外)
| * xxxxx03 Merge pull .... (← git revert対象外)
| * xxxxx57 Merge branch .... (← git revert対象外)
| * xxxxx38 Merge pull .... (← git revert対象外)
| * xxxxxb1 Merge pull .... (← git revert対象外)
* | xxxxx53 Merge pull ....
* | xxxxx95 Merge pull ....
* | xxxxx65 Merge pull ....
* | xxxxxad Merge pull ....
よくよく考えたらまぁそうだよなー、という内容でしたが危うくハマりかけました。
##参考サイト
##おわりに
gitのコマンドを色々知っておくと便利な事って色々ありますよね。
今回の事も新たに勉強になってためになりました (^ω^)