Implementé el clásico flujo de trabajo OSS maintainer/contributor git para un proyecto de empresa en github, sin embargo, un caso extremo produce algunos resultados extraños que no estoy seguro de cómo moverme.git pull --rebase upstream & git push origen rechaza avance rápido?
Digamos que hay un proyecto típico que bifurqué y agregué el control remoto upstream para mantenerlo actualizado.
git clone [email protected]:kozhevnikov/<project>.git
git remote add upstream [email protected]:<company>/<project>.git
A los fines de este ejemplo, este tenedor está retrasado por unos pocos commits.
git reset --hard HEAD~5 && git push --force
que trabajan en este tenedor y empujar algunas confirmaciones, antes de empujar mi última confirmación y la creación de una solicitud de extracción actualizo clon de mi tenedor para asegurarse de que no hay conflictos.
touch foo && git add foo && git commit -m foo && git push
touch bar && git add bar && git commit -m bar
git pull --rebase upstream master
From github.com:<company>/<project>
* branch master -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Applying: foo
Applying: bar
Ahora, cuando intento empujar hacia mi tenedor, me rechazan.
git push
To [email protected]:kozhevnikov/<project>.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to '[email protected]:kozhevnikov/<project>.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.
¿Qué debo hacer después? Todo lo que quiero es que la solicitud de extracción contenga las confirmaciones de foo y de compás, sin embargo ...
Cuando yo pull
, la solicitud de extracción contiene confirmaciones foo duplicadas así como fusión adicional.
git pull
Merge made by the 'recursive' strategy.
git push
En github pull request se ve así.
Showing 4 unique commits by 1 author.
12345
kozhevnikov foo 4 minutes ago
67890
kozhevnikov foo 4 minutes ago
abcde
kozhevnikov bar 2 minutes ago
fghij
kozhevnikov Merge branch 'master' of github.com:kozhevnikov/<project> just now
Cuando git pull --rebase
en lugar de pull
, en el mejor de que voy a incluir a otras personas del cometa en mi solicitud de extracción (los de reinicio), y en el peor, me da conflictos de fusión.
Cuando git push --force
sin ningún pull
o --rebase
funciona perfectamente, sin embargo estoy muy incómodo al decir que todos usen la fuerza o lo que es parte del flujo de trabajo estándar como me puedo imaginar pocas personas o un pequeño sub-equipo que colaboran en una sola tenedor y pisar los dedos del otro con forzado push.
¿Alguna idea? ¿Qué me estoy perdiendo?