En tenant compte du fait qu'il existe plusieurs commandes git qui n'ont aucun sens dans un référentiel nu (car les référentiels nus n'utilisent pas d'index et n'ont pas de répertoire de travail),
git reset --hard HEAD^
n'est pas une solution pour annuler la dernière modification d'un tel référentiel.
En cherchant sur Internet, tout ce que j'ai pu trouver en rapport avec le sujet est celui-ci , dans lequel on me présente trois façons de le faire:
1. "mettre à jour la référence manuellement (ce qui implique la plomberie)";
2. "à git push -f
partir d'un référentiel non nu";
3. " git branch -f this $that
".
Quelle solution pensez-vous être la plus appropriée ou quels autres moyens existe-t-il pour y parvenir? Malheureusement, la documentation que j'ai trouvée sur les référentiels git bare est assez pauvre.
Réponses:
Vous pouvez utiliser la
git update-ref
commande. Pour supprimer le dernier commit, vous utiliseriez:Ou si vous n'êtes pas dans la branche dont vous ne pouvez pas supprimer le dernier commit:
Vous pouvez également passer un sha1 si vous le souhaitez:
Consultez la documentation de la commande git-update-ref .
la source
git update-ref <ref> <newvalue>
comme étant la bonne branche, comme "refs / heads / master" au lieu de HEAD, par exemple. J'espère que je n'ai pas mal compris votre question.branch-name
argument. Lors de l'utilisationupdate-ref
avec une «branche», vous devez absolument spécifier le nom de référence complet de la branche (c'est-refs/heads/
à- dire précéder le nom court normal de la branche). Si vous utilisez simplement le nom court, vous finirez par créer / mettre$GIT_DIR/branch-name
à jour à la place de$GIT_DIR/refs/heads/branch-name
. L'existence des deuxbranch-name
etrefs/heads/branch-name
provoquera des avertissements «refname… est ambigu».Si vous utilisez ce qui suit dans un dépôt nu:
alors vous ne rencontrez pas les problèmes que vous avez en utilisant
--hard
et les--mixed
options dans un dépôt nu puisque vous n'essayez pas de changer quelque chose que le dépôt nu n'a pas (c'est-à-dire l'arbre de travail et l'index). Dans votre cas spécifiquement, vous voudriez utiliser (à partir du dépôt nu):Pour changer de branche sur le référentiel distant, procédez comme suit :
Pour voir la branche actuellement sélectionnée, utilisez:
https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html
la source
git checkout other_branch
ne fonctionne pas dans un nu.Le
git push -f
devrait fonctionner correctement:si vous clone qui repo nu, supprimer le dernier commit (
git reset --hard HEAD^
comme vous le mentionnez, mais dans une pension non-nue local) et repoussage (-f
):la source
git reset --soft <sha1>
comme indiqué dans ma réponse ci-dessous la pratique recommandée pour déplacer HEAD sur un repo nu?reset --soft
devrait fonctionner lorsqu'il est effectué directement sur un dépôt nu. Je soupçonne que cela est rarement fait car un dépôt nu est généralement un dépôt en amont (c'est-à-dire un dépôt vers lequel vous envoyez des données), et la plupart du temps, vous n'y avez pas d'accès local direct. Mais si vous le faites, alors ceci est certainement un autre bon exemple d'reset --soft
utilisation " " (comme dans stackoverflow.com/questions/5203535/… ) Donc +1 à votre réponse.Vous pouvez également utiliser la notation git refspec et faire quelque chose comme ceci:
git push -f origin +<commit you want to revert to>:<destination_head | branch_name>
Cela force la mise à jour de la branche de destination (comme indiqué par la référence) vers le commit source comme indiqué par la
+<object ref>
pièce.la source