Pour déplacer le pointeur de branche d'une branche extraite, on peut utiliser la git reset --hard
commande. Mais comment déplacer le pointeur de branche d'une branche non extraite pour pointer vers un commit différent (en gardant toutes les autres choses comme une branche distante suivie)?
git
git-branch
Mot
la source
la source
git branch <branch-name> <SHA-1-of-the-commit>
et vider l'ancienne branche?Réponses:
Vous pouvez le faire pour des références arbitraires. Voici comment déplacer un pointeur de branche:
La forme générale:
Vous pouvez choisir des lentes sur le message reflog si vous le souhaitez - je crois que celui-
branch -f
ci est différent dereset --hard
celui, et ce n'est pas exactement l'un ou l'autre.la source
git branch -f
. Pour être précis, cette méthode semble être: (A) plus difficile à utiliser (B) plus difficile à retenir et (C) plus dangereusela source
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
. (Vous pouvez choisir des lentes sur le message reflog si vous le souhaitez - je crois que celui-branch -f
ci est différent dereset --hard
celui, et ce n'est pas exactement l'un ou l'autre.)git help branch
dit "-f, --force Réinitialiser <branchname> à <startpoint> si <branchname> existe déjà. Sans -f, git branch refuse de changer une branche existante."git branch -f master <hash>
et ça me ditfatal: Cannot force update the current branch.
Ummmm que je dois faire quoi maintenant, consultez une autre branche aléatoire avant de pouvoir utiliser cette commande?HEAD
pointe dessus).Vous pouvez également transmettre
git reset --hard
une référence de validation.Par exemple:
Je trouve que je fais quelque chose comme ça semi-fréquemment:
En supposant cette histoire
la source
git update-ref
comme indiqué ci-dessus.git reset --hard ...
Pas besoin de le répéter ici! :-(Juste pour enrichir la discussion, si vous voulez déplacer la
myBranch
branche vers votre commit actuel , omettez simplement le deuxième argument après-f
Exemple:
git branch -f myBranch
Je fais généralement cela lorsque je suis
rebase
dans un état de tête détachée :)la source
Dans
gitk --all
:Attention, recréer au lieu de modifier la branche existante perdra les informations de la branche de suivi . (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 votre branche locale a 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 s'il y
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 drogué en ligne de commande comme moi,
git gui
etgitk
êtes assez bien conçu pour le sous-ensemble d'utilisation de git qu'ils permettent. Je recommande fortement de les utiliser pour ce qu'ils sont bons (c.-à-d. Mettre en place sélectivement des mecs dans / hors de l'index dans git gui, et aussi juste valider. (Ctrl-s pour ajouter une signature: ligne, ctrl-enter pour valider) .)gitk
est idéal pour garder une trace de quelques branches pendant que vous triez vos modifications dans une belle série de correctifs à soumettre en amont, ou toute autre chose où vous devez 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'aime gitk / git gui.
la source
git status
sortie est affectée. De plus, dans certains casgit fetch
,git push
cela ne fonctionnera pas sans spécifier explicitement à distance si vous ne définissez pas la branche de suivi. Je ne connais pas tous les cas, mais pour moi, la règle générale est que pour plus de commodité et de rapidité de travail, il est préférable d'avoir un suivi des branches dans l'ordre.La solution recommandée
git branch -f branch-pointer-to-move new-pointer
dans TortoiseGit :la source
Honnêtement, je suis surpris de la façon dont personne n'a pensé à la
git push
commande:Le point (.) Fait référence au référentiel local et vous pouvez avoir besoin de l'option -f car la destination peut ê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>
) vers le même commit que la branche locale (<destination>
)la source
-f
éviter de vous encombrer de quelque chose de local; par exemple,git fetch origin && git push . origin/develop:develop
est une version rapide sans échec degit checkout develop && git pull --ff-only
Ouvrez le fichier
.git/refs/heads/<your_branch_name>
et changez le hachage qui y est stocké en celui où vous souhaitez déplacer la tête de votre branche. Modifiez et enregistrez simplement le fichier avec n'importe quel éditeur de texte. Assurez-vous simplement que la branche à modifier n'est pas la branche active actuelle.Avertissement: Probablement pas un moyen conseillé de le faire, mais fait le travail.
la source
Dans le cas où la validation que vous souhaitez pointer est en avance sur la branche actuelle (ce qui devrait être le cas à moins que vous ne souhaitiez annuler les dernières validations de la branche actuelle), vous pouvez simplement faire:
la source
git push . <commit>:<branch>
comme déjà suggéré.