Partage de technologie

[Notes d'étude Git] Chapitre 3 Éléments de branchement, de fusion et de configuration (partie 1)

2024-07-12

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

Chapitre 3 Éléments de branchement, de fusion et de configuration

sujet connexe :

  • Gestion d'agence locale
  • succursale distante
  • Forcer la fusion des versions
  • utiliser git reuse recorded resolution (rerere) Fusionner les versions Git en conflit
  • Calculer les différences entre les branches
  • Branche orpheline (Orphan branches

3.1 Gestion des agences locales

si git La bibliothèque est locale, et même s'il n'est pas nécessaire de partager le code à distance, la branche locale peut être gérée comme un entrepôt qu'il faut partager à distance. Comme le montre cet exemple, vous devez d'abord copier un entrepôt dans la zone locale, ce qui signifie qu'il existe une bibliothèque distante.

# 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

On peut constater que le ID avec courantHEAD deID cohérent.

Remarque : Après avoir créé une nouvelle branche, vous devez basculer vers cette branche pour utiliser :git checkout -b <newBranch>

Développer : Si vous ne suivez pas HEAD Créez une nouvelle branche, mais un certain ID de validation (979e346), à ce stade, la soumission basée sur cette version peut être écrite :

# 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

Afficher les informations sur la succursale :

  1. git branch: nom de la branche uniquement
  2. git branch -v: Annoté et simplifié basé sur 1 SHA-1
  3. git branch -vv: Afficher les noms des branches de suivi à distance en fonction de 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 Branche distante

Parfois, le code natif peut être généré à partir d’un clone de la base de code de quelqu’un d’autre.À ce stade, le code local dispose d'un entrepôt distant, généralement appeléorigin source.Pour comprendre Git et sa base de code distant, vous pouvez commencer pargit status La commande démarre :

$ 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 branche de suivi à distance de la succursale estorigin/stable-3.2 .En ce momentgit status Les résultats montrent la situation localeHEAD avec télécommandeHEAD Indique si la branche locale peut être transférée rapidement vers la branche distante. Les exemples sont les suivants :

# 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

Avis:

  1. Voici un concept qui revient souvent :fast-forward, signifie que Git peut fusionner HEAD Passez à la dernière version ;
  2. git pull La commande est en fait une combinaison de deux commandes :
    1. git fetch
    2. git merge(Fusionner la branche de suivi à distance avec la branche locale)

Exécutez ce qui précède git status la commande est utilisée pour simuler l’exécution localegit fetch Après cela, le nouveau contenu de la branche distante a été extrait vers la branche de suivi locale.origin/stable-3.2 statut. Poursuivre la fusion entraînera en fait une synchronisation avec la branche locale :

$ 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

D'après les résultats de l'exécution, on peut constater que git status Comme indiqué dans l'invite, cette fusion est une fusion à avance rapide (fast-forward merge

En plus d'utiliser lors de la création d'une succursale locale --track Précisez la branche de suivi à distance,git Il existe également un support pour spécifier des branches distantes sur des branches existantes. Si vous créez une branche locale à l'avance et oubliez d'associer la branche distante,git Cette fonctionnalité de liaison tardive est pratique :

# 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 Forcer la génération des commits de fusion

Avant de lire ce livre, vous avez peut-être vu de nombreux exemples de chaînes de livraison de logiciels et de modèles de branchement ; vous avez peut-être également essayé différentes stratégies, pour constater qu'une fois qu'un outil prend en charge un flux de travail spécifique, il est difficile de le mettre pleinement en œuvre. scénarios d'application souhaités. Et Git prend en charge presque tous les scénarios de workflow. Une exigence courante est de pouvoir générer une validation de fusion lors de la fusion d'une fonctionnalité (même si de nouvelles fonctionnalités peuvent être incorporées en mode avance rapide). Une telle exigence est souvent utilisée pour indiquer qu'une certaine fonctionnalité a été fusionnée et que vous souhaitez que cette opération de fusion soit explicitement stockée dans l'entrepôt.

Conseils

Alors que Git Fournit un moyen pratique et rapide d'accéder à toutes les informations de soumission,Git La bibliothèque devrait en fait être utilisée commeenregistrer, pas seulement le code source sauvegarde

L'exemple suivant générera une validation de fusion forcée :

# 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

Attention, utilisez --edit Après avoir défini les paramètres, vous pouvez modifier les informations par défaut des commentaires de validation de fusion dans l'éditeur qui s'ouvre.dans l'exemple--no-ff Indique la désactivation du mode avance rapide ;--quiet Utilisé pour simplifier le contenu de la sortie d'écran. L'effet final est illustré dans la figure :

Figure 3-1

Pour comparaison avec la méthode normale, supprimez lors d'une fusion --no-ff Éléments de paramètres :

# 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

L'effet est le suivant :

Figure 3-2

Fusionner le contenu à mi-chemin

En plus d'effectuer une fusion complète, Git permet également aux utilisateurs d'intervenir sur le contenu fusionné et de décider indépendamment quel contenu est inclus dans la fusion.utiliser--no-commit paramètre,git Interromptra le processus avant la validation de fusion, permettant à l'utilisateur de modifier ou d'ajouter des fichiers avant la validation finale. Par exemple, le numéro de version du projet est modifié dans la branche fonctionnalité du projet, mais la branche principale n'est pas modifiée. L'opération de fusion par défaut mettra à jour le numéro de version avec le numéro de version sur la branche de fonctionnalité, mais vous ne souhaitez pas réellement modifier le numéro de version.Utilisez ce temps--no-commit peut être évité.

L'exemple suivant illustre une opération de fusion avec l'intervention de l'utilisateur. Lors de la fusion, vous souhaitez exclure manuellement le commit qui a mis à jour le fichier de licence :

# 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

Compte tenu du problème de vitesse du réseau, l'exemple de référentiel a été Git-Version-Control-Cookbook-Second-Edition_hello_world_flow_model.git Ajouter à cette bibliothèque d'apprentissage (repos/ex3.3-no-commit-repo.rar