web-dev-qa-db-fra.com

Pour git checkout sans écraser les données

Comment peux-tu git-checkout sans écraser les données?

Je cours

 git checkout master

Je reçois

error: Entry 'forms/answer.php' would be overwritten by merge. Cannot merge.

C'est surprenant, car je ne savais pas que Git fusionne quand je git-checkout. J'ai toujours couru après la commande séparément git merge new-feature. Cela semble apparemment inutile si Git fusionne à la caisse.

Git vous avertit que forms/answers.php a des modifications dans votre copie de travail ou index qui n'ont pas été validées.

Vous pouvez utiliser git-stash pour enregistrer vos modifications puis git-stash apply pour les restaurer.

Le cas d'utilisation courant de git-stash est que vous travaillez sur des modifications mais que vous devez ensuite temporairement extraire une branche différente pour corriger un bogue. Vous pouvez donc stash vos modifications dans votre index et votre copie de travail, extraire l'autre branche, corriger le bogue, valider, extraire la branche d'origine, et git -stash apply pour restaurer vos modifications et reprendre là où vous vous étiez arrêté.

54
Karl Voigtland

Git effectue une fusion bidirectionnelle de modifications non validées lors du changement de branche (en utilisant git checkout <branch>), mais en général, il ne fusionne que de manière triviale (au niveau de l'arborescence).

Outre git-stashsolution de Karl Voigtland , vous pouvez donner des options supplémentaires à git checkout , en choisissant l'une des options suivantes:

  • Dites à git de essayer plus fort de fusionner les changements non terminés dans la branche vers laquelle vous basculez avec -m/--merge option. Avec cette option, une fusion à trois voies entre la branche actuelle, le contenu de votre arbre de travail et la nouvelle branche est effectuée, et vous serez sur la nouvelle branche.

  • Dites à git de écraser les modifications non validées, en supprimant les modifications locales avec -f option. Attention: les modifications non validées seront perdues!

19
Jakub Narębski

Vous pouvez faire un git reset --soft pour que votre HEAD pointe vers la nouvelle branche, mais laissez tous les fichiers tels quels (y compris ceux qui ont été modifiés dans la nouvelle branche). Ensuite, vous pouvez utiliser git checkout pour extraire uniquement les fichiers que vous voulez vraiment de la nouvelle branche.

       git reset [<mode>] [<commit>]
           This form resets the current branch head to <commit> and possibly updates the index (resetting it to the
           tree of <commit>) and the working tree depending on <mode>. If <mode> is omitted, defaults to --mixed.
           The <mode> must be one of the following:

           --soft
               Does not touch the index file or the working tree at all (but resets the head to <commit>, just like
               all modes do). This leaves all your changed files "Changes to be committed", as git status would put
               it.
1
Evgeny