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)?
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
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.
git branch -f branch-name new-tip-commit
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
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 :)
Dans (gitk --all
:
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.
La solution recommandée git branch -f branch-pointer-to-move new-pointer
dans TortoiseGit :
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>
).