Git empuje a una nueva sucursal. Cree una nueva sucursal en el servidor desde la sucursal local actual. ¿Cuál es la diferencia entre "git pull" y "git fetch"

Si se usa la autenticación de contraseña:

  1. $ git clone https: // nombre de usuario: [correo electrónico protegido]/opt/git/repository.git

Trabajar con ramas

  Mostrar todas las sucursales:
  1. $ git branch
  Crea una nueva sucursal:
  1. $ git branch
  Ir a la nueva sucursal:
  1. $ git pago
  Crea una nueva rama y ve a ella:
  1. $ git checkout -b
  Eliminar sucursal local:
  1. $ git branch -d
  Eliminar una rama de un repositorio remoto:
  1. $ git push origin --delete

Trabaja con commits

¿Cómo eliminar la última confirmación?

  1. $ git reset --soft HEAD ^
Git como hacerlo. Capítulo 16. Cancelación de confirmaciones
Git como hacerlo. Capítulo 17. Eliminar commits de una rama
Documentación oficial de Git. Conceptos básicos de Git: reversión de cambios

¿Cómo cambiar la última confirmación?

  1. $ git add new_file.txt
  2. $ git commit --amend

¿Cómo cambiar el comentario en la última confirmación?

  1. $ git commit --amend
  2. $ git commit --amend -m "Nuevo comentario"

¿Cómo combinar múltiples confirmaciones?

  1. $ git rebase -i HEAD ~ 3
   En lugar de HEAD ~ 3, puede usar el hash de la confirmación. Es necesario pasar el hash de ese compromiso al que todo se debe fusionar (aplanar).
Se abrirá un editor con una lista de confirmaciones, la confirmación más antigua estará en la parte superior.
  1. recoger 1111111 Confirmar 1 comentario
  2. recoger 2222222 Confirmar 2 comentarios
  3. recoger 3333333 Confirmar 3 comentarios
   Debe reemplazar la selección con calabaza para obtener esto:
  1. recoger 1111111 Confirmar 1 comentario
  2. squash 2222222 Cometer 2 comentarios
  3. squash 3333333 Cometer 3 comentarios
   A continuación, debe guardar el archivo y salir. Se abrirá nuevamente un editor de texto con todos los comentarios para las confirmaciones. Necesita editar, guardar y salir. Después de estas acciones, los commits se fusionarán.

¿Cómo deshacer los cambios en un archivo específico y devolverlo al estado en el que estaba después de la última confirmación?

  1. $ git checkout - archivo.txt

¿Cómo deshacer todos los cambios no comprometidos (no comprometidos)?

  1. $ git pago

¿Cómo mantener algunos archivos para la próxima confirmación?

Suponga que desea confirmar los cambios en algunos archivos y realizar cambios en otros archivos en la próxima confirmación. Luego, puede eliminarlos temporalmente del repositorio (archivos sin etapas) y luego agregarlos nuevamente.
  1. $ git reset HEAD file.txt
   Este comando eliminará el archivo del repositorio, permanecerá en las confirmaciones anteriores. Head indica la última confirmación en la rama actual.

Si no puede pasar al repositorio remoto porque la versión actual del repositorio es más pequeña que en el repositorio remoto

En este caso, puedes dar un empujón.
  1. $ git push -f maestro de origen

Fusionar ramas

¿Cómo tomar solo algunos archivos de otra sucursal?

  1. $ git checkout branchname - ruta / a / archivo.file

Repositorios remotos

Mostrar información sobre un repositorio remoto

  1. $ git origen show remoto
  Mostrará algo como esto:
  1. * origen remoto
  2. Obtener URL: [correo electrónico protegido]: /opt/git/test-project.git
  3. URL de inserción: [correo electrónico protegido]: /opt/git/test-project.git
  4. Rama principal: maestro
  5. Rama remota:
  6. master new (la próxima búsqueda se almacenará en controles remotos / origen)
  7. Referencia local configurada para "git push":
  8. maestro empuja a maestro (local desactualizado)

Agregar un repositorio remoto

  1. $ git remoto agregar origen [correo electrónico protegido]: /opt/git/test-project.git

