Comment puis-je uncommit le dernier commit sur un git dépôt nu?
En prenant en considération qu'il y a plusieurs commandes git qui n'ont pas de sens dans un dépôt nu (nu parce que les référentiels ne pas utiliser d'index et de ne pas avoir un répertoire de travail),
git reset --hard HEAD^
n'est pas une solution à uncommit le dernier changement d'un tel référentiel.
La recherche à travers l'Internet, tout ce que je pouvais trouver le sujet est cette, dans lequel je me suis présenté trois façons de le faire:
1. "mise à jour de la ref manuellement (ce qui implique de plomberie)";
2. "git push -f
à partir d'un non-dépôt nu";
3. "git branch -f this $that
".
La solution de faire yo pense que c'est plus approprié ou que d'autres moyens sont là pour ce faire? Malheureusement, la documentation que j'ai trouvé sur git nu dépôts est assez pauvre.
- Dobrovol Ne pas utiliser les trucs compliqués ci-dessous. Vous tentez de déplacer la TÊTE d'un commit différent et c'est ce que git reset est destiné, même dans un nu-repo. Par ma réponse ci-dessous, utilisez: git reset --soft <valider> Avec --soft, vous n'avez pas essayez de changer un arbre de travail et l'index qui n'existe pas, donc git vous permet de faire le reset pas de problème.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
git update-ref
de commande. Pour supprimer le dernier commit, vous pouvez utiliser:Ou si vous n'êtes pas dans la direction à partir de laquelle vous ne pouvez pas supprimer le dernier commit:
Vous pouvez également passer une sha1 si vous le souhaitez:
Voir la documentation de la git-mise à jour-ref commande.
git update-ref <ref> <newvalue>
à la branche de droite, comme "refs/heads/master" à la place de la TÊTE, par exemple. J'espère que je n'ai pas mal compris votre question.branch-name
argument. Lors de l'utilisation deupdate-ref
avec une “branche” vous absolument devez spécifier la branche complète ref nom (c'est à dire ajouterrefs/heads/
pour le court normal nom de la branche). Si vous venez d'utiliser le nom court, vous finirez par créer/mettre à jour$GIT_DIR/branch-name
au lieu de$GIT_DIR/refs/heads/branch-name
. L'existence de ces deuxbranch-name
etrefs/heads/branch-name
va entraîner “refname ... est ambiguë” mises en garde.Si vous utilisez la commande suivante dans un nu-repo:
alors vous ne courez pas dans les problèmes que vous avez à l'aide de
--hard
et--mixed
options dans un nu-pensions puisque vous n'êtes pas d'essayer de changer quelque chose de la nue-pensions n'ont pas (c'est à dire arbre de travail et de l'index). Dans votre cas précis, vous souhaitez utiliser (à partir de la nue-pensions):À commutateur de branches sur le repo distant faire:
De voir l'actuelle branche sélectionnée utilisation:
https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html
git checkout other_branch
ne fonctionne pas dans un nue.La
git push -f
devrait fonctionner correctement:si vous le clone qui nu pensions, de supprimer le dernier commit (
git reset --hard HEAD^
comme vous le mentionnez, mais dans un local non-nue repo) et poussez vers l'arrière (-f
):git reset --soft <sha1>
, comme indiqué dans ma réponse ci-dessous la pratique recommandée pour déplacer la TÊTE nue un repo?reset --soft
devrait fonctionner quand fait directement sur un nu repo. Je crois que cela s fait rarement car un nu-repo est généralement un en amont repo (c'est à dire une mise en pension à laquelle vous êtes en poussant des données), et la plupart du temps, vous ne pas ont directement accès local à elle. Mais si vous le faites, alors c'est certainement un bon exemple de la "reset --soft
d'utilisation " (comme dans stackoverflow.com/questions/5203535/... ) Donc +1 pour votre réponse.Vous pouvez également utiliser git refspec de notation et de 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 l'agence de destination (comme indiqué par le ref) à la source de commettre, comme en témoignent les
+<object ref>
partie.