2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
sujet connexe :
git reuse recorded resolution
(rerere
) Fusionner les versions Git en conflitOrphan branches
)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
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
Afficher les informations sur la succursale :
git branch
: nom de la branche uniquementgit branch -v
: Annoté et simplifié basé sur 1 SHA-1
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
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'.
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
Avis:
fast-forward
, signifie que Git peut fusionner HEAD
Passez à la dernière version ;git pull
La commande est en fait une combinaison de deux commandes :git fetch
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
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.
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
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 :
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
L'effet est le suivant :
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)
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
)