git pull --base perdida confirma após o empurrão git do colega de trabalho --force
Eu pensei que tinha entendido como o git pull --rebase estava funcionando, mas este exemplo está me confundindo. Eu teria imaginado que os dois cenários a seguir produziriam resultados idênticos, mas eles diferem.
Primeiro, o que funciona.
# Dan and Brian start out at the same spot:
dan$ git rev-parse HEAD
067ab5e29670208e654c7cb00abf3de40ddcc556
brian$ git rev-parse HEAD
067ab5e29670208e654c7cb00abf3de40ddcc556
# Separately, each makes a commit (different files, no conflict)
dan$ echo 'bagels' >> favorite_foods.txt
dan$ git commit -am "Add bagels to favorite_foods.txt"
brian$ echo 'root beer' >> favorite_beverages.txt
brian$ git commit -am "I love root beer"
# Brian pushes first, then Dan runs `git pull --rebase`
brian$ git push
dan$ git pull --rebase
dan$ git log
commit 9e1140410af8f2c06f0188f2da16335ff3a6d04c
Author: Daniel
Date: Wed Mar 1 09:31:41 2017 -0600
Add bagels to favorite_foods.txt
commit 2f25b9a25923bc608b7fba3b4e66de9e97738763
Author: Brian
Date: Wed Mar 1 09:47:09 2017 -0600
I love root beer
commit 067ab5e29670208e654c7cb00abf3de40ddcc556
Author: Brian
Date: Wed Mar 1 09:27:09 2017 -0600
Shared history
Então, isso funciona bem. No outro cenário, imagine que Dan pressionou e, em seguida, Brian (grosseiramente) pressionou - forçou seu commit. Agora, quando Dan corregit pull --rebase
, seu commit se foi.
# Dan and Brian start out at the same spot:
dan$ git rev-parse HEAD
067ab5e29670208e654c7cb00abf3de40ddcc556
brian$ git rev-parse HEAD
067ab5e29670208e654c7cb00abf3de40ddcc556
# Separately, each makes a commit (different files, no conflict)
dan$ echo 'bagels' >> favorite_foods.txt
dan$ git commit -am "Add bagels to favorite_foods.txt"
brian$ echo 'root beer' >> favorite_beverages.txt
brian$ git commit -am "I love root beer"
# THIS TIME, Dan pushes first, then Brian force pushes.
dan$ git push
brian$ git push --force
dan$ git pull --rebase
dan$ git log # Notice, Dan's commit is gone!
commit 2f25b9a25923bc608b7fba3b4e66de9e97738763
Author: Brian
Date: Wed Mar 1 09:47:09 2017 -0600
I love root beer
commit 067ab5e29670208e654c7cb00abf3de40ddcc556
Author: Brian
Date: Wed Mar 1 09:27:09 2017 -0600
Shared history
A versão de origem da ramificação tinha o mesmo estado depois que Brianpush --force
como aconteceu no primeiro cenário, então eu esperava o mesmo comportamento degit pull --rebase
. Estou confuso por que o comprometimento de Dan foi perdido.
Entendo pull --rebase para dizer "pegue minhas alterações locais e as aplique após as remotas". Não espero que as mudanças locais sejam descartadas. Além disso, se Dan tivesse executadogit pull
(com nenhum--rebase
), seu commit não está perdido.
Então, por que Dan perde seu commit local quando ele executagit pull --rebase
? O empurrão de força faz sentido para mim, mas isso não deveria deixar o controle remoto no mesmo estado como se Brian tivesse empurrado primeiro?
Como estou pensando nisso errado?