2012-03-12 13 views
8

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?

Respuesta

16

Cuando

git pull --rebase upstream master 

está reescribiendo su propia historia, ya que se rebase su oficina principal en el depósito de aguas arriba actualizada. Cuando empujas tu repositorio rebasado a tu fork, git se queja. Necesita presionar con --force

git push --force origin master