git rebase 失敗した時の対処法

大まかな流れ

git add .
git commit -am "message"
git push origin master

最後のpushがうまくいかない時(他の誰かがpushしてる時)の解決策の1つとして、rebaseしてからpushする方法がある。

git fetch origin
git rebase origin/master
git push origin master

とすれば、コンフリクトしない限りpushできる。
以下、このrebaseが失敗した時の対処法を記述する。

[解1]コンフリクトを手動で直す

まず、コンフリクト箇所を手動で直す。
その後、以下のコマンドを実行。

git add コンフリクトを解消したファイル名1
git add コンフリクトを解消したファイル名2
(直したファイル数分繰り返す)
git rebase --continue
git push origin master

※コンフリクトの記号に関しては下記URL(公式ドキュメント)参照。
http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC

pullとかrebaseとか、Eclipseの外部から変更が加えられた時はF5コマンドでリフレッシュすべし。

[解2]指定したファイルをコミットから取り除く

git rebase --abort #rebaseのキャンセル

 ↓
ソースツリー上でコミットしたファイルを「Hunk を戻す」でcommit解除
(正確には、逆向きのコミットを貼り、後で上書きすることでコミット解除したように見える)
 ↓

git commit -a --amend #commitの上書き

 ↓
指定したファイルを再度変更し、addcommitpush

[おまけ1]コンフリクトに気付く手段

git statusboth modifiedと表記されたらそこが怪しい!
→ git diff ファイルパス名でコンフリクト箇所閲覧可能。

[おまけ2]自分の変更を全て取り消す方法

CLI上で解決

ちょっと変更したけど、変更を取りやめて前のコミットの状態に戻りたい時に有効。

git reset --hard コミットのハッシュ値

で、指定したコミットの状態に戻ることができる。コミットのハッシュ値は、git loggit reflogで確認可能。

ソースツリー上で解決

自分の変更(Uncommited Changes)を選択
→ 変更を取り消したいファイルを選択して右クリック
→ リセット

[おまけ3]

とにもかくにも、

こまめにコミットすべし

これに尽きます。
こまめにコミット(プッシュ)していれば面倒なマージ作業もせずに済むので。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする