git pull –rebase操作が中断された場合に考えられる幾つかの要因とその対処について書いてみた

git pull --rebaseで躓くと原因解決が大変な時は本当に手間かかるなぁと思いました。
2021.06.23

ブランチのプルリクエストはスムーズに完了させたいものです。予めやっておきたい作業としては以下の通り。

  1. 実際に行った修正以外の差分は出さない
  2. fix typo等細かすぎるコミットをまとめる
  3. 最終的に結局削除した新規ファイルは追加履歴自体も削る
  4. 修正内容の要約をコミットコメントに反映する

一つ目の対策として、先ずはgit pull --rebaseを行う辺りでしょう。その際にありがちなつまづきについて書いてみました。それ以外はgit rebaseにて完結できるものばかりです。詳細は先日書いた記事を参考にしてください。

修正以外の差分が発生する要因

よくあるものとして、プルリクエスト先のブランチに取り込まれている修正が作業ブランチに含まれていない辺りが想像できます。これ自体はgit pull --rebase origin TARGETの出番となりますが、途中で差分やindexに含まれていないファイルが発生すると処理が中断してしまいます。

対処はシンプルですが、その際に表示されるメッセージは以下のあくまでも次に取りうるべきgitのコマンドのみです。原因となるファイルに対する操作ではありません。

git rebase --edit-todo
git rebase --continue

取るべき対策

以下、考えうる状況と不必要な操作をする前に取っておきたい操作です。

未コミットの差分を含む作業ファイルがある

trackingされているファイルであれば、先にgit stashしておく方が無難です。

git stash
git pull --rebase origin TARGET
git stash pop

untrackingなファイルがある - その1

untrackingなファイルが多数発生したことが原因でrebaseが進まないというケース。発生しうる原因としては、ファイルが作業ブランチでの.gitignoreに記載されているパターンにマッチしていて、プルリクエスト先の.gitignoreのパターンにはマッチしていないというケースです。

git pull --rebase origin TARGET操作を行うと、ローカルにてプルリクエスト先ブランチのHEADに切り替えてリモートのコミットをpullします。切り替わったタイミングで.gitignoreの修正も切り替わってしまい、結果untrackingなファイルが多数発生します。

予めプルリクエスト先の.gitignoreにパターンを追加したコミットを積むことで、作業ブランチが切り替わってもuntrackingとして検知されることがなくなります。

untrackingなファイルがある - その2

もう一つの方法としては、消しても問題ないuntrackingなファイルはいずれも削除し、そうでない場合は一旦リポジトリ外へ移動させます。indexには乗っていないため変更ではなく、結果git stashにて回避できないための処置です。

untrackingなファイルが全てなくなれば、後はgit rebase --continueにて先に進めるだけです。

作業手順としてはこれが一番手っ取り早いでしょう。

あとがき

git pull --rebaseは、実際の挙動を理解していないと適切な対処方法ではない、誤った手順をとりがちです。手続きがわからなくなったら、まずはgit rebase --abortにて中断を行い、その後は各ブランチへの切り替えにて見直しを行いましょう。pushさえしなければ手元でやり直し放題です。

戸惑ったら、下のような図解している記事を色々と見つつ、一つずつやってみましょう。