web-dev-qa-db-fra.com

Comment annuler le dernier commit dans un dépôt git bare?

Sachant 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 le dernier changement dans un tel référentiel.

En cherchant sur Internet, tout ce que j'ai pu trouver sur le sujet est this , dans lequel on me présente trois façons de 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 dénudé ";
3. "git branch -f this $that ".

Quelle solution pensez-vous la plus appropriée ou quelles sont les autres façons de procéder? Malheureusement, la documentation que j'ai trouvée sur les dépôts git bare est assez pauvre.

Vous pouvez utiliser le git update-ref commande. Pour supprimer le dernier commit, vous utiliseriez:

$ git update-ref HEAD HEAD^

Ou si vous n'êtes pas dans la branche d'où vous ne pouvez pas supprimer le dernier commit:

$ git update-ref refs/heads/branch-name branch-name^

Vous pouvez également passer un sha1 si vous le souhaitez:

$ git update-ref refs/heads/branch-name a12d48e2

Voir la documentation de la commande git-update-ref .

126
Sylvain Defresne

Si vous utilisez ce qui suit dans un référentiel nu:

git reset --soft <commit>

alors vous ne rencontrez pas les problèmes que vous rencontrez en utilisant --hard et --mixed options dans un référentiel nu puisque vous n'essayez pas de changer quelque chose que le référentiel nu n'a pas (c'est-à-dire arbre de travail et index). Dans votre cas en particulier, vous souhaitez utiliser (à partir du repo nu):

git reset --soft HEAD^

Pour changer de branche sur le référentiel distant faire:

git symbolic-ref HEAD refs/heads/<branch_name>
29
Hazok

Le git Push -f devrait fonctionner correctement:
si vous clonez ce référentiel nu, supprimez le dernier commit (git reset --hard HEAD^ comme vous le mentionnez, mais dans un référentiel local non nu) et repousser (-f):

  • vous ne modifiez aucun SHA1 pour les autres validations précédant celle que vous supprimez.
  • vous êtes sûr de repousser le contenu exact du repo nu moins la validation supplémentaire (car vous venez de le cloner en premier).
7
VonC

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 le +<object ref> partie.

2
alup