web-dev-qa-db-fra.com

Comment créer un point de branche à un commit spécifique?

Dans Git, je comprends qu'une branche est un pointeur sur un commit.

Comment faire en sorte qu'une branche spécifique pointe vers un commit spécifique? Dites que je veux faire master point à 1258f0d0aae..., comment je fais ça?

161
Ram Rachum

Vous pouvez faire master point sur 1258f0d0aae par ici:

git checkout master
git reset --hard 1258f0d0aae

Mais vous devez faire attention à cela. Cela pourrait bien réécrire l’histoire de cette branche. Cela créerait des problèmes si vous l'avez publié et que d'autres personnes travaillent sur la branche.

Également git reset --hard La commande jettera toutes les modifications non validées (c’est-à-dire celles qui viennent de l’arbre de travail ou de l’index).

Vous pouvez également forcer une mise à jour dans une branche avec:

git branch -f master 1258f0d0aae

... mais git ne vous laissera pas faire cela si vous êtes sur master à ce moment-là.

209
Mark Longair
git reset --hard 1258f0d0aae

Mais faites attention, si le descendant commet entre 1258f0d0aae et HEAD ne sont pas référencés dans les autres branches. Il sera fastidieux (mais pas impossible) de les récupérer. Vous feriez donc mieux de créer une branche "de sauvegarde" à la valeur actuelle HEAD, checkout master, et réinitialisez le commit que vous voulez.

Assurez-vous également que vous n'avez pas de modifications non validées avant un reset --hard, ils seront vraiment perdus (aucun moyen de récupérer).

33
CharlesB

Si vous êtes actuellement pas sur le responsable de la succursale, c'est très simple:

git branch -f master 1258f0d0aae

Cela fait exactement ce que vous voulez: il pointe master sur le commit donné et ne fait rien d’autre.

Si vous êtes actuellement en master, vous devez d'abord entrer dans l'état de tête détachée. Je recommanderais la séquence de commande suivante:

git checkout 1258f0d0aae    #detach from master
git branch -f master HEAD   #exactly as above

#optionally reattach to master
git checkout master

Sachez cependant que toute manipulation explicite du point où une branche a le potentiel peut laisser des commits qui ne sont plus accessibles par aucune branche et deviennent ainsi des objets du ramassage des ordures. Alors, réfléchissez avant de taper git branch -f!


Cette méthode est meilleure que le git reset --hard _ approche, car il ne détruit rien dans l’index ou le répertoire de travail.

30
cmaster

git branch -f <nom de branche> <commit>

J'y vais avec la solution de Mark Longair, ses commentaires et je recommande à quiconque de les lire avant d'agir, mais je suggérerais que l'accent soit mis sur

git branch -f <branchname> <commit>

Voici un scénario où j'ai eu besoin de faire cela.

Scénario

Développer sur la mauvaise branche et donc besoin de la réinitialiser.

Commencez bien

Développez et publiez proprement certains logiciels.

So far so good

Développer sur une mauvaise branche

Erreur: rester accidentellement sur la branche de publication tout en se développant davantage.

After a mistake

Réaliser l'erreur

"OH NON! J'ai développé accidentellement sur la branche de publication." L'espace de travail est peut-être encombré de fichiers à moitié modifiés qui représentent des travaux en cours et nous ne voulons vraiment pas toucher et gâcher. Nous aimerions simplement que Git retourne quelques indicateurs pour garder une trace de l’état actuel et remettre cette branche de publication à l’avant.

Créez une branche pour le développement qui est à jour et conservez le travail engagé jusqu'à présent et passez à celui-ci.

git branch development
git checkout development 

Changed to another branch

Corrige la branche

Nous sommes maintenant dans la situation problématique et avons besoin de sa solution! Corrigez l'erreur (en prenant la branche de publication avec le développement) et remettez la branche de publication comme elle devrait être.

Corrigez la branche de publication pour renvoyer à la dernière version réelle.

git branch -f release release2

La branche de publication est à nouveau correcte, comme ceci ...

Corrected

Et si je poussais l'erreur vers une télécommande?

git Push -f <remote> <branch> est bien décrit dans un autre fil, bien que le mot "écraser" dans le titre soit trompeur. Force "git Push" à écraser les fichiers distants

16
Ivan