103 votes

Comment déplacer les modifications d'une branche à une autre branche git ?

Comment puis-je déplacer mon travail et mes modifications de la branche master vers une nouvelle branche créée et laisser la branche master intacte après le déplacement?

205voto

xpioneer Points 390

Si les modifications ne sont pas validées.

vous pouvez ranger les modifications dans la branche principale.

git stash

ensuite vérifiez la branche

git checkout -b nouveaubranche

et récupérez les modifications ici

git stash pop

Si les modifications sont validées :

ensuite créez une nouvelle branche :

git checkout -b nouveaubranche

revenez à la branche principale :

git checkout master

réinitialisez le commit précédent :

git reset --hard head^1

NB : Cela fonctionne uniquement si aucun fichier n'a été créé et seuls les fichiers existants ont été modifiés

67voto

poke Points 64398

Vous pouvez créer une nouvelle branche pointant vers le commit actuel en utilisant git branch nombranche (ou git checkout -b nombranche si vous voulez le vérifier directement). Cela dupliquera essentiellement votre branche principale, de sorte que vous puissiez continuer à travailler dessus.

Si vous avez réussi à copier la branche, vous pouvez réinitialiser master à son point d'origine en utilisant git reset --hard commitcommit est le hachage du commit qui devrait être le dernier sur master.

Donc par exemple, si vous avez une situation comme celle-ci :

---- 1 ---- 2 ---- 3 ---- 4 ---- 5 ---- 6
                   ^                    ^
              original                master
            commit master

Donc vous avez vérifié master sur le commit 6, et vous voulez créer une nouvelle branche ticket pointant vers ce 6 tout en réinitialisant master à 3 :

git branch ticket
git reset --hard 3
git checkout ticket

Et maintenant vous êtes sur ticket pointant vers le commit 6, tandis que master pointe vers 3.

6voto

Mark Fisher Points 2575

Si vous avez validé (disons) 2 fois après avoir réalisé que vous auriez dû être dans une branche, il vous suffit de faire

git branch work_branch
git reset --hard HEAD~2

remplacez le 2 par le nombre de validations en arrière auxquelles vous voulez revenir. Vous serez toujours sur master à ce stade, si vous voulez passer à la branche pour continuer le travail, faites simplement git checkout work_branch

voir git rev-parse --help si vous voulez comprendre la syntaxe pour remonter dans votre arborescence de validations avec des références comme HEAD~2

0 votes

Salut @Mark Fisher, que veux-tu dire par "2 fois"?

1 votes

@adrianmann - Je veux dire que si vous effectuez 2 tâches distinctes, en ajoutant des modifications et en validant chacune d'elles, de sorte que votre historique ressemble à Start -> A -> B, où A et B sont les 2 validations.

3voto

J'ai résolu ce problème en adoptant l'approche suivante

Étape 1: Créez une nouvelle branche à partir de la branche infectée master et donnez-lui un nom tel que master_infected ;

Étape 2: maintenant effectuez un hard reset sur la branche infectée master pour supprimer les commits pollués en utilisant

 git reset --hard HEAD~2  

(retournez de deux commits avant HEAD car dans mon cas j'avais deux commits pollués. donc pour votre cas cela peut être différent )

Maintenant ma branche master_infected contient le code que je veux préserver (comme je l'ai dit mon code pollué) et la branche master est maintenant en mode sécurisé.

2voto

WillD Points 394

Créez une nouvelle branche à partir de celle que vous auriez dû avoir, puis appliquez sélectivement les modifications de la branche incorrecte dans la nouvelle branche.

Vous pouvez ensuite supprimer la mauvaise branche, en supposant que vous ne l'ayez pas encore poussée ailleurs et que d'autres modifications ont été apportées à cette branche.

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