2010-08-25 4 views
-1

J'ai trouvé d'autres questions qui parlent d'une fusion inverse dans Git, mais ces questions demandent comment inverser la fusion d'une commande ENTIRE. Je veux inverser fusionner un répertoire dans mon arbre. Est-ce possible dans Git?Git reverse merge de sous-arbre

Dans la subversion, vous pouvez le faire:

$ cd /workingcopy/some/subtree 
$ svn merge -r802:801 . 

Et cela calcule la diff inverse entre la révision 801 et 802 et applique uniquement au répertoire courant.

Le meilleur que je peux trouver est

$ cd /gitrepo/some/subtree 
$ git diff <commit-sha1> <commit-sha1>^ . > patchfile 
$ patch -p1 < patchfile 

Bien que je ne l'ai pas testé ce fait encore. Est-ce que git peut faire quelque chose de mieux?

+1

Est-ce que http://stackoverflow.com/questions/642264/undo-change-in-git-not-rewriting-history/642809# 642809 aide? Pas une réponse définitive, mais quand même. – VonC

+0

Après avoir lu cela, je pense que la réponse à ma question est, "Non, git ne le fait pas plus facile que patch." –

Répondre

2

Vous pouvez utiliser git checkout pour extraire un répertoire entier à une révision spécifiée. Par exemple, pour revenir le répertoire src à un cinq commits Retour commit:

$ git checkout HEAD~5 -- src 
$ git status   # See what files changes 
$ git diff --cached # Review the changes 
$ git commit 
+0

Vous voulez 'git diff --cached'. 'git checkout' sur un chemin fonctionne en le chargeant dans l'index, puis en le copiant dans l'arbre de travail. Cela signifie que 'git diff' ne montrera rien, parce que l'index et l'arbre de travail correspondent. – Cascabel

+0

Cela effacerait tous mes changements des 4 commits précédents, cependant. –