El mal git pull crea una twig de seguimiento remoto no válida

En mi lugar de trabajo, acabamos de mudarnos a Git para el control de revisiones después de más de 10 años usando Source Safe (¡seguro!). Ahora tengo que apoyar a nuestros ingenieros en su aprendizaje de la nueva herramienta. Es importante tener en count que todos estamos utilizando la interfaz de usuario de GitExtensions en Windows.

Un par de colegas hicieron lo siguiente (desde la interfaz de usuario):

  • clonar el repository central ( origen )
  • crear una nueva twig local ( A ) basada en la twig principal de desarrollo
  • crear commits en la twig A
  • mientras tenían esa twig A aún desprotegida, (erróneamente) hicieron un tirón de la twig de desarrollo principal en su twig A

Aquí está lo que la interfaz de usuario de GitExtensions se ve cuando hacemos un tirón (lamentablemente no puedo publicar capturas de pantalla del trabajo):

Tire de: origen

Sucursal local: A

Ramal remoto: desarrollar

Opción de combinación: fusionar la twig remota en la twig actual

(El button de extracción se presiona)

Aquí está lo que el logging de command de GitExtensions revela que hizo para el tirón:

git pull --progress "origin" +refs/heads/develop:refs/remotes/origin/A 

Después de ese command, los usuarios vieron una nueva twig de seguimiento remoto de origen / A aparecer en su historial, mientras que confirmamos que no hay una twig A presente en el origen.

Miré el manual de git pull para tratar de entender lo que sucedió, pero todavía no puedo entender si lo que estamos viendo es un error de GitExtensions o un malentendido de parte de lo que debe hacer Git Pull.

¿Alguien puede ayudarme a descubrir qué está pasando aquí?

Gracias por adelantado

Editar

Sé que extraer la twig de desarrollo remoto en la twig local A no tiene sentido y sé cómo resolver la situación eliminando la twig de seguimiento remoto. Lo que realmente quiero es entender la lógica detrás de la twig de seguimiento remoto origen / A que se está creando en primer lugar, ya que ninguna twig A estuvo presente en el origen.

Gracias

Solutions Collecting From Web of "El mal git pull crea una twig de seguimiento remoto no válida"

Es difícil decir si esto es un error de GitExtensions o no. En entornos corporativos, es muy inusual (casi siempre es un error) extraer algo que no sea la twig remota identificada de forma idéntica, por lo que no me sorprende que haya obtenido resultados extraños. (Diría que es un error usar git pull debido a su layout horrible, pero esa es otra historia).

La parte +refs/heads/develop:refs/remotes/origin/A se llama refspec (especificación de reference). Dice que haga que la reference de destino local llamada refs/remotes/origin/A (abreviado como origin/A ) señale la misma confirmación que la reference refs/heads/develop del repository remoto (la twig de develop en el repository remoto) apunta actualmente a. El signo más ( + ) al principio dice que forzará la reference de la reference incluso si la reference de destino no se puede reenviar rápidamente a la reference de origen.

Por lo tanto, el command de pull que mencionas hace que Git:

  1. averiguar a qué cometer apunta la ramificación de develop del repository remoto
  2. descargue ese commit y su ancestro se compromete desde el repository remoto (a exception de las cosas que ya están en el repository local)
  3. forzar los refs/remotes/origin/A locales refs/remotes/origin/A reference para apuntar a ese compromiso
  4. fusionar ese compromiso en lo que esté actualmente fuera de service

Basado en la maqueta de UI que proporcionó, esto no es lo que esperaba que sucediera. Hubiera esperado que GitExtensions ejecutara lo siguiente:

 git pull --progress origin refs/heads/develop 

Al omitir el nombre de la reference local (la parte después de los dos puntos), Git hace lo siguiente:

  1. averiguar a qué cometer apunta la ramificación de develop del repository remoto
  2. descargue ese commit y su ancestro se compromete desde el repository remoto (a exception de las cosas que ya están en el repository local)
  3. establecer la reference temporal FETCH_HEAD local para apuntar a esa confirmación
  4. fusionar ese compromiso en lo que esté actualmente fuera de service

Observe la diferencia en el paso # 3.

No estoy familiarizado con GitExtensions, pero esto es lo que creo que está haciendo GitExtensions: supone que desea que la twig remota determinada se designe como la twig ascendente oficial de la sucursal local determinada. Con esa suposition, crear origin/A como una twig de seguimiento remoto para la twig de develop del control remoto tiene un sentido moderado. Me gustaría saber si GitExtensions también modifica la configuration de configuration remote.origin.fetch o branch.A.merge en .git/config para realmente hacer que la designación sea oficial. Si es así, es un layout de interfaz de usuario deficiente. Si no, entonces es probable que sea un error.

Solo puedes sacar una twig desprotegida. Aquí es donde tu seguimiento se mezcló.

La forma más fácil de ver lo que sucede es echar un vistazo al file .git / conf. Verá qué twig está rastreando qué twig remota. Puede solucionar esto editando el file directamente o usando la opción –set-upstream de la twig git.

Recomendaría ir a search, luego inspeccionar dónde están las sucursales que toman el control remoto y luego actualizar sus sucursales locales ya sea fusionando los cambios o volviéndolos a establecer. También puede rechazar los cambios reiniciando y forzando el empuje.

Además, considere usar la línea de command. Obtiene historial de commands y otros beneficios.