2 votes

Créer une branche juste pour fusionner

*Ceci est l'une de ces questions "est-ce une bonne idée?" que je ne peux pas vraiment formater en une question acceptable pour SO mais....

Je ne suis toujours pas à 100% à l'aise avec git, en particulier fusionner avec des branches distantes. Si quelque chose ne va pas ou si je veux simplement abandonner un tas de conflits de fusion, j'ai généralement du mal à revenir en arrière sur les fusions/commits. Je me retrouve toujours plus profondément dans le trou du lapin pour ainsi dire. Je me demande, ne serait-il pas plus facile de créer une branche juste pour effectuer la fusion distante et ensuite fusionner localement la branche temporaire avec ma "vraie" branche"? De cette façon, je pourrais toujours annuler la branche temporaire si quelque chose se passait mal.

MISE À JOUR : Je m'intéresse spécifiquement à quand ma branche distante ajoutera un tas de fichiers à mon dépôt. Par exemple (en utilisant l'exemple de Peter ci-dessous) :

Je fais cela :

$ git init
Dépôt Git vide initialisé dans /chemin/vers/dépôt/.git/
$ touch README
$ git add README
$ git commit -m 'Commit initial'
[master (commit racine) da9886d] Commit initial
 0 fichiers changés
 mode crée 100644 README
$ touch A
$ git add A
$ git commit -m 'Ajout A'
[master 3480a5b] Ajout A
 0 fichiers changés
 mode créé 100644 A
$ git push // poussé vers distant (un seul fichier, A)

Ensuite un autre développeur fait ceci :

$ git clone
$ touch B
$ git add B
$ git commit -m 'Ajout B'
[foo 9912a23] Ajout B
 0 fichiers changés
 mode crée 100644 B
$ git push // poussé vers distant (maintenant a deux fichiers A et B)

Si je fais ensuite ceci :

$ git pull

J'aurai deux fichiers A et B. Maintenant si je veux "revenir en arrière" et annuler la fusion :

$ git reset --hard master@{...}

Le fichier B existera toujours sur ma machine en tant que fichier non suivi, n'est-ce pas? Comment puis-je revenir en arrière et supprimer ces fichiers comme si je n'avais JAMAIS fait la fusion git ?

C'est pourquoi j'espérais créer une branche séparée. Si je crée une branche distincte pour effectuer la fusion :

$ git checkout -b brancheTemporairePourFusion
$ git pull

Je me retrouve toujours avec les fichiers A et B mais ils existent seulement sur brancheTemporairePourFusion. Si quelque chose tourne mal, je devrais pouvoir faire cela :

$ git checkout master
$ git branch -d brancheTemporairePourFusion

n'est-ce pas ? Cela supprimera le fichier B.

2voto

Peter Lundgren Points 2502

C'est absolument correct, mais inutile.

Git suit déjà l'historique des déplacements de vos branches que vous pouvez consulter avec git reflog. J'aime particulièrement git reflog .

Essayons un exemple. Voici une série de commandes pour mettre en place cet exemple. J'ai une branche master et une branche foo. Chacune a un commit. Ensuite, je fusionne foo dans master.

$ git init
Repository Git vide initialisé dans /chemin/vers/repo/.git/
$ touch README
$ git add README
$ git commit -m 'Commit initial'
[master (commit racine) da9886d] Commit initial
 0 fichiers ont changé
 crée en mode 100644 README
$ touch A
$ git add A
$ git commit -m 'Ajouter A'
[master 3480a5b] Ajouter A
 0 fichiers ont changé
 crée en mode 100644 A
$ git checkout -b foo HEAD~1
Passage à une nouvelle branche 'foo'
$ touch B
$ git add B
$ git commit -m 'Ajouter B'
[foo 9912a23] Ajouter B
 0 fichiers ont changé
 crée en mode 100644 B
$ git log --decorate --graph --all --pretty=oneline --abbrev-commit
* 9912a23 (HEAD, foo) Ajouter B
| * 3480a5b (master) Ajouter A
|/
* da9886d Commit initial
$ git checkout master
Passage à la branche 'master'
$ git merge foo
Fusion réalisée avec la stratégie 'récursive'.
 0 fichiers ont changé
 crée en mode 100644 B
$ git log --decorate --graph --all --pretty=oneline --abbrev-commit
*   d4d06ce (HEAD, master) Fusion de la branche 'foo'
|\
| * 9912a23 (foo) Ajouter B
* | 3480a5b Ajouter A
|/
* da9886d Commit initial

Maintenant, supposons que je veuille annuler ce commit de fusion, c'est-à-dire remettre la branche master à ce qu'elle était avant le commit.

$ git reflog master
d4d06ce master@{0}: fusion de foo: Fusion réalisée avec la stratégie 'récursive'.
3480a5b master@{1}: commit: Ajouter A
da9886d master@{2}: commit (initial): Commit initial
$ git reset --hard master@{1}
HEAD est maintenant sur 3480a5b Ajouter A
$ git log --decorate --graph --all --pretty=oneline --abbrev-commit
* 9912a23 (foo) Ajouter B
| * 3480a5b (HEAD, master) Ajouter A
|/
* da9886d Commit initial

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X