web-dev-qa-db-fra.com

Comment annuler les commits poussés?

nous voulons annuler les 2 derniers commits qui ont tous deux été poussés vers Origin master. dans tortoise git, nous pouvons afficher l'historique, et cliquer sur le 3ème du dernier commit, et choisir "réinitialiser le maître à ceci", ce qui, nous le supposons, signifie revenir à cette version.

cependant, lorsque vous sélectionnez cette option, vous devez choisir l'une de ces trois options:

  1. soft - laisser l'arbre de travail et l'index intacts.
  2. mixte - laisser l'arbre de travail intact, réinitialiser l'index
  3. réinitialisation matérielle de l'arbre de travail et de l'index.

Malheureusement, nous ne savons pas laquelle de ces 3 options nous devons choisir - nous voulons simplement annuler les deux derniers commits et remonter dans le temps.

La question suivante est cette opération se produit-elle sur l'origine distante, votre dépôt ou votre répertoire de travail, ou une combinaison de ces 3? Par exemple. faut-il effectuer un commit et un push après le retour, ou cela fait-il pour vous?

Nous devinerions que HARD est ce que nous voulons - cela ramènera le référentiel (pas sûr lequel) et notre code source local à une version précédente. Si tel est le cas, pourquoi n'est-ce pas la valeur par défaut et quel est le cas d'utilisation pour les deux autres options? Soit vous souhaitez annuler ou non, et si vous ne rétablissez que le référentiel distant, et non vos fichiers de travail locaux, vous allez être dans un état désordonné.

Nous n'avons aucun fichier modifié localement.

Remarque, nous sommes désespérément à la recherche d'une solution qui ne casse pas git (nous avons cassé git dans le passé et avons dû craquer un nouveau dépôt). Peut-être qu'une autre méthode est possible, comme extraire une version précédente, puis l'archiver par-dessus la dernière version, mais nous ne savons pas comment procéder.

Nous obtenons que nous pouvons faire quelque chose comme:

git checkout [revision]

Mais comment dire alors à git que nous voulons faire de cette version la nouvelle tête ou remplacer la tête par celle-ci? Je suppose que nous ne pouvons pas simplement nous engager, car il n'y a rien à engager, car nous ne sommes plus sur la tête du maître. En passant, si vous consultez un aperçu. version, et la modifier, et valider, qu'est-ce que vous commettez et où?

J'ai lu https://www.atlassian.com/git/tutorials/undoing-changes mais cela ne traite pas de la relation entre les repos locaux et distants. Si les validations à annuler sont toutes poussées vers le maître d'origine distant, il est difficile de savoir quelle est la recette pour rétablir l'origine distante, le référentiel local et le répertoire de travail - tous les 3 doivent être rétablis dans la validation 3 commits auparavant. Nous ne nous soucions pas vraiment si cela se fait avec une réinitialisation ou un retour - nous avons juste besoin d'un moyen de le faire qui fonctionne sur les 3 emplacements.

Il se pourrait que la recette correcte soit quelque chose comme ceci:

   git status (we are on master with a clean working dir)
   git git revert HEAD~2
   git commit -m "revert"
   git Push Origin mater

Mais nous n'avons jamais vu cet ensemble d'étapes dans les exemples, et nous préférerions le faire avec de la tortue git si possible.

5
John Little

Il y a deux options:

  1. revenir dans l'histoire, mais conserver l'histoire: revert
  2. revenir dans l'histoire et modifier l'histoire, de sorte que le contenu des validations soit supprimé à tout jamais: reset --hard et Push --force.

Si vous n'êtes pas sûr, utilisez revert, c'est l'option la plus sûre.

Si vous voulez vraiment, vraiment, supprimer les commits et ne vous souciez pas de l'historique modifié, utilisez reset --hard et Push --force. Cela a les conséquences suivantes:

  • D'autres pourraient réintroduire l'engagement
  • D'autres pourraient dépendre du commit qui a été supprimé
  • Dans les référentiels publics, la poussée forcée vers le maître est un pas

Des questions

La question suivante est cette opération se produit-elle sur l'origine distante, votre dépôt ou votre répertoire de travail, ou une combinaison de ces 3? Par exemple. faut-il effectuer un commit et un push après le retour, ou cela fait-il pour vous?

En général, tous les changements dans TortioseGit sont dans votre clone ("copie de travail"). La poussée est toujours une action manuelle

Nous devinerions que HARD est ce que nous voulons - cela ramènera le référentiel (pas sûr lequel) et notre code source local à une version précédente. Si tel est le cas, pourquoi n'est-ce pas la valeur par défaut et quel est le cas d'utilisation pour les deux autres options?

Parce que hard supprime les validations et donc l'historique, c'est une opération dangereuse. Vous pouvez également supprimer les modifications des autres!

quel est le cas d'utilisation des deux autres options?

Voir Quelle est la différence entre git reset --mixed, --soft et --hard?

Étapes dans TortoiseGit:

Revenir

  1. Annuler la validation (à partir du journal)

enter image description here

  1. Valider les modifications enter image description here

  2. et pousser

Réinitialiser dur et forcer Push

  1. Réinitialiser (à partir du journal)

enter image description here

  1. Choisissez dur

enter image description here

  1. Forcer la poussée (case à cocher "changements connus")

enter image description here

4
Julian

Je pense que vous confondez revenir et réinitialiser, voir Annuler les modifications :

annuler

La commande git revert annule un instantané validé. Mais, au lieu de supprimer la validation de l'historique du projet, il explique comment annuler les modifications introduites par la validation et ajoute une nouvelle validation avec le contenu résultant. Cela empêche Git de perdre l'historique, ce qui est important pour l'intégrité de votre historique de révision et pour une collaboration fiable.

réinitialiser

Si git revert est un moyen "sûr" d'annuler les modifications, vous pouvez considérer git reset comme la méthode dangereuse. Lorsque vous annulez avec git reset (et que les validations ne sont plus référencées par aucune référence ou reflog), il n'y a aucun moyen de récupérer la copie d'origine - il s'agit d'une annulation permanente. Il faut être prudent lors de l'utilisation de cet outil, car c'est l'une des seules commandes Git qui a le potentiel de perdre votre travail.

Dans votre cas, il est probablement préférable d'utiliser Revert:

enter image description here

dans ce cas, vous créez simplement un nouveau commit, qui annule un commit spécifique, aucun changement d'historique. Vous pouvez le faire localement, puis pousser vers la télécommande.

Si vous souhaitez toujours effectuer une réinitialisation et n'avez pas besoin de conserver les modifications locales, vous effectuez une réinitialisation matérielle:

enter image description here

puis vous devez forcer Push:

git Push -f
0
Alexan

cette solution m'a fait gagner du temps

1) git reset --hard 93827927ed6e245be27f94c93c7e3574e85b91c6 (c'est votre identifiant de validation)
2) git reset HEAD ~ 1
3) git stash
4) git add.
5) git commit -m "votre nouveau message de commit ici"
6) git Push --force

0
arul pushpam