web-dev-qa-db-fra.com

Déplacer le pointeur de branche sur un commit différent sans extraction

Pour déplacer le pointeur de branche d’une branche extraite, vous pouvez utiliser la commande git reset --hard. Mais comment déplacer le pointeur de branche d’une branche non extraite pour pointer vers un commit différent (en conservant tous les autres éléments tels que la branche distante suivie)?

612
Mot

N.B. Si vous voulez simplement déplacer un branch vers un autre commit, le fichier le plus simple est

git branch -f branch-name new-tip-commit

comme indiqué dans la réponse de Chris Johnsen .

Vous pouvez le faire pour des références arbitraires. Voici comment déplacer un pointeur de branche: 

git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>

La forme générale:

git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>

Vous pouvez choisir des messages sur le message de rappel si vous le souhaitez. Je crois que le branch -f est différent du reset --hard et ce n'est pas exactement l'un ou l'autre.

437
Adam A
git branch -f branch-name new-tip-commit
828
Chris Johnsen

Vous pouvez également passer git reset --hard une référence de validation.

Par exemple:

git checkout branch-name
git reset --hard new-tip-commit

Je trouve que je fais quelque chose comme ceci semi-fréquemment:

En supposant que cette histoire

$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master

# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff

# Ditch that commit on this branch
$ git reset --hard HEAD^

# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master
122
Amiel Martin

Juste pour enrichir la discussion, si vous voulez déplacer la branche myBranch dans votre commit current, omettez le deuxième argument après le -f.

Exemple:

git branch -f myBranch


Je le fais généralement lorsque je rebase dans un état Détaché HEAD :)

29
Matheus Felipe

Dans (gitk --all:

  • clic droit sur le commit que vous voulez
  • -> créer une nouvelle branche
  • _ {entrez le nom d'une branche existante} _
  • appuyez sur Entrée sur la boîte de dialogue qui confirme le remplacement de l'ancienne branche de ce nom} _.

Attention, recréer au lieu de modifier la branche existante perdra les informations de suivi-branche. (Ce n'est généralement pas un problème pour les cas d'utilisation simples où il n'y a qu'une seule télécommande et où votre branche locale porte le même nom que la branche correspondante dans la télécommande. Voir les commentaires pour plus de détails, merci @mbdevpl pour avoir signalé cet inconvénient.)

Ce serait cool si gitk avait une fonctionnalité dans laquelle la boîte de dialogue avait 3 options: écraser, modifier l'existant ou annuler.


Même si vous êtes normalement un junkie en ligne de commande comme moi, git gui et gitk sont assez bien conçus pour le sous-ensemble de l'utilisation git qu'ils autorisent. Je recommande fortement de les utiliser pour ce qu'ils font bien (c.-à-d. Mettre en scène de manière sélective des mecs dans/hors de l'index dans git gui, et aussi en les validant. .)

gitk est idéal pour garder trace de quelques branches pendant que vous triez vos modifications dans une série de correctifs Nice à soumettre en amont, ou pour toute autre tâche nécessitant de garder une trace de ce que vous êtes au milieu de plusieurs branches.

Je n'ai même pas de navigateur de fichiers graphique ouvert, mais j'adore gitk/git gui.

11
Peter Cordes

La solution recommandée git branch -f branch-pointer-to-move new-pointer dans TortoiseGit :

  • "Git Show log"
  • Cochez "Toutes les branches"
  • Sur la ligne que vous souhaitez déplacer le pointeur de branche (new-pointeur):
    • Clic droit, "Créer une branche dans cette version"
    • À côté de "Branche", entrez le nom de la branche à déplacer (branche-pointeur à déplacer)
    • Sous "Base On", vérifiez que le nouveau pointeur est correct
    • Vérifier "Force"
    • Ok

 enter image description here

 enter image description here

5
ax.

Honnêtement, je suis surpris de voir comment personne ne pensait à la commande git Push:

git Push -f . <destination>:<branch>

Le point (.) Fait référence au référentiel local et vous aurez peut-être besoin de l'option -f car la destination pourrait être "derrière son homologue distant" .

Bien que cette commande soit utilisée pour enregistrer vos modifications sur votre serveur, le résultat est exactement le même que si vous déplacez la branche distante (<branch>) dans le même commit que la branche locale (<destination>).

0