push後rebaseを試した

バイトしてて、git push後にtypoに気づいて、前のcommitに含めたいと思ったので、試してみた。

Hello.txtに文字列を挿入した状態で、1つのcommitにしたいという状況を想定した。

% touch Hello.txt
% git add Hello.txt && git commit -m 'Hello.txtの作成'
[master 56ae89e] Hello.txtの作成
 1 file changed, 1 insertion(+)
 create mode 100644 Hello.txt
% git push origin master
% echo 'HELLO' >> Hello.txt && git add Hello.txt && git commit -m '文字列の追加'      (git)-[master]
[master 41c7647] 文字列の追加
 1 file changed, 1 insertion(+)
% git rebase -i HEAD~2                                                                (git)-[master]
[detached HEAD 7800150] Hello.txtの作成
 Date: Sun Feb 16 03:17:40 2020 +0900
 1 file changed, 2 insertions(+)
 create mode 100644 Hello.txt
Successfully rebased and updated refs/heads/master.
% git log --graph                                                                     (git)-[master]
* commit 7800150975f4504c1775c1220b2ec58edfb5582b (HEAD -> master)
| Author: b1u3 <bp16071@shibaura-it.ac.jp>
| Date:   Sun Feb 16 03:17:40 2020 +0900
|
|     Hello.txtの作成
|
...
% git push origin master                                                              (git)-[master]
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/b1u3-YumaNoguchi/TestRepository.git'

ここで、リモートのコミットグラフとローカルのコミットグラフに明らかに相違があるため、errorが出ることは予測できる。

ここから、方法として、①git push --forceか②git pullするというパターンが考えられる。

①の場合、push までに別の commit がされていた場合、それらの commit は、なかったことになってしまう。これは、結局、別の commit をした人が pull した際に merge することになる。 ただし、運よく別の commit がなかった場合、いい感じになる。

②の場合、自分が merge することになる。

なるほど。理解。

どっちがいいかわからないが、挙動がどうなるかぐらいは知っていた方がいいと思った。