2011-09-18 12 views
19

Antecedentes:Git: duplicado se confirma después de rebase local, entonces tire

Tengo una rama de la característica A, que es una cometen por delante de mi rama de desarrollo:

3 (develop, origin/develop) 
| 2 (A, origin/A) some feature branch commit 
|/ 
1 some commit 

Entonces rebase A en desarrollar (git checkout A, git rebase develop), por lo que me sale:

2' (A) some feature branch commit 
| 
3 (develop, origin/develop) 
| 2 (origin/A) some feature branch commit 
|/ 
1 some commit 

Ahora ya no se puede empujar A-origin como G rechazará un compromiso de avance no rápido. Me dice que primero tire de los cambios remotos.

Cuando lo hago y luego empuje, que terminan con la siguiente historia:

4 (A, origin/A) merged origin/A into A 
|\ 
2'| some feature branch commit 
| | 
3 | (develop, origin/develop) 
| 2 (origin/A) some feature branch commit 
|/ 
1 some commit 

termino con una historia que contiene el 2 cometer dos veces - técnicamente diferentes compromete a pesar de que hacen lo mismo.

Preguntas

  1. ¿Cómo puedo evitar que esto suceda? ¿Cómo puedo reflejar mi operación de rebase local en el repositorio remoto?
  2. ¿Cómo puedo remediar esta situación? ¿Cuál sería la forma más elegante de limpiar la historia y mostrar solo una confirmación?
+0

¿No puedes volver a desarrollar la base en A? – Mat

+0

¿Puedes hacer una fusión de git en su lugar? –

+0

posible duplicado de [confirmaciones de Git se duplican en la misma rama después de hacer una rebase] (http://stackoverflow.com/questions/9264314/git-commits-are-duplicated-in-the-same-branch-after-doing -a-rebase) – Whymarrh

Respuesta

24
  1. Un rebase está reescribiendo la historia - para evitar problemas no rebase las cosas que son empujados.

  2. Puede push --force mientras A está desprotegido. origin/A historia se sobrescribirá con su versión de A. Tenga en cuenta que esto requerirá la intervención manual de otros desarrolladores en sus repos después.

+0

Bueno ... si lo pones así, lo haces sonar simple. – avdgaag

+0

Para el repositorio de JBoss AS 7 GitHub, se decidió que no deseaban fusiones en la historia, por lo que todas las sucursales se cambiaron. Por lo tanto, cada rama de características debe tratarse así, y los subcomponentes deben sincronizar (rebasear) solo en esta rama. Puede desordenarse con bastante facilidad. –

4

¿Cómo se puede evitar que su suceda? ¿Cómo puedo reflejar mi operación de rebase local en el repositorio remoto?

¿Cómo puedo remediar esta situación? ¿Cuál sería la forma más elegante de limpiar la historia y solo mostrarla?

Borre la rama remota y repulse su nueva rama rebasada. Si otros miembros de su equipo pueden haber sacado su rama 'A', avísenles que eliminen esa rama y repitan una nueva versión.

+2

... y si (probablemente) trabajan en esa rama, dígales que rebase en la rama que acaba de actualizar. –