Comment puis-je copier le contenu d'une branche dans une nouvelle branche locale?

270

J'ai travaillé sur une succursale locale et j'ai également poussé les modifications vers la télécommande. Je veux revenir sur les modifications de cette branche et faire autre chose, mais je ne veux pas perdre complètement le travail. Je pensais à quelque chose comme créer une nouvelle branche localement et y copier l'ancienne branche, puis je peux annuler les modifications et continuer à travailler sur l'ancienne branche. Y a-t-il une meilleure façon peut-être? Ou comment dois-je procéder?

serengeti12
la source
10
4 ans plus tard, avec Git 2.15 (Q4 2017), vous l'aurez git branch -c A B. Voir ma réponse ci
VonC

Réponses:

445
git checkout old_branch
git branch new_branch

Cela vous donnera une nouvelle branche "new_branch" avec le même état que "old_branch".

Cette commande peut être combinée avec les éléments suivants:

git checkout -b new_branch old_branch
Daniel Hilgarth
la source
134
Ou encore plus court git checkout -b new_branch(quand vous êtes déjà sur old_branch).
Koraktor
4
Cela crée simplement la nouvelle branche mais ne peut pas copier le contenu d'une branche vers une autre branche. Lorsque j'essaie cette commande, elle montre simplement "La branche nommée **** existe déjà".
anoop
7
Je pense que si l'on crée une nouvelle branche comme celle-ci, elle n'a pas instantanément une copie de l'ancienne branche mais simplement un nouveau pointeur en tête de l'ancienne branche. Mais lorsque vous faites maintenant quelque chose comme rebaser la nouvelle branche, vous devriez voir que l'ancienne branche est toujours dans son état d'origine tandis que la nouvelle branche est modifiée. Je pense donc que cela fait ce que le PO veut.
uli_1973
1
git checkout old_branch et que git branch new_branch .... Il vaut mieux utiliser la commande ci-dessus en production, car la commande ci-dessous créera une nouvelle branche et vous amènera à la nouvelle branche (changer de branche comme nouvelle branche) .... git checkout -b new_branch old_branch
Kiran
Pour remplacer une branche, voir stackoverflow.com/questions/26961371/…
MCCCS
55
git branch copyOfMyBranch MyBranch

Cela évite l'acte potentiellement long et inutile de vérifier une branche. Rappelons qu'un checkout modifie "l'arbre de travail", ce qui peut prendre du temps s'il est volumineux ou contient des fichiers volumineux (images ou vidéos par exemple).

Lyle Z
la source
1
Bien sûr, si vous avez des fichiers binaires dans git, en particulier de gros fichiers, il vaut probablement la peine d'analyser votre stratégie pour ces fichiers. Naturellement, des cas inhabituels existeront et avoir des fichiers binaires dans git serait parfaitement acceptable.
révérend
52

Avec Git 2.15 (Q4 2017), " git branch" appris " -c/-C" pour créer une nouvelle branche en copiant une branche existante.

Voir commit c8b2cec (18 juin 2017) par Ævar Arnfjörð Bjarmason ( avar) .
Voir commit 52d59cc , commit 5463caa (18 juin 2017) par Sahil Dua ( sahildua2305) .
(Fusionné par Junio ​​C Hamano - gitster- dans commit 3b48045 , 03 oct.2017 )

branch: ajouter une option --copy( -c) pour aller avec --move( -m)

Ajoutez la capacité à --copyune branche et son reflog et sa configuration, cela utilise la même machine sous-jacente que l' option --move( -m) sauf que le reflog et la configuration sont copiés au lieu d'être déplacés.

Ceci est utile, par exemple, pour copier une branche de sujet dans une nouvelle version, par exemple workaprès work-2avoir soumis le worksujet à la liste, tout en préservant toutes les informations de suivi et autres configurations qui vont avec la branche, et contrairement à --movegarder l'autre branche déjà soumise pour référence.

Remarque: lors de la copie d'une branche, vous restez sur votre branche actuelle.
Comme l'explique Junio ​​C Hamano:

Lors de la création d'une nouvelle branche B en copiant la branche Aqui se trouve être la branche actuelle, elle se met également à jour HEADpour pointer vers la nouvelle branche.
Cela a probablement été fait de cette façon parce que " git branch -c A B" a intégré sa mise en œuvre sur " git branch -m A B",

Cela ne correspond pas à l'attente habituelle.
Si j'étais assis sur une chaise bleue et que quelqu'un vient la repeindre en rouge, j'accepterais de finir assis sur une chaise qui est maintenant rouge (je suis également d'accord pour me lever, à la place, car il n'y a plus ma chaise bleue préférée ).

Mais si quelqu'un crée une nouvelle chaise rouge, en la modelant sur la chaise bleue sur laquelle je suis assis, je ne m'attends pas à être démarré de la chaise bleue et à finir sur la nouvelle chaise rouge.

VonC
la source