Pourquoi git ne peut pas faire des réinitialisations dures/douces par le chemin?

$ git reset -- <file_path> peut être réinitialisé par le chemin.

Toutefois, $ git reset (--hard|--soft) <file_path> affiche un message d'erreur comme ci-dessous:

Cannot do hard|soft reset with paths.
98
demandé sur user 2012-06-26 08:36:45
la source

5 ответов

parce qu'il n'y a pas de point (d'autres commandes fournissent déjà cette fonctionnalité), et cela réduit le risque de faire la mauvaise chose par accident.

Un "hard reset" pour un chemin est juste fait avec git checkout HEAD -- <path> (vérification de la version actuelle du fichier).

une réinitialisation douce pour un chemin n'a pas de sens.

une réinitialisation mixte pour un chemin est ce que git reset -- <path> fait.

105
répondu Amber 2016-11-24 05:34:43
la source

vous pouvez accomplir ce que vous essayez de faire en utilisant git checkout HEAD <path> .

cela dit, le message d'erreur fourni n'a aucun sens pour moi (car git reset fonctionne très bien sur les sous-répertoires), et je ne vois aucune raison pour laquelle git reset --hard ne devrait pas faire exactement ce que vous lui demandez.

16
répondu Aaron Kent 2014-12-23 00:30:26
la source

à La question comment est déjà répondu , je vais vous expliquer la pourquoi .

alors, que fait git reset ? Selon les paramètres spécifiés, il peut faire deux choses différentes:

  • si vous spécifiez un chemin, il remplace les fichiers appariés dans l'index par les fichiers d'une propagation (tête par défaut). Cette action n'est pas affecte l'arbre de travail du tout et est généralement utilisé comme le contraire de Git ajouter.

  • si vous ne spécifiez pas de chemin, il déplace la tête de la branche courante vers une propagation spécifiée et, avec ce , réinitialise optionnellement l'index et l'arbre de travail à l'état de cette propagation. Ce comportement supplémentaire est contrôlé par le paramètre mode:

    --doux : ne touchez pas à l'index et à l'arbre de travail.

    --mélange (par défaut): Réinitialiser l'index mais pas l'arbre de travail.

    --dur : réinitialiser l'index et l'arbre de travail.

    Il y a aussi d'autres options, consultez la documentation pour la liste complète et certains cas d'utilisation.

    quand vous ne spécifiez pas de commit, il est par défaut à HEAD, donc git reset --soft ne fera rien, comme c'est une commande pour déplacer le tête à tête (à son état actuel). git reset --hard , d'autre part , fait sens en raison de son effets secondaires , il dit déplacer la tête à la tête et réinitialiser l'indice et l'arbre de travail à la tête.

    je pense qu'il devrait être clair maintenant pourquoi cette opération n'est pas pour les dossiers spécifiques par sa nature - il est prévu de déplacer une tête de branche en premier lieu, la remise en fonction de l'arbre de travail et l'index est fonctionnalité secondaire.

3
répondu user 2017-10-11 18:55:30
la source

explication

Le git reset manuel listes de 3 façons d'invocation:

  • 2 sont classés: ils n'affectent pas l'arbre de travail , mais opèrent seulement sur les fichiers de l'index spécifié par <paths> :

    • git reset [-q] [<tree-ish>] [--] <paths>..
    • git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]
  • 1 est commit-wise: fonctionne sur tous les fichiers dans le référencé <commit> , et peut affecter l'arbre de travail:

    • git reset [<mode>] [<commit>]

il n'y a pas de mode d'invocation qui fonctionne seulement sur les fichiers spécifiés et affecte l'arbre de travail.

solution de contournement

si vous voulez les deux:

  • Réinitialiser l'index/cache version d'un fichier(s)
  • Vérifier le(S) fichier (s) (c'est-à-dire faire correspondre l'arbre de travail à la version index et commit)

vous pouvez utiliser cet alias dans votre fichier de configuration git:

[alias]
  reco   = !"cd \"${GIT_PREFIX:-.}\" && git reset \"[email protected]\" && git checkout \"[email protected]\" && git status --short #"  # Avoid: "fatal: Cannot do hard reset with paths."

vous pouvez alors faire l'un des:

$ git reco <paths>

$ git reco <branch/commit> <paths>

$ git reco -- <paths>

(Mnenonic pour reco : re & & c heck o ut)

0
répondu Tom Hale 2018-09-13 15:27:09
la source

git reset --TÊTE molle~1 nom de fichier annuler la validation, mais les modifications restent dans le local. nom de fichier pourrait être, pour tous les commis des fichiers

-1
répondu Peiti Peter Li 2015-08-26 00:21:11
la source

Autres questions sur git git-reset