2017-10-06 4 views
2

Je souhaite être en mesure de voir les changements dans une branche, depuis la dernière fois que je l'ai passée en revue, mais en ignorant les changements de maître qui sont survenus entre-temps.Git diff branche avant et après rebase ignorer les modifications dans le maître

 F - G  H - I 
    /  /
A - B - C - D - E 

I ont deux gammes engager c3af8fc5..7ccc4b49 (représenté par B - G) et 4dfdabdd..301a443c (représenté par E - I).


Imaginez, vous faites l'examen du code pour votre collègue, vous extrayez sa branche locale et sur votre HEAD pointe maintenant à G. Vous faites l'examen du code et passez à autre chose.

Quelque temps passe, les nouveaux commits sont apparus dans le maître (C, D et E) et votre collègue ont résolu les commentaires de votre avis. Il a écrasé les modifications pour commettre F et G, parce qu'il a renommé la méthode introduite dans F et a fixé son utilisation dans G. Il a également rebasé la branche sur le maître, pour s'assurer que tout fonctionne.

Maintenant, vous voulez faire une révision de code, mais vous êtes fainéant de faire une révision de code de toute la branche, donc vous voulez seulement voir ce qui a changé depuis la dernière fois. Vous avez toujours les anciennes références récupérées localement. Que faire?

Vous pourriez faire quelque chose comme git-diff G I, mais cela vous montrerait aussi ce qui a changé dans le maître qui ne vous aide pas du tout.

Vous pouvez également rebaser les anciennes références sur le maître actuel, puis les modifier. Cela pourrait aider, mais il pourrait également y avoir beaucoup de conflits, ce qui pourrait rendre la révision de toute la branche plus facile.


J'ai essayé diffing patches

diff <(git-diff c3af8fc5...7ccc4b49) <(git-diff 4dfdabdd...301a443c) 

il me aide à quelque part diriger mon attention, mais il est très brut.

Connaissez-vous une façon plus agréable et plus native de résoudre ce problème? Merci.


Edit: Je viens discovered interdiff, ce qui rend diffing deux diffs beaucoup plus agréable

interdiff <(git-diff -U100 c3af8fc5...7ccc4b49) <(git-diff -U100 4dfdabdd...301a443c) | colordiff 

mais encore, il ne dispose pas du contexte que git pourrait fournir - si ... Y a-t-il quelque chose de mieux?

+0

Git peut seulement montrer le diff entre deux commits. On dirait que vous voulez un diff d'un diff, donc ce n'est pas quelque chose que Git peut faire. – poke

+0

Je sais, mais git a le contexte des changements, Il pourrait générer ce diff de deux diffs d'une manière intelligente. –

+0

Mais à quoi cela ressemble-t-il? Je ne peux même pas y penser visuellement. – poke

Répondre

2

La façon la plus simple peut être: comparer visuellement les diffs

Révolutionnez deux téléspectateurs diff, et de comparer les deux points de vue quand vous voulez voir ce qui vient de la révision rebasées:

# view the "old" patch : 
git difftool -d B G 

# view the "new" patch : 
git difftool -d H I 

Vous pouvez vous concentrer sur uniquement les fichiers modifiés:

git diff --name-only B G 

liste les noms des modifi ed fichiers entre B et G.

Vous pouvez cibler uniquement les fichiers modifiés en utilisant par exemple:

# compare G and I, 
# looking only at files modified between B and G, or between E and I : 
git difftool -d G I -- $(
    git diff --name-only B G; git diff --name-only E I 
) 

Vous pouvez également essayer de rebasage B..G au-dessus de E sur votre machine locale, si elle n » t déclencher trop de conflits, puis regarder le diff:

git checkout G 

# as an option, you can make a temporary branch : 
git checkout -b wip/G 

# rebase on the tip of 'master' : 
git rebase E 

# look at the diff between "rebased G" and I 
git difftool -d wip/G I