Dans l'une de mes branches de développement, j'ai apporté quelques modifications à ma base de code. Avant de pouvoir compléter les fonctionnalités sur lesquelles je travaillais, j'ai dû passer de ma branche actuelle à master pour faire la démonstration de certaines fonctionnalités. Mais la simple utilisation d'un "git checkout master" ; a préservé les changements que j'ai également effectués dans ma branche de développement, brisant ainsi certaines des fonctionnalités de master. Ce que j'ai donc fait, c'est commiter les changements sur ma branche de développement avec un message de commit "temporary commit" ; et ensuite checkout master pour la démo.
Maintenant que j’ai terminé la démo et que j’ai repris mon travail sur ma branche de développement, j’aimerais supprimer le "temporary commit" ; que j’ai fait tout en conservant les changements que j’ai faits. Est-ce possible ?
C'est aussi simple que ça :
git reset HEAD^
git reset
sans --hard
ou --soft
déplace votre HEAD
pour pointer vers le commit spécifié, sans changer aucun fichier. HEAD^
fait référence au (premier) commit parent de votre commit actuel, qui dans votre cas est le commit avant le temporaire.
Notez qu'une autre option est de continuer normalement, et ensuite au prochain commit, de lancer :
git commit --amend [-m … etc]
qui à la place éditera le commit le plus récent, ayant le même effet que ci-dessus.
Notez que ceci (comme avec presque toutes les réponses de git) peut causer des problèmes si vous avez déjà poussé le mauvais commit à un endroit d'où quelqu'un d'autre peut l'avoir tiré. Essayez d'éviter cela
Il y a deux façons de procéder. La plus simple dépend de votre situation
Reset
Si le commit dont vous voulez vous débarrasser était le dernier commit, et que vous n'avez pas fait de travail supplémentaire, vous pouvez simplement utiliser git-reset
.
git reset HEAD^
Cela ramène votre branche au commit juste avant votre HEAD actuel. Cependant, cela ne change pas réellement les fichiers dans votre arbre de travail. En conséquence, les changements qui étaient dans ce commit apparaissent comme modifiés - c'est comme une commande 'uncommit'. En fait, j'ai un alias pour faire exactement cela.
git config --global alias.uncommit 'reset HEAD^'
Ensuite, vous pouvez simplement utiliser git uncommit
dans le futur pour sauvegarder un commit.
Squashing
Squash un commit signifie combiner deux ou plusieurs commits en un seul. Je le fais assez souvent. Dans votre cas, vous avez commité une fonctionnalité à moitié terminée, vous la finissez et vous commitez à nouveau avec le bon message de commit permanent.
git rebase -i <ref>
En face de chaque commit, il y aura le mot pick
. Trouvez le commit dont vous voulez vous débarrasser et changez-le de pick
en fixup
ou squash
. L'utilisation de fixup
élimine simplement le message de ce commit et fusionne les changements dans son prédécesseur immédiat dans la liste. Le mot-clé squash
fait la même chose, mais vous permet d'éditer le message de commit du commit nouvellement combiné.
Notez que les commits seront re-committé dans l'ordre dans lequel ils apparaissent dans la liste lorsque vous quittez l'éditeur. Ainsi, si vous avez fait un commit temporaire, puis effectué d'autres travaux sur la même branche, et complété la fonctionnalité dans un commit ultérieur, alors l'utilisation de rebase vous permettra de reclasser les commits et de les écraser.
ATTENTION:
Rebase modifie l'historique - Ne faites pas cela sur les commits que vous avez déjà partagés avec d'autres développeurs.
Stashing
À l'avenir, pour éviter ce problème, pensez à utiliser git stash
pour stocker temporairement les travaux non engagés.
git stash save 'some message'
Ceci stockera vos changements actuels sur le côté dans votre liste de cache. Ce qui précède est la version la plus explicite de la commande stash, permettant un commentaire pour décrire ce que vous stockez. Vous pouvez aussi simplement lancer git stash
et rien d'autre, mais aucun message ne sera stocké.
Vous pouvez parcourir la liste de vos fichiers cachés avec...
git stash list
Cela vous montrera toutes vos cachettes, les branches sur lesquelles elles ont été faites, et le message et au début de chaque ligne, et l'identifiant pour cette cachette qui ressemble à ceci stash@{#}
où # est sa position dans le tableau des cachettes.
Pour restaurer un stash (ce qui peut être fait sur n'importe quelle branche, indépendamment de l'endroit où le stash a été créé à l'origine), il suffit de lancer...
git stash apply stash@{#}
Encore une fois, # est la position dans le tableau des stocks. Si la cachette que vous voulez restaurer est à la position 0
- c'est-à-dire, si c'est la cachette la plus récente. Alors vous pouvez simplement lancer la commande sans spécifier la position du stash, git supposera que vous voulez dire le dernier : git stash apply
.
Ainsi, par exemple, si je me retrouve à travailler sur la mauvaise branche - je peux lancer la séquence de commandes suivante.
git stash
git checkout <correct_branch>
git stash apply
Dans votre cas, vous avez déplacé les branches un peu plus, mais la même idée s'applique toujours.
J'espère que cela vous aidera.
Une autre façon de le faire.
Ajoutez commit au dessus de temporary commit et ensuite faites :
git rebase -i
Pour fusionner deux commits en un seul (la commande ouvrira un fichier texte avec des instructions explicites, modifiez-le).