Situation: j'ai un seul commit git (à HEAD), qui a mélangé du code de journalisation supplémentaire, puis du "vrai code".
Maintenant, j'aimerais faire ce qui suit:
Maintenant, je pourrais le faire «à la main», en prenant une copie simple du code avec la journalisation incluse, puis en supprimant la journalisation comme décrit ci-dessus et en écrasant ces commits en un seul (il n'y a donc pas de code de journalisation dans l'historique des validations ), puis restaurez la copie du code avec la journalisation incluse, et ajoutez-la en tant que nouveau commit.
Mais y a-t-il un moyen de faire cela avec élégance et avec moins de risques d'erreur humaine en utilisant les fonctionnalités git ?
Pour clarifier, je ne veux pas choisir les parties à inclure dans le premier commit que je désire (car il y a beaucoup de petits changements et je ne veux pas les revoir). Je souhaite choisir les parties à supprimer du premier commit et les ajouter comme nouveau deuxième commit.
4 Réponses :
Je ne pense pas qu'il y ait un moyen de le faire sans aucune chance d'erreur humaine, mais en utilisant certaines fonctionnalités git et en annulant votre commit, puis en ajoutant uniquement les parties que vous voulez dans chaque commit, vous pouvez réaliser ce que vous décrivez.
Je ferais cela en effectuant une réinitialisation logicielle sur HEAD ~ 1 , puis en utilisant git add --patch pour ajouter uniquement les parties que vous souhaitez valider dans le premier valider, valider cela, puis ajouter la journalisation.
Voici comment j'aborderais ceci:
git reset --mixed HEAD ~ 1 Ceci réinitialise votre dernier message de validation et annule ces modifications. git add --patch Cela vous donne un mode interactif dans lequel vous pouvez sélectionner les parties des modifications non mises en scène que vous souhaitez mettre en scène. Si un morceau de code est trop gros (c'est-à-dire que vous ne voulez valider qu'une partie de celui-ci), vous pouvez le diviser en parties plus petites en appuyant sur s , puis ne mettre en scène qu'une partie plus petite. Il prend en charge la division des morceaux de code en modifications sur une seule ligne.
git commit Validez votre "vrai code" git add. Préparez le reste de vos modifications (le code de journalisation) git commit à nouveau pour valider le code de journalisation En utilisant cette approche, vous ne devriez pas avoir à copier-coller le code n'importe où, ce qui réduit au moins le risque d'erreur humaine.
Astuce: git reset --soft HEAD ~ 1; git reset HEAD. peut être remplacé par git reset --mixed HEAD ~ 1 .
Je vous remercie! Git a vraiment beaucoup de joyaux cachés qu'il faut parfois un certain temps pour trouver.
Je veux spécifiquement éviter d'ajouter les modifications une par une. Je veux simplement rechercher toutes les instructions de journalisation et les supprimer (du premier commit) sans revoir tout le reste (ce que je devrais faire si je voulais le faire dans l'autre sens).
Aah. Je ne pense pas qu'il y ait des fonctionnalités git pour faire cela, mais certains scripts shell avec grep, sed et patch devraient pouvoir y parvenir, je pense
Ok, je l'ai résolu (avertissement: je n'ai pas testé cette séquence de commandes exacte, car il y a eu des essais et des erreurs, donc si vous l'utilisez, ne désengagez pas votre propre cerveau):
git checkout branch_to_split_the_head git tag desired_result # also backup, if you haven't pushed # edit the source to the state for 1st commit, test etc git add -u git status # make sure status looks ok git diff --staged # make sure removed lines etc look ok git commit --amend --no-edit # create correct 1st commit git merge -X theirs desired_result # ...add correct 2nd commit git diff desired_result # there shouldn't be differences # git push -f # as usual -f needed after rewriting history
Vous pouvez réinitialiser avant votre dernière validation, en gardant votre arborescence de travail intacte:
git reset HEAD^
Vous devriez maintenant avoir toutes vos modifications dans un état non validé et non organisé. Vous pouvez ajouter de manière interactive les modifications que vous souhaitez apporter à votre premier commit (c'est-à-dire la journalisation) avec git add -p puis les valider.
Maintenant, vous ne devriez plus avoir que votre "vrai code" change que vous pouvez valider séparément.
Voici la routine qui réplique avec succès vos exigences.
En supposant que vous ayez l'historique suivant.
3c8ce38 Add logging 6afa0ab Add real code bdf6bce Add initial commit
Checkout dans la branche temporaire.
git cherry-pick ef5e245 -X theirs -e # Add real code git cherry-pick 9fffc54 -X theirs -e # Add logging
Revenez à la branche principale et réinitialisez pour valider avant vos modifications.
git reset --hard bdf6bce
Ensuite, procédez comme suit ( -e permet modifier le message de validation lors de la sélection sélective).
git checkout -b temp
Finalement, vous aurez un nouvel historique avec les validations suivantes.
ef5e245 Remove logging 9fffc54 Add real code and logging bdf6bce Add initial commit
Vous ne devriez pas avoir de problèmes de fusion, sauf si vous avez créé de nouveaux fichiers.
Avant d'accepter / de voter, avez-vous testé cela? Je veux dire, cela peut être une question un peu n00bish, mais le premier choix de cerises fait-il vraiment ce qui est attendu, en combinant les commits (au lieu d'essayer de supprimer les lignes qui n'ont pas été ajoutées)?
Copie possible de Comment puis-je réorganiser / combiner des commits à l'aide de Git rebase?
@Joe Je n'ai pas trouvé de solution dans ce contrôle qualité. Pourriez-vous être plus précis sur quelle réponse, ou plutôt quelle partie de la réponse couvre mon besoin?