2017-08-24 1 views
1

Cela me arrive de temps en temps (bien, peut-être souvent):git changer commettras intermédiaire sans changer plus tard un

Remarque: Tous les événements suivants se produit avant que je pousse.

Mon projet logiciel nécessite une nouvelle fonctionnalité. Je code et teste jusqu'à ce que cela fonctionne. j'avais dû faire place à la nouvelle fonctionnalité, donc je diviser les changements en deux commits en utilisant git add -i:

A --- R --- F 

Commit R apporte les modifications de refactorisation, F ajoute le code pour la nouvelle fonctionnalité.

Maintenant, je me rends compte que j'ai fait des erreurs en divisant les changements, donc certains qui sont en F appartiennent déjà à R déjà, et vice versa. Donc, fondamentalement, R est foiré et ne passe pas les tests (alors que l'état final de F est parfait).

Pour résoudre ce problème, je vérifie R sur une branche temporaire et corrige tout. Je git commit --amend et maintenant je

A --- R --- F 
    \ 
    \-- R' 

Donc, tout ce qui manque est en train de passer F à la nouvelle branche. Jusqu'ici, ma solution était de faire git rebase --onto R-prime R F (j'utilise en fait les noms de branches, mais vous voyez ce que je veux dire). Le problème avec cela est que ce n'est pas exactement ce que je veux: git comprend que je veux déplacer le change entre R et F sur R', me donner un commets F' qui pourrait être différent de F. Cependant, je veux F' être exactement le même que F, sauf pour son ancêtre. Souvent, le rebase provoque des conflits qui sont difficiles à résoudre (c'est-à-dire sujets à des erreurs).

Est-il possible de dire git que je veux déplacer le instantané de F, pas la diff RF?

Répondre

1

Si l'on suppose votre tête en cours est à R', il devrait être comme (hash de substitution au lieu de F et R')

git reset --hard F 
git reset --soft R' 
git commit -c F 

Il prend l'arbre de F tel qu'il est, et il engage comme enfant de R', en remplaçant commettre un message de F et en invoquant l'éditeur, vous voudriez le changer

+0

Je comprends ce qui se passe, mais ce n'est pas quelque chose que je ferais avant d'aller me coucher à minuit ... Merci quand même! – user189