Gestión de ramas de Git
La gestión de ramas de Git es una de las funciones potentes de Git, que permite que varios desarrolladores trabajen en paralelo, desarrollen nuevas funciones, corrijan errores o realicen experimentos sin afectar el repositorio de código principal.
Casi todos los sistemas de control de versiones admiten ramas de alguna forma; una rama representa una línea de desarrollo independiente.
Usar ramas significa que puedes separarte de la línea principal de desarrollo y seguir trabajando sin afectar la línea principal.
Las ramas de Git son en realidad punteros a instantáneas de cambios.
Algunos llaman al modelo de ramas de Gitla característica asesina, y es precisamente por esto queGitse distingue de la familia de los sistemas de control de versiones.
Crear una rama
Crear una nueva rama y cambiar a ella:
git checkout -b <branchname>
Por ejemplo:
git checkout -b feature-xyz
Comando para cambiar de rama:
git checkout (branchname)
Por ejemplo:
git checkout main
Cuando cambias de rama, Git reemplaza el contenido de tu directorio de trabajo con la instantánea de la última confirmación de esa rama, por lo que varias ramas no necesitan varios directorios.
Ver ramas
Ver todas las ramas:
git branch
Ver ramas remotas:
git branch -r
Ver todas las ramas locales y remotas:
git branch -a
Fusionar ramas
Fusionar otra rama en la rama actual:
git merge <branchname>
Por ejemplo, cambia a la rama main y fusiona la rama feature-xyz:
git checkout main git merge feature-xyz
Resolver conflictos de fusión
Cuando surge un conflicto durante la fusión, Git marca los archivos en conflicto y debes resolver el conflicto manualmente.
Abre el archivo en conflicto y resuelve el conflicto siguiendo las marcas.
Marca el conflicto como resuelto:
git add <conflict-file>
Confirma el resultado de la fusión:
git commit
Eliminar ramas
Eliminar una rama local:
git branch -d <branchname>
Forzar la eliminación de una rama no fusionada:
git branch -D <branchname>
Eliminar una rama remota:
git push origin --delete <branchname>
Ejemplo
Antes de comenzar, creamos un directorio de prueba:
$ mkdir gitdemo $ cd gitdemo/ $ git init Initialized empty Git repository... $ touch README $ git add README $ git commit -m '第一次版本提交' [master (root-commit) 3b58100] 第一次版本提交 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README
Gestión de ramas de Git
Listar ramas
Comando básico para listar ramas:
git branch
Cuando no se pasan argumentos,git branchse listan tus ramas locales.
$ git branch * master
Esto significa que tenemos una rama llamadamaster, y esa rama es la rama actual.
Cuando ejecutasgit init, por defecto Git crea para ti la ramamaster.
Si queremos crear una rama manualmente, con ejecutargit branch (branchname)es suficiente.
$ git branch testing $ git branch * master testing
Ahora podemos ver que hay una nueva ramatesting。
Cuando creas una nueva rama de esta manera después de la última actualización de confirmación, si luego hay más confirmaciones de actualización y luego cambias a la ramatesting, Git restaurará tu directorio de trabajo al estado en que estaba cuando creaste la rama.
A continuación demostraremos cómo cambiar de rama. Usamos git checkout (branch) para cambiar a la rama que queremos modificar.
$ ls README $ echo 'example.com' > test.txt $ git add . $ git commit -m 'add test.txt' [master 3e92c19] add test.txt 1 file changed, 1 insertion(+) create mode 100644 test.txt $ ls README test.txt $ git checkout testing Switched to branch 'testing' $ ls README
Cuando cambiamos a la ramatesting, el nuevo archivo test.txt que agregamos fue eliminado. Al volver a la ramamaster, esos archivos reaparecieron.
$ git checkout master Switched to branch 'master' $ ls README test.txt
También podemos usar el comando git checkout -b (branchname) para crear una nueva rama y cambiar inmediatamente a ella, para así trabajar en esa rama.
$ git checkout -b newtest Switched to a new branch 'newtest' $ git rm test.txt rm 'test.txt' $ ls README $ touch ejemplo.php $ git add . $ git commit -am 'removed test.txt、add ejemplo.php' [newtest c1501a2] removed test.txt、add ejemplo.php 2 files changed, 1 deletion(-) create mode 100644 ejemplo.php delete mode 100644 test.txt $ ls README ejemplo.php $ git checkout master Switched to branch 'master' $ ls README test.txt
Como puedes ver, creamos una rama, eliminamos algunos archivos test.txt en ella y agregamos el archivo ejemplo.php; luego volvimos a nuestra rama principal, el archivo test.txt eliminado reapareció y el nuevo ejemplo.php no existe en la rama principal.
Usar ramas divide el trabajo, lo que nos permite trabajar en diferentes entornos de desarrollo y alternar entre ellos.
Eliminar ramas
Comando para eliminar ramas:
git branch -d (branchname)
Por ejemplo, queremos eliminar la rama testing:
$ git branch * master testing $ git branch -d testing Deleted branch testing (was 85fc7e7). $ git branch * master
Fusión de ramas
Una vez que una rama tiene contenido independiente, con el tiempo querrás fusionarla de nuevo en tu rama principal. Puedes usar el siguiente comando para fusionar cualquier rama en la rama actual:
git merge
$ git branch * master newtest $ ls README test.txt $ git merge newtest Updating 3e92c19..c1501a2 Fast-forward ejemplo.php | 0 test.txt | 1 - 2 files changed, 1 deletion(-) create mode 100644 ejemplo.php delete mode 100644 test.txt $ ls README ejemplo.php
En el ejemplo anterior fusionamos la rama newtest en la rama principal y el archivo test.txt fue eliminado.
Después de fusionar, puedes eliminar la rama:
$ git branch -d newtest Deleted branch newtest (was c1501a2).
Después de eliminar, solo queda la rama master:
$ git branch * master
Conflictos de fusión
Fusionar no es solo una simple operación de agregar o eliminar archivos; Git también fusiona modificaciones.
$ git branch * master $ cat ejemplo.php
Nota:Si no existe ejemplo.php, primero debes crear este archivo; el comando puede sertouch ejemplo.php。
Primero, creamos una rama llamada change_site, cambiamos a ella y modificamos el contenido de ejemplo.php a:
<?php echo 'ejemplo'; ?>
Crear la rama change_site:
$ git checkout -b change_site Switched to a new branch 'change_site' $ vim ejemplo.php $ head -3 ejemplo.php <?php echo 'ejemplo'; ?> $ git commit -am 'changed the ejemplo.php' [change_site 7774248] changed the ejemplo.php 1 file changed, 3 insertions(+)
Puedes consultar las operaciones del comando vim en:Linux vi/vim。
Confirma los cambios en la rama change_site. Ahora, si cambiamos de nuevo a la rama master, podemos ver que el contenido se restauró al estado anterior a nuestra modificación (archivo vacío, sin código); modificamos nuevamente el archivo ejemplo.php.
$ git checkout master Switched to branch 'master' $ cat ejemplo.php $ vim ejemplo.php # 修改内容如下 $ cat ejemplo.php <?php echo 1; ?> $ git diff diff --git a/ejemplo.php b/ejemplo.php index e69de29..ac60739 100644 --- a/ejemplo.php +++ b/ejemplo.php @@ -0,0 +1,3 @@ +<?php +echo 1; +?> $ git commit -am '修改代码' [master c68142b] 修改代码 1 file changed, 3 insertions(+)
Ahora estos cambios están registrados en mi rama "master". A continuación fusionamos la rama "change_site".
$ git merge change_site Auto-merging ejemplo.php CONFLICT (content): Merge conflict in ejemplo.php Automatic merge failed; fix conflicts and then commit the result. $ cat ejemplo.php # 打开文件,看到冲突内容 <?php <<<<<<< HEAD echo 1; ======= echo 'ejemplo'; >>>>>>> change_site ?>
Fusionamos la rama anterior en la rama master; aparece un conflicto de fusión y a continuación debemos resolverlo manualmente.
$ vim ejemplo.php $ cat ejemplo.php <?php echo 1; echo 'ejemplo'; ?> $ git diff diff --cc ejemplo.php index ac60739,b63d7d7..0000000 --- a/ejemplo.php +++ b/ejemplo.php @@@ -1,3 -1,3 +1,4 @@@ <?php +echo 1; + echo 'ejemplo'; ?>
En Git, podemos usar git add para indicar a Git que el conflicto del archivo se ha resuelto.
$ git status -s UU ejemplo.php $ git add ejemplo.php $ git status -s M ejemplo.php $ git commit [master 88afe0e] Merge branch 'change_site'
Ahora hemos resuelto con éxito el conflicto de fusión y hemos confirmado el resultado.
Manual de comandos
| Comando | Descripción | Ejemplo de uso |
|---|---|---|
git branch |
Lista, crea o elimina ramas. No cambia de rama; solo se usa para gestionar la existencia de ramas. | git branch: lista todas las ramasgit branch new-branch: crea una nueva ramagit branch -d old-branch: elimina una rama |
git checkout |
Cambia a la rama especificada o restaura archivos en el directorio de trabajo. También se puede usar para extraer (checkout) una confirmación específica. | git checkout branch-name: cambiar de ramagit checkout file.txt: restaurar archivos al área de trabajogit checkout <commit-hash>: extraer una confirmación específica |
git switch |
Está diseñado específicamente para cambiar de rama; en comparación congit checkoutes más simple e intuitivo, y se usa principalmente para operaciones con ramas. |
git switch branch-name: cambia a la rama especificadagit switch -c new-branch: crea una nueva rama y cambia a ella |
git merge |
Fusiona los cambios de la rama especificada en la rama actual. | git merge branch-name: fusiona los cambios de la rama especificada en la rama actual |
git mergetool |
Inicia la herramienta de fusión para resolver conflictos de fusión. | git mergetool: resuelve conflictos con la herramienta de fusión predeterminadagit mergetool --tool=<tool-name>: especifica la herramienta de fusión |
git log |
Muestra el historial de confirmaciones. | git log: muestra el historial de confirmacionesgit log --oneline: muestra el historial de confirmaciones en modo compacto |
git stash |
Guarda los cambios no confirmados en el directorio de trabajo actual y lo restaura a un área de trabajo limpia. | git stash: guarda los cambios actualesgit stash pop: restaura los cambios guardados más recientementegit stash list: lista todos los cambios guardados |
git tag |
Crea, lista o elimina etiquetas. Las etiquetas se usan para marcar confirmaciones específicas. | git tag: lista todas las etiquetasgit tag v1.0: crea una nueva etiquetagit tag -d v1.0: elimina una etiqueta |
git worktree |
Permite verificar múltiples áreas de trabajo en un repositorio; es adecuado para trabajar con varias ramas al mismo tiempo. | git worktree add <path> branch-name: agrega un nuevo área de trabajo en la ruta especificada y cambia a la rama especificadagit worktree remove <path>: elimina el área de trabajo |