Compartir tecnología

[Notas de estudio de Git] Capítulo 3 Elementos de ramificación, fusión y configuración (Parte 1)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Capítulo 3 Elementos de ramificación, fusión y configuración

tema relacionado:

  • Gestión de sucursales locales
  • sucursal remota
  • Forzar fusión de versiones
  • usar git reuse recorded resolution (rerere) Fusionar versiones conflictivas de Git
  • Calcular diferencias entre ramas.
  • Rama huérfana (Orphan branches

3.1 Gestión de sucursales locales

si git La biblioteca es local e incluso si no es necesario compartir el código de forma remota, la sucursal local se puede administrar como un almacén que debe compartirse de forma remota. Como se muestra en este ejemplo, primero debe copiar un almacén al área local, lo que significa que hay una biblioteca remota.

# clone the jgit repository to match
$ git clone https://git.eclipse.org/r/jgit/jgit 
$ cd jgit 
# Whenever you start working on a bug fix or a new 
# feature in your project, you should create a branch
$ git branch newBugFix 
$ git branch 
* master 
 newBugFix
# The newBugFix branch points to the current HEAD
# to verify this:
$ git log -1 newBugFix --format=format:%H
25fe20b2dbb20cac8aa43c5ad64494ef8ea64ffc
# edit branch description
$ git branch --edit-description newBugFix
# Add description in a newly opened editor
Refactoring the Hydro controller 

The hydro controller code is currently horrible needs to be refactored.  
# Show the description
$ git config --get branch.newBugFix.description 
Refactoring the Hydro controller 

The hydro controller code is currently horrible and needs to be refactored.  
# Show the commit hash the new branch based on
$ cat .git/refs/heads/newBugFix 
25fe20b2dbb20cac8aa43c5ad64494ef8ea64ffc 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Se puede observar que el ID con corrienteHEAD deID coherente.

Nota: Después de crear una nueva rama, debes cambiar a esta rama para usar:git checkout -b <newBranch>

Expandir: si no sigues HEAD Cree una nueva rama, pero con un determinado ID de confirmación (979e346), en este momento el envío basado en esta versión se puede escribir:

# new branch from commit ID
$ git branch anotherBugFix 979e346 
$ git log -1 anotherBugFix --format=format:%h 
979e346 
$ git log -1 anotherBugFix --format=format:%H 
979e3467112618cc787e161097986212eaaa4533 
# checkout new branch
$ git checkout -b lastBugFix 979e346
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Ver información de la sucursal:

  1. git branch: solo nombre de sucursal
  2. git branch -v: Anotado y simplificado basado en 1 SHA-1
  3. git branch -vv: muestra los nombres de las sucursales de seguimiento remoto según 2
$ git branch -v 

  anotherBugFix 979e346 Interactive Rebase: Do actions if  
* lastBugFix    979e346 Interactive Rebase: Do actions if  
  master        25fe20b Add missing package import for jg 
  newBugFix     25fe20b Add missing package import for jg
$ git branch -vv 

  anotherBugFix 979e346 Interactive Rebase: Do actions if e 
* lastBugFix    979e346 Interactive Rebase: Do actions if e 
  master        25fe20b [origin/master] Add missing package  
  newBugFix     25fe20b Add missing package import for g 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3.2 Sucursal remota

A veces, el código nativo puede generarse a partir de un clon del código base de otra persona.En este punto, el código local tiene un almacén remoto, generalmente llamadoorigin fuente.Para comprender Git y su base de código remoto, puede comenzar congit status El comando comienza:

$ git checkout -b remoteBugFix --track origin/stable-3.2
Switched to a new branch 'remoteBugFix'
Branch 'remoteBugFix' set up to track remote branch 'stable-3.2' from 'origin'.
  • 1
  • 2
  • 3

visible,remoteBugFix La sucursal de seguimiento remoto de la sucursal esorigin/stable-3.2 .En este momentogit status Los resultados muestran que los localesHEAD con control remotoHEAD Si la sucursal local se puede reenviar rápidamente a la sucursal remota. Los ejemplos son los siguientes:

# Find a commit on remote branch
$ git log -10 origin/stable-3.2 --oneline
# Checkout specific SHA-1
$ git reset --hard 2e0d178
HEAD is now at 2e0d17885 Add recursive variant of Config.getNames() methods
# Use 'git status' to see the free benefit of Git
$ git status
On branch remoteBugFix
Your branch is behind 'origin/stable-3.2' by 9 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Aviso:

  1. Aquí hay un concepto que surge con frecuencia:fast-forward, significa que Git puede fusionarse HEAD Pasar a la última versión;
  2. git pull El comando es en realidad una combinación de dos comandos:
    1. git fetch
    2. git merge(Fusionar sucursal de seguimiento remoto con sucursal local)

Ejecute lo anterior git status El comando se utiliza para simular la ejecución local.git fetch Después de eso, el nuevo contenido en la sucursal remota se extrae a la sucursal de seguimiento local.origin/stable-3.2 estado. Continuar con la fusión realmente se sincronizará con la sucursal local:

$ git merge origin/stable-3.2
Updating 2e0d17885..f839d383e
Fast-forward
 .../org/eclipse/jgit/api/RebaseCommandTest.java    | 213 +++++++++++++++++----
 .../src/org/eclipse/jgit/api/RebaseCommand.java    |  31 +--
 .../jgit/errors/IllegalTodoFileModification.java   |  59 ++++++
 .../eclipse/jgit/lib/BaseRepositoryBuilder.java    |   2 +-
 .../src/org/eclipse/jgit/lib/Config.java           |   2 +
 .../src/org/eclipse/jgit/lib/RebaseTodoLine.java   |  16 +-
 6 files changed, 266 insertions(+), 57 deletions(-)
 create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/errors/IllegalTodoFileModification.java
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

De acuerdo a los resultados de la ejecución se puede observar que a medida que git status Como se indica en el mensaje, esta combinación es una combinación de avance rápido (fast-forward merge

Además de utilizar al crear una sucursal local --track Especifique la rama de seguimiento remoto,git También hay soporte para especificar sucursales remotas en sucursales existentes. Si crea una sucursal local con anticipación y olvida asociar la sucursal remota,git Esta función de enlace tardío resulta útil:

# Checkout a new branch without relating to its remote tracking branch
$ git checkout -b remoteBugFix2 2e0d17 
Switched to a new branch 'remoteBugFix2' 
# Set the tracking branch manually by using -u or --set-upstream-to
$ git branch --set-upstream-to origin/stable-3.2 
Branch remoteBugFix2 set up to track remote branch stable-3.2 from origin. 
# Validate current status
$ git status 
On branch remoteBugFix2 
Your branch is behind 'origin/stable-3.2' by 9 commits, and can be fast-forwarded. 
  (use "git pull" to update your local branch) 
nothing to commit, working directory clean 
# Same as the previous demo as expected.
# Update the branch (also a fast-forward merge with origin/stable-3.2)
$ git pull 
Updating 2e0d17885..f839d383e
Fast-forward
 .../org/eclipse/jgit/api/RebaseCommandTest.java    | 213 +++++++++++++++++----
 .../src/org/eclipse/jgit/api/RebaseCommand.java    |  31 +--
 .../jgit/errors/IllegalTodoFileModification.java   |  59 ++++++
 .../eclipse/jgit/lib/BaseRepositoryBuilder.java    |   2 +-
 .../src/org/eclipse/jgit/lib/Config.java           |   2 +
 .../src/org/eclipse/jgit/lib/RebaseTodoLine.java   |  16 +-
 6 files changed, 266 insertions(+), 57 deletions(-)
 create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/errors/IllegalTodoFileModification.java
# The output is still the same as previous one as expected.
# Validate the current HEAD with origin/stable-3.2
$ git log -1 origin/stable-3.2  --format=format:%h
f839d383e
# Still the same.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

3.3 Forzar la generación de confirmaciones de fusión

Antes de leer este libro, es posible que haya visto muchos ejemplos de cadenas de entrega de software y modelos de ramificación; es posible que también haya estado probando diferentes estrategias, solo para descubrir que una vez que una herramienta admite un flujo de trabajo específico, es difícil implementarla por completo. escenarios de aplicación que desee. Y Git admite casi todos los escenarios de flujo de trabajo. Un requisito común es poder generar una confirmación de fusión al fusionar una característica (incluso si se pueden incorporar nuevas características en modo de avance rápido). Este requisito se utiliza a menudo para indicar que una determinada característica se ha fusionado y desea que esta operación de fusión se almacene explícitamente en el almacén.

Consejos

Mientras Git Proporciona una forma cómoda y rápida de acceder a toda la información enviada.Git En realidad, la biblioteca debería usarse comoregistro, no sólo el código fuente respaldo

El siguiente ejemplo generará una confirmación de fusión forzada:

# Checkout branch stable-3.1 as remoteOldBugFix for use
$ git checkout -b remoteOldBugFix --track origin/stable-3.1
# force a merge commit
$ git merge origin/stable-3.2 --no-ff --edit --quiet
  • 1
  • 2
  • 3
  • 4

Nota, uso --edit Después de configurar los parámetros, puede modificar la información predeterminada del comentario de confirmación de fusión en el editor que se abre.en el ejemplo--no-ff Indica deshabilitar el modo de avance rápido;--quiet Se utiliza para simplificar el contenido de salida de la pantalla. El efecto final se muestra en la figura:

Figura 3-1

Para comparar con la forma normal, eliminar al realizar una fusión --no-ff Elementos de parámetros:

# Reset to initial status
$ git reset --hard  remotes/origin/stable-3.1
# Merge with fast forward by default
$ git merge origin/stable-3.2 --quiet
  • 1
  • 2
  • 3
  • 4

El efecto es el siguiente:

Figura 3-2

Fusionar contenido a mitad de camino

Además de realizar una fusión completa, Git también permite a los usuarios intervenir en el contenido fusionado y decidir de forma independiente qué contenido se incluye en la fusión.usar--no-commit parámetro,git Interrumpirá el proceso antes de la confirmación de fusión, lo que permitirá al usuario modificar o agregar archivos antes de la confirmación final. Por ejemplo, el número de versión del proyecto se modifica en la rama de características del proyecto, pero la rama principal no se modifica. La operación de fusión predeterminada actualizará el número de versión al número de versión en la rama de funciones, pero en realidad no desea cambiar el número de versión.Usa este tiempo--no-commit se puede evitar.

El siguiente ejemplo demuestra una operación de fusión con intervención del usuario. Al fusionar, desea excluir manualmente la confirmación que actualizó el archivo de licencia:

# Clone repo into demo
$ git clone https://github.com/PacktPublishing/Git-Version-Control-Cookbook-Second-Edition_hello_world_flow_model.git demo
$ cd demo
# Checkout remote branch
$ git checkout -b remotePartlyMerge --track origin/release/1.0
Branch remotePartlyMerge set up to track remote branch release/1.0 from origin. 
Switched to a new branch 'remotePartlyMerge'
# Force a merge commit with --no-commit flag
$ git merge origin/master  --no-ff --no-commit
Automatic merge went well; stopped before committing as requested
# Exclude LICENSE file
$ git reset LICENSE
# Resume merging
$ git commit -m "Merging without LICENSE"
[remotePartlyMerge 1202b0e] Merging without LICENSE
# Check status (only LICENSE file remain untracked)
$ git status
On branch remotePartlyMerge
Your branch is ahead of 'origin/release/1.0' by 6 commits.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        LICENSE

nothing added to commit but untracked files present (use "git add" to track)
# check difference excluding LICENSE file (only on Linux)
$ git diff origin/master !(LICENSE)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

Teniendo en cuenta el problema de la velocidad de la red, el repositorio de muestra ha sido Git-Version-Control-Cookbook-Second-Edition_hello_world_flow_model.git Agregar a esta biblioteca de aprendizaje (repos/ex3.3-no-commit-repo.rar