Ramas eliminadas   - estos son enlaces al estado de las sucursales en sus repositorios remotos. Estas son sucursales locales que no se pueden mover; se mueven automáticamente cada vez que te comunicas a través de la red. Las ramas remotas actúan como marcadores para recordarle de dónde eran las ramas en los repositorios remotos la última vez que se conectó a ellas.

En este caso, por ejemplo, es posible continuar el litigio en una fusión compleja y poder preservar todos los intentos disponibles para discutir la fusión en sí. Supongamos ahora que Marco le sugiere a Gianni que el intento 2 es el más correcto, pero se necesita un pequeño cambio.

Empuje de reescritura de historia

Aquí está la situación. En esta etapa, tenemos una tercera solución de fusión, que es el resultado del intento de Gianni2, a la que Marco agregó sus correcciones. En este punto, puede realizar la limpieza.


En este momento, Gianni puede intentar un empuje que será exitoso si al mismo tiempo nadie más empuja más cambios en el origen.

Se ven como (repo de nombre de eliminación) / (Branch). Por ejemplo, si desea ver cómo se veía la rama maestra en el servidor de origen durante la última conexión, verifique la rama origen / maestra. Si usted y su socio trabajaron en un problema, y \u200b\u200bél publicó la sucursal de iss53, puede tener su propia sucursal local de iss53; pero esa rama en el servidor apuntará a la confirmación en origen / iss53.

En este punto, si intenta hacer clic, recibirá un mensaje de error. De hecho, Gianni ha creado una situación en la que su resultado perfecto del cambio contradice las obligaciones antes de la enmienda. Esta regla tiene una consecuencia, que sugiere, especialmente después de fusiones complejas, ejecutar un gran número pruebas y verificaciones para asegurarse de que su fusión sea correcta antes de hacer clic. Una vez que el empuje es, cambiar la fusión se convierte en una operación trivial.

La administración de sucursales en un sistema distribuido es radicalmente diferente de la centralizada, donde una sucursal no es más que una "copia inteligente" de la carpeta de control de versiones. A nivel conceptual, una rama es una "cadena de código", que puede diseñarse de forma independiente y sincronizarse con otras cadenas de código mediante operaciones de fusión. Por el contrario, en distribuida esta necesidad está completamente ausente, ya que el concepto de "línea de código" es inherente a la estructura de un repositorio distribuido. El proceso de complemento indica qué cambios deben incluirse en la próxima confirmación, y se usa para "agregar nuevos archivos" o para "agregar archivos que ya están en el repositorio, pero que han cambiado".

Todo esto puede ser confuso, así que veamos un ejemplo. Creé un repositorio remoto en GitHub https://github.com/n0tb0dy/RemoreBranches

Allí hice tres commits


Al clonar un repositorio remoto, Git lo nombrará automáticamente origen, toma todos los datos de allí, crea un puntero a lo que la rama señala allí maestroy llamarlo localmente origen / maestro   (pero no puedes moverlo). Git también te hará tu propia sucursal. maestro, que comenzará en el mismo lugar que la rama maestro   en origen, así tendrás algo con lo que trabajar.

De hecho, todos los archivos que se agregan se agregan a un área específica llamada área de preparación, que contiene los cambios que deben incluirse en la próxima confirmación. Al final de las operaciones anteriores, aparece el repositorio de muestra, como se muestra en la figura a continuación, que muestra la diferencia con el sistema centralizado.

El hecho de tener repositorios locales implica que dos desarrolladores separados crearon comisiones locales del mismo padre y, por lo tanto, tienen dos líneas de código diferentes: una para los desarrolladores o ambas trabajaron en su sucursal local.

"Origen" no es un nombre especial

Esto es similar al nombre de la rama maestra, que se proporciona de forma predeterminada al crear un repositorio local. Como una rama maestro   creado por defecto cuando el comando git init, tal como se usa el nombre predeterminado origen   a la orden git clone. Si le das al comando git clone –o booyah, obtendrás booyah / master como tu rama remota predeterminada.

Esta situación es inútil y tiene sentido solo cuando desea ver el contenido del repositorio en un momento anterior, pero no se recomienda usarlo para el trabajo y realizar otros cambios. Por lo tanto, hablando de un puntero, esta es una variable simple que apunta a una confirmación específica y generalmente se llama una rama. De hecho, la rama no es una "copia inteligente" de la carpeta, sino solo un puntero que indica una confirmación específica, y le permite hacer un "cierre" de esta confirmación.

En este caso, debe almacenar localmente dos líneas de código separadas: la maestra y aquella en la que se solucionará el error. En el modo centralizado, esta opción no está disponible, la única analogía es crear una sucursal en el servidor, pero será visible para todo el equipo. En este punto, solo proporcione el nombre de la sucursal.

Y volvamos a nuestros ... compromisos. En un repositorio remoto, se ven así

El equipo git fetch   solo recibe actualizaciones de un servidor que aún no tiene y no cambia su directorio de trabajo de ninguna manera. Este comando simplemente recibe los datos y le permite decidir por sí mismo qué hacer con ellos (combinar con sus datos, editar, etc.)

En este caso, está claro que la rama recién creada es solo local, por lo tanto, no se publica en la fuente. La pestaña de confirmaciones proporciona una explicación más detallada. Esto crea la rama creada solo en el repositorio local y no verá a nadie. Ahora, teniendo dos ramas locales, y luego dos punteros, así es como aparece el repositorio local después de dos confirmaciones en la rama local y confirmación en la principal.

La figura anterior muestra cómo fusionar la rama en la que se soluciona el error principal. Tan pronto como se resuelva cada conflicto, debe realizar una nueva confirmación con su resolución. Como puede ver, el resultado es similar a la resolución de conflictos causados \u200b\u200bpor dos desarrolladores que cambiaron el mismo archivo en sus respectivos repositorios localesEl concepto es similar. En el caso anterior, se produjo un conflicto entre el maestro local y el maestro remoto, y en este caso, se produce un conflicto entre dos ramas locales.

El equipo git pull en la mayoría de los casos fusiona inmediatamente los datos recibidos con los tuyos.

Normalmente, es mejor usar el comando git fetch y el comando git merge para poder controlar el proceso de fusión usted mismo.

Eliminar ramas eliminadas

Por supuesto, me refiero a eliminar sucursales en un servidor remoto

Después de resolver conflictos entre sucursales locales, puede haber conflictos adicionales sobre el asistente causados \u200b\u200bpor otros desarrolladores que modificaron los mismos archivos que en la figura a continuación. El resultado se muestra a continuación. En este caso, tenemos dos sucursales locales y una remota, se realizan todas las fusiones y luego podemos hacer clic en el repositorio central.

Efectos de afiliación local para otros desarrolladores.

A menudo, las ramas locales utilizadas para corregir errores o experimentos ya no tienen sentido después de la fusión y se eliminan. La operación de eliminación simplemente borra el puntero, pero siempre quedan todos los compromisos comprometidos. Un aspecto interesante es comprender lo que ven otros desarrolladores cuando sacan el pull y sacan los cambios del desarrollador que hicieron una fusión local. Entonces, veamos qué le sucede a otro desarrollador de equipo.

$ git push origin --eliminar serverfix


Hop! Y la rama en el servidor remoto desapareció. Pero básicamente, este comando simplemente elimina el puntero de rama en el servidor remoto. El servidor git continuará almacenando toda la información sobre confirmaciones hasta que ejecute el comando de recolección de basura.

Esto es lo que ve otro desarrollador. Esta situación a menudo lleva al hecho de que las personas no usan sucursales locales para no complicar el repositorio central, pero esto priva muchas de las ventajas de esta herramienta. Supongamos que el segundo desarrollador se queja de que la situación se confunde en su repositorio porque la rama local creada por el primer desarrollador hizo que la estructura del repositorio sea más compleja. Si todos los desarrolladores usan sucursales locales, el repositorio central puede volverse inmanejable.

La situación es similar a la situación en la situación anterior. Dado que todos los efectos se pueden asimilar utilizando la herramienta de captura de carpeta, que para cada confirmación retiene el diferencial con el estado anterior, toda esta información se puede utilizar para volver a aplicar cambios diferenciales para diferentes padres. Para las sucursales locales limitadas por parches, a menudo no hay conflictos, y luego la operación se completa con éxito.