¿La fusión es obligatoria en Git?

Uso SVN por un time ahora. Pero solo uso checkout, update y commit, ya que solo necesito una copy de security con historial.

Estoy intentando con Git ahora en un nuevo proyecto. Aquí esta lo que hice:

  • Creó un repository en Bitbucket.
  • Git se clona en mi máquina.
  • Creado un par de files.
  • Git commit -a.
  • Git push.

Todo muy bien. Revisé Bitbucket y los files estaban allí. Eso fue ayer. Hoy lo hice:

  • Se agregaron algunos files más
  • Git commit -a.
  • Git push.

Y recibí un post de error. No lo guardé, pero decía algo sobre el avance rápido. Por alguna razón, no pude empujar mi compromiso al repository. Hice varias recuperaciones, confirmaciones y empujones y obtuve el mismo error al empujar. Luego hice un tirón, que hasta donde sé es una búsqueda seguida de una fusión, luego un empujón y funcionó (un poco). Mi logging de repository se ve así ahora:

commit ef6b0e51c8278ef15d1d84770a56929f7c30cc63 Merge: 15d482c ab3938a Author: xxx Date: Wed Jan 25 04:25:39 2012 -0200 Merge branch 'master' of bitbucket.org:xxx/xxx commit 15d482c0bd2e9b894afd779520dbfdbad7f43616 Author: xxx Date: Tue Jan 24 03:50:43 2012 -0200 xxx commit ab3938aaacb089f1c4f3bdbb8d843a105991f776 Author: xxx Date: Tue Jan 24 03:50:43 2012 -0200 xxx 

Esto es extraño. El primer compromiso es correcto. Fue hecho ayer. Pero el segundo debería tener la date de hoy. Pero tiene exactamente la misma date que ayer, hasta los segundos. Y hay un tercer compromiso, que es solo la fusión, con la date de hoy.

¿Es esta la manera en que se supone que es? ¿O hice algo mal? ¿Tengo que fusionarme entre un commit y un push?

Solo se puede presionar, si la twig presionada se puede fusionar en la twig presionada con una fusión de fast-forward , lo que significa que el jefe actual de la twig remota debe ser parte del historial de sucursales local. Si no tiene la última versión de la twig remota fusionada en su sucursal local, la inserción fallará (esto es lo mismo que con svn, donde no puede confirmar si su versión local no es reciente).

Por lo tanto, parece como si hubiera un compromiso enviado a esa twig (en el repository remoto) entre usted empujando ayer y usted tratando de empujar hoy, aunque con las informaciones dadas no pude decir de dónde viene.

Entonces, si trabajas solo en una sucursal (y solo desde una location), normalmente puedes salirte con la suya simplemente presionando y presionando; de lo contrario, necesitarás usar git fetch seguido de git merge (o simplemente git pull ) para get la más reciente versión de la twig remota en la suya, antes de que pueda presionarlo.

Si no puede presionar porque no se trata de una actualización de avance rápido, eso significa que alguien empujó los commits a bitbucket. Una actualización rápida es una actualización de una confirmación anterior en el historial de la confirmación actual, es decir. No estás haciendo una fusión, simplemente estás acelerando el time.

Pull hará una git fetch y luego una git merge , que puede o no dar como resultado una fusión real, git hará un avance rápido por defecto si es posible.

De su logging anterior, hubo una fusión real, así que volvemos al punto de partida. De alguna manera, algunos commits adicionales llegaron a tu repository bitbucket. ¿Acaso hiciste algunas ediciones en línea?

En cuanto a su pregunta sobre la necesidad de una combinación, no es necesario que realice una fusión. Sin embargo, necesitas resolver el tenedor. Puedes hacer esto de una de dos maneras. Puedes hacer una combinación, o puedes hacer lo que se denomina una rebase. Básicamente, lo que hace git cuando haces una rebase es volver a aplicar los diffs de tus commits al final del historial alternativo. Esto crea la ilusión de que hiciste tu nuevo trabajo directamente encima del otro trabajo nuevo. Git conserva las dates de autor y de confirmación, por lo que el historial puede ser un poco no lineal si lleva a cambiar el nombre de un lote, sin embargo, algunas personas prefieren el historial de una sola línea. Puedes hacer fácilmente una rebase usando git pull --rebase

Parece que otro usuario agregó una confirmación a su repository de BitBucket. Lo que describes es exactamente lo que sucedería si tu inserción fallara con un post que git no puede avanzar rápidamente.

Claramente, eso debe haber sucedido, porque git log informa que había algo para fusionar en ef6b0e5.

Y encontraste la solución: tenías que extraer (search y fusionar el cambio ascendente en tu sucursal) desde el repository Bitbucket antes de que git te permitiera realizar los cambios.

Me di count de cuál era el problema. Verifiqué "Amend Last Commit" en el segundo commit. Entonces, básicamente lo hice:

  • Crear repository en Bitbucket.
  • Clon.
  • Agregar file1.
  • Cometer.
  • Empujar.
  • Agregar file2.
  • Commit – enmienda
  • Empujar.

El error que obtuve fue:

 git.exe push --progress "origin" master:master To git@bitbucket.org:xxx/test_repo.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@bitbucket.org:xxx/test_repo.git' To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes (eg 'git pull') before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details. 

Intenté search y fusionar. Aún no pudo empujar. Tuve que hacer un tirón. Tengo:

 git.exe pull -v --progress "origin" From bitbucket.org:xxx/test_repo = [up to date] master -> origin/master Merge made by the 'recursive' strategy. Success 

Entonces podría empujar.

Enmendar una comisión que ya había sido presionada era el problema. Es por eso que ambos commits tienen la misma date.

Gracias por toda la ayuda.