Comment résoudre le problème de branche Git en avance sur l'origine

GitGitBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, vous apprendrez à gérer un scénario Git courant : lorsque votre branche locale est en avance sur le dépôt distant. Cette situation se produit lorsque vous effectuez des commits localement, mais que vous ne les avez pas encore poussés vers le dépôt distant. À la fin de ce laboratoire, vous comprendrez comment identifier quand votre branche est en avance sur le distant et comment synchroniser correctement vos dépôts local et distant.

Effectuer des modifications locales

Dans cette étape, vous allez apporter des modifications à votre dépôt local qui n'ont pas été poussées vers le dépôt distant, créant ainsi le scénario "en avance sur l'origine".

Comprendre les dépôts locaux et distants

Git fonctionne avec un modèle distribué où chaque développeur dispose d'une copie complète du dépôt sur sa machine locale. Les modifications apportées localement doivent être explicitement synchronisées avec le dépôt distant.

Commençons par naviguer vers notre répertoire de projet :

cd ~/project/git-ahead-demo

Maintenant, vérifions l'état actuel de notre dépôt :

git status

Vous devriez voir une sortie similaire à celle-ci :

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Cela signifie que votre dépôt local est actuellement synchronisé avec le dépôt distant.

Créer un nouveau fichier

Créons un nouveau fichier dans notre dépôt :

echo "This is a new file for our project." > new_file.txt

Après avoir créé le fichier, nous devons l'ajouter à la zone de staging de Git :

git add new_file.txt

Maintenant, validons ce fichier dans notre dépôt local :

git commit -m "Add new_file.txt"

Vous devriez voir une sortie confirmant votre commit :

[master 1a2b3c4] Add new_file.txt
 1 file changed, 1 insertion(+)
 create mode 100644 new_file.txt

Vérification de l'état de la branche

Maintenant que nous avons effectué un commit local, vérifions à nouveau l'état de notre dépôt :

git status

Cette fois, vous devriez voir :

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Ce message indique que votre branche locale a un commit qui n'a pas encore été poussé vers le dépôt distant. C'est exactement la situation que nous voulions créer - votre branche est maintenant "en avance sur l'origine".

Visualiser les différences de branches

Maintenant que votre branche locale est en avance sur la branche distante, explorons comment visualiser les différences spécifiques entre vos branches locale et distante.

Comprendre les références de branches

Dans Git, vous faites référence à la branche distante en utilisant le format origin/nom-de-branche. Le terme origin est le nom par défaut du dépôt distant, et nom-de-branche est le nom de la branche (dans notre cas, il s'agit de master).

Visualiser les différences de commits

Pour voir les commits qui existent dans votre branche locale mais pas dans la branche distante, utilisez la commande suivante :

git log origin/master..HEAD

La sortie vous montrera le(s) commit(s) qui se trouvent dans votre branche locale (HEAD) mais pas dans la branche distante (origin/master) :

commit 1a2b3c4d... (HEAD -> master)
Author: LabEx User <[email protected]>
Date:   ...

    Add new_file.txt

Visualiser les différences de fichiers

Pour voir quels fichiers diffèrent entre vos branches locale et distante, utilisez :

git diff --name-status origin/master..HEAD

La sortie devrait afficher :

A       new_file.txt

Cela indique que new_file.txt a été ajouté dans votre branche locale mais n'existe pas dans la branche distante.

Comprendre la visualisation des différences

Pour voir les différences de contenu réelles, vous pouvez utiliser :

git diff origin/master..HEAD

Cela affichera les modifications spécifiques apportées à chaque fichier :

diff --git a/new_file.txt b/new_file.txt
new file mode 100644
index 0000000..3b2aed8
--- /dev/null
+++ b/new_file.txt
@@ -0,0 +1 @@
+This is a new file for our project.

Ces commandes vous aident à comprendre exactement quelles modifications se trouvent dans votre branche locale et n'ont pas encore été poussées vers le dépôt distant.

Pousser les modifications vers le distant

Maintenant que vous comprenez quelles modifications sont présentes dans votre branche locale, il est temps de synchroniser votre dépôt local avec le dépôt distant en poussant vos modifications.

Comprendre git push

La commande git push envoie vos commits locaux vers le dépôt distant. Lorsque vous poussez, vous synchronisez la branche distante avec votre branche locale, rendant les deux branches identiques.

Pousser vos modifications

Pour pousser vos commits locaux vers le dépôt distant, utilisez :

git push origin master

Vous devriez voir une sortie similaire à celle-ci :

Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 324 bytes | 324.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/labex/project/remote-repo.git
   abcd123..1a2b3c4  master -> master

La sortie montre :

  • Git a compté et compressé les objets dans votre commit
  • Les modifications ont été envoyées avec succès au dépôt distant
  • Les anciens et nouveaux identifiants de hachage de commit
  • La branche qui a été mise à jour (master -> master)

Vérifier le push

Vérifions à nouveau l'état de notre dépôt :

git status

Maintenant, vous devriez voir :

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Cela confirme que votre branche locale est maintenant synchronisée avec la branche distante. Le message "en avance sur l'origine" a disparu car les deux branches contiennent désormais les mêmes commits.

Vérifier le contenu du dépôt distant

Nous pouvons vérifier que nos modifications sont maintenant dans le dépôt distant en examinant le journal de la branche distante :

git log origin/master -1

Cette commande affiche le commit le plus récent sur la branche distante, qui devrait maintenant inclure notre nouveau fichier :

commit 1a2b3c4d... (HEAD -> master, origin/master)
Author: LabEx User <[email protected]>
Date:   ...

    Add new_file.txt

Notez que HEAD -> master et origin/master pointent maintenant vers le même commit, confirmant que les deux branches sont synchronisées.

Créer et résoudre plusieurs commits en avance

Dans des scénarios réels, vous pourriez avoir plusieurs commits en avance sur votre branche distante. Créons cette situation et apprenons à la résoudre.

Effectuer plusieurs commits locaux

Créons et validons plusieurs modifications :

## Create a second file
echo "This is the second file." > second_file.txt
git add second_file.txt
git commit -m "Add second_file.txt"

## Modify the README
echo "### Additional Information" >> README.md
echo "This project demonstrates Git branch synchronization." >> README.md
git add README.md
git commit -m "Update README with additional information"

Vérifions maintenant notre statut :

git status

Vous devriez voir :

On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Visualiser les différences de plusieurs commits

Voyons quels commits nous avons localement qui ne sont pas sur le distant :

git log origin/master..HEAD --oneline

Vous devriez voir vos deux nouveaux commits :

abcd123 Update README with additional information
efgh456 Add second_file.txt

Pousser plusieurs commits

Pour synchroniser tous vos commits locaux avec le dépôt distant, utilisez la même commande push :

git push origin master

La sortie affichera les deux commits en cours de poussée :

Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 574 bytes | 574.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0)
To /home/labex/project/remote-repo.git
   1a2b3c4..abcd123  master -> master

Vérifier que tous les commits sont poussés

Vérifions à nouveau notre statut :

git status

Vous devriez voir :

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Cela confirme que tous vos commits locaux ont été poussés avec succès vers le dépôt distant.

Résumé

Dans ce lab, vous avez appris à gérer les situations où votre branche Git locale est en avance sur la branche distante. Vous avez réussi à :

  1. Créer un commit local qui a placé votre branche en avance sur la branche distante.
  2. Utiliser les commandes Git pour visualiser les différences spécifiques entre vos branches locale et distante.
  3. Pousser vos modifications pour synchroniser vos dépôts locaux et distants.
  4. Créer plusieurs commits localement et les pousser tous en même temps vers la branche distante.

Ces compétences sont essentielles pour le flux de travail Git quotidien, car elles vous aident à maintenir vos dépôts locaux et distants synchronisés, ce qui est crucial pour une collaboration efficace dans les projets de développement logiciel. Rappelez-vous que maintenir vos branches synchronisées régulièrement aide à prévenir les conflits et facilite la collaboration.