git push --forceを行う例
2人で同じブランチを開発している場合
[remote] | C1--C2--C5--C6 origin/feature1
| \
[local] | C3--C4 feature1
- (1) Bobがlocalで作業してC1、C2をコミットしremoteにプッシュした
- (2) Bobはさらに作業を続けてC3、C4をlocalにコミットしている間に、Aliceが作業しC5、C6をコミットしremoteにプッシュした。Bobはそのことを知らなかった
- (3) この時、BobがC3、C4をremoteにプッシュするとエラーになる。C5、C6がBobのブランチに含まれないから
- (4) このような場合、C5、C6を削除してもいいなら、Bobはgit push --forceすればいい
C5、C6を活かす場合
- 5. git pullしてC5、C6をlocalに取り込んだ後にgit pushする
プッシュ済みのブランチをリベースして再度プッシュする場合
[remote] | C1--C2--C5--C6 origin/master (0)
| \
[local] | C3--C4 feature1
git co feature1 (1)
git rebase master
git push origin feature1 (2)
- (0) masterブランチのC2からfeature1ブランチを作って、C3、C4を作ってコミット、プッシュしたが、その間にmasterにC5、C6ができたので、
- (1) feature1でmasterにリベースしてから、(2) プッシュするとエラーになる
なぜエラーになるのかというと、
[local] | C1--C2--C5--C6--C3'--C4' feature1 (3)
|
[remote] | C1--C2--C3--C4 origin/feature1 (4)
- (3) localでリベースするとこのような状態になっているが、このC3'とC4'は、(4) remoteにプッシュ済みのC3とC4とは別のコミットである
- したがって、この状態でプッシュしたければ、git push --foreceする必要がある