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 することになる。
なるほど。理解。
どっちがいいかわからないが、挙動がどうなるかぐらいは知っていた方がいいと思った。