84 votes

Comment puis-je changer le commit sur lequel master pointe dans git ?

Dans git, j'ai fait des commits sur la branche master, alors que j'aurais dû travailler sur une branche feature. Je veux changer cela de façon à ce que master soit de retour à son point de départ, et que ce qui était sur master soit maintenant sur une nouvelle branche. En fait, l'historique de mes livraisons ressemble à ceci :

A -- B -- C -- D -- E
          |         |
          |       master
     origin/master

Et je veux que ça ressemble à ça :

        master
          |
A -- B -- C -- D -- E
          |         |
          |       new_branch
     origin/master

Comment puis-je changer l'emplacement des points maîtres ?

81voto

knittl Points 64110
  • planquez vos non-engagés : git stash
  • créer une nouvelle branche : git branch new_branch
  • réinitialiser le maître à l'origine/maître : git reset --hard origin/master
  • vérifier la nouvelle branche à nouveau : git checkout new_branch
  • débarrasser vos changements : git stash pop

stash/unstash n'est pas nécessaire si votre arbre de travail est propre. Assurez-vous simplement qu'il n'y a pas de changements dans votre arbre de travail, car ceux-ci seront supprimés lorsque vous réinitialiserez --hard


une autre possibilité (plus rapide, et sans nécessité de cacher et de réinitialiser) :

  • vérifier une nouvelle branche : git checkout -b new_branch master
  • créer une 'nouvelle' branche master et la faire pointer vers le commit d'origin/master : git branch -f master origin/master

2 votes

Notez que la cachette n'est nécessaire que si vous avez des modifications non validées.

0 votes

Stash s'engage ? Il est fort probable que vous vouliez parler de changements locaux.

1 votes

Si votre répertoire de travail est propre, vous n'aurez pas besoin de l'option stash y unstash pièces. Sinon, c'est parfait : +1

35voto

justinmreina Points 158
$ git checkout master
$ git reset --hard <commit-id-for-master-to-sit-at>

par exemple, essayez ceci

$ mkdir example; cd example
$ git init
$ vi testFile.txt
(now add "test commit 1" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 1st commit" to git commit)
$ vi testFile.txt
(now add "test commit 2" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 2nd commit" to git commit)
$ vi testFile.txt
(now add "test commit 3" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 3rd commit" to git commit)
$ git tag final_head
$ git reset --hard HEAD~1

Cet exemple montre le déplacement du maître vers un autre commit. Notez ici que le tag nous permet de sauvegarder l'ancien master, au cas où :)

4voto

johntex Points 734

Extraire une nouvelle branche où branche main est, alors supprimez la branche main puis créer une branche main une nouvelle fois où main était destiné à être (par exemple, à origin/main ):

git checkout -b new_branch_where_main_was
git branch -d main
git branch main origin/main

Notez que cela ne change rien dans le répertoire de travail : HEAD reste inchangé, les changements non engagés restent là où ils sont. Pas de stockage nécessaire, pas d'extraction nécessaire, pas de réinitialisation nécessaire.

3voto

gescho Points 49

Allez dans .git/refs/heads/master qui contient le hash de master et changez-le en ce que vous voulez. J'utilise gitg pour trouver rapidement le hash de master et ensuite pour vérifier que le déplacement a réussi.

1voto

am70 Points 421

Notez qu'à tout moment, vous pouvez changer la destination d'une branche en utilisant la commande git update-ref refs/heads/branch id mais avant cela, vous devez donner un nom à la pointe de l'arbre, sinon votre travail sera inaccessible. Ces deux commandes peuvent donc faire l'affaire

 git update-ref refs/heads/newfeature HEAD
 git update-ref refs/heads/master XXYYY

Mais assurez-vous que vous n'avez pas de changements non validés, sinon tout l'enfer va se déchaîner.

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