猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

git rebase --continue しようとして No changes - did you forget to use 'git add'? と言われたらどうしたらいいのか

最初に結論

git rebase --skip すれば良い。

f:id:yoshiki_utakata:20180125113232j:plain

状況

git rebasegit merge で、 conflict することがあります。この時、大抵はコンフリクトを解消し、git add して git rebase --continuegit merge --continue すれば解決します。

しかし、コンフリクトを解消した結果、git add するものがなくなってしまった場合、git rebase --continue すると以下のエラーメッセージが出ます。

$ git rebase --continue
Applying: ほげほげを修正
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

実際に起こった例

ブランチAをmasterにrebaseしようとしてコンフリクトします。

$ git checkout A
$ git rebase master

First, rewinding head to replay your work on top of it...
Applying: ほげほげを修正
Using index info to reconstruct a base tree...
M   hogehoge.php
Falling back to patching base and 3-way merge...
Auto-merging hogehoge.php
CONFLICT (content): Merge conflict in hogehoge.php
Failed to merge in the changes.
Patch failed at 0001 ほげほげを修正
The copy of the patch that failed is found in:
   /home/yoshiyuki_sakamoto/.git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

ここで実は If you prefer to skip this patch, run "git rebase --skip" instead. って出てたんでね...(気づかなかった)

  • コンフリクトを解消して続ける場合は git rebase --continue
  • このパッチを飛ばす場合は git rebase --skip
  • rebaseを諦める場合は git rebase --abort

としろと。

解決する

まあとりあえずコンフリクトを解消しようとします。 git statusgit diff を見てみます。

$ git status
rebase in progress; onto f8464df
You are currently rebasing branch 'batch-pdo' on 'f8464df'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

    both modified:      hogehoge.php


$ git diff
diff --cc hogehoge.php
index 5e0d708,bd484f9..0000000
--- a/hogehoge.php
+++ b/hogehoge.php
@@@ -67,19 -67,11 +67,27 @@@ class Hogehoge

        public function get_hoge() {
++<<<<<<< HEAD
 +              $host_info = explode(':', $host_port);
 +              $host = $host_info[0];
 +              $port = isset($host_info[1]) ? $host_info[1] : null;
 +
 +              return 'mysql:host=' . $host . ';dbname=' . $this->get_db_name();
++=======
+               return 'mysql:host=' . $host_port . ';dbname=' . $this->get_db_name();
++>>>>>>> ほげほげを修正

まあ修正内容はなんでもいいのです。ここで、HEAD(つまりmasterの方)が正しそうなので、git checout HEAD hogehoge.phpgit checkout master hogehoge.php とかでもいい) します。すると、

$ git checkout HEAD hogehoge.php

$ git status
On branch deploy
nothing to commit, working tree clean

nothing to commit に、この状態で git rebase --continue しようとすると、No changes - did you forget to use 'git add'? と言われます。((continue でいいじゃないか!って思うんですけどね...)) 無をcommitすることは出来ないので git rebase --skip することになります。

continueした時に差分が無い場合は勝手にskipして欲しいと思ったりもするんですが、誤解を避けるためか勝手にskipとかはされないようになっております。

--continue, --skip, --abort ちゃんと使いこなせるようになっておきたいですね。

参考記事

uozias.hatenablog.com