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?

questionAnswers(4)

yourAnswerToTheQuestion