comprometerse con la misma twig con git

Digamos que hay dos personas trabajando en una sucursal de Git, que revisan al mismo time pero una de ellas se compromete primero y luego la otra se compromete después. ¿Se fusionará el compromiso más nuevo con el compromiso anterior o pueden varias personas trabajar simultáneamente en la misma sucursal?

Bueno, cuando clonas un repository git (¿es eso lo que querías decir con "check out"?), Efectivamente estás creando una nueva twig. Las twigs de Git son locales para cada repository, no global. Una vez dicho esto, tiene un protocolo sobre cómo se transmiten las actualizaciones de las sucursales entre repositorys: cuando extrae de un control remoto, por defecto la twig "principal" del control remoto se fusiona con su twig "principal", por ejemplo. Y cuando presione, su twig "maestra" se puede agregar a la twig maestra del control remoto. De modo que el maestro y el maestro de control remoto ("origen / maestro", si se quiere) son twigs diferentes, pero están relacionadas por convención.

Volviendo al punto — notas que dije que tu twig principal se puede agregar cuando presionas un control remoto. Si dos personas han tomado una copy de origen / maestro e hicieron cambios independientes (recuerde que esto es como hacer cambios en dos twigs localmente), una vez que una persona ha presionado sus cambios, los cambios de la otra persona no son simples anexos al origen / dominar más — tienen que fusionarse. Esto no puede suceder cuando empujas, solo cuando tiras (confusamente, "tirar" no es lo opuesto a "empujar": "search" es lo opuesto a empujar; un tirón es una búsqueda seguida de una fusión (o una rebase)).

Entonces, si se encuentra en esta situación, quienquiera que intente impulsar sus cambios primero debe retroceder desde el origen / maestro actualizado, fusionar o volver a establecer la base de su versión de maestro, y luego presionar. De forma pnetworkingeterminada, no puede eliminar los cambios de alguien en una sucursal y replacelos por los suyos: necesita al less hacer "git push -f" para hacer eso, y el repository remoto puede tener configuraciones o ganchos para hacerlo considerablemente más difícil.

O bien, los dos podrían cooperar de antemano: uno de ellos saca los cambios del otro, realiza la fusión y luego empuja el resultado. Esto puede ser una buena acción si es probable que los cambios se superpongan o se afecten entre sí. Recuerde la Primera Ley de los sistemas de control de versiones: un VCS no reemplaza la comunicación .

En Git, las sucursales son estrictamente locales . Un desarrollador no puede cambiar las twigs remotas de otro desarrollador (vea la nota en la parte inferior). Sin embargo, en el caso de un repository simple, puede "presionar" sus cambios para actualizar las twigs del repository remoto, si los cambios darán como resultado un avance rápido.

Pero si dos desarrolladores se están comprometiendo con el mismo repository remoto, solo uno podrá avanzar rápidamente en la twig remota sin actualizar su twig al principio.

Por ejemplo, supongamos que Alice y Bob trabajan en la twig principal en sus repositorys locales, cada uno clonado desde un repository compartido (sin connection) en un server. Si Alice termina su trabajo primero, cuando empuja sus cambios comprometidos al repository compartido compartido, avanzará rápidamente la twig principal del repository desnudo.

Ahora Bob no puede avanzar rápidamente la twig maestra del repository desnudo sin actualizar primero su twig local para include los commits que Alice ha agregado (porque los commits que ha agregado no son ancestros de los commits que creó Alice).

Una forma en que Bob puede hacer esto es tirar (o preferiblemente rebasear) del repository desnudo después de que Alice haya empujado sus compromisos. Esto fusionará los cambios de Alice en la twig de Bob y posibilitará que Bob adelante rápidamente la twig maestra del repository desnudo con un empujón.

Otros flujos de trabajo son posibles: Alice y Bob podrían cooperar entre sí directamente sin usar un repository compartido. Hay posibilidades casi infinitas, realmente. Pero en general, la fusión en Git se hace mediante cambios.

[nota: en realidad es posible insert en repositorys no desnudos, y de ese modo actualizar las twigs de otras personas, sin embargo, esto a menudo produce resultados poco intuitivos, no se considera un flujo de trabajo de git típico, y generalmente no se fomenta]

Una respuesta más corta es esta:

commit -m "my changes" 

Recuperar la versión compartida

 git fetch shanetworkingrepo 

uno de estos dos para sincronizar su sucursal local con el otro repository

 git merge shanetworkingrepo/shanetworkingbranch git rebase shanetworkingrepo/shanetworkingbranch 

Rebase serializa el historial si no quiere muchas twigs en el historial final. Ambas opciones pueden obligarte a resolver conflictos antes de que termines.

Después de fusionar / rebasear y resolver conflictos, retrocede al repository

 git push shanetworkingrepo HEAD:shanetworkingbranch 

No use -f aquí ya que esto debería ser un avance rápido. Si tiene mala suerte, alguien más puede haber empujado una nueva versión. Si eso sucede, reinicie este procedimiento.

Varias personas pueden trabajar en la misma twig al mismo time. Cuando tiras (o haces que la otra persona empuje) sus cambios a ti git combinarán los cambios, lo que resultará en una twig con tus dos cambios.

Puede trabajar por separado y luego, cuando necesite realizar cambios de inserción / extracción, haga lo siguiente:

 git add --all . git commit -m "Commit desc" git pull git push 

Explicado:

 git add --all . 

Agregar todos los cambios, incluidos los files eliminados

 git commit -m "Commit desc" 

Declarar el compromiso

 git pull 

Primero tirar, que se fusionará, es posible que tenga que arreglar conflictos

 git push 

Presione la última versión fusionada [opcional: si desea enviar sus cambios]

Si desea más control, como poder trabajar en múltiples versiones locales / remotas simultáneamente, entonces eche un vistazo a las sucursales .

Recomiendo esta página simple pero útil como un flujo de trabajo sugerido http://genomewiki.ucsc.edu/index.php/Working_with_branches_in_Git cubre algunos procedimientos excelentes.