2017-06-13 3 views
1

J'ai récuré stackoverflow et d'autres forums pour trouver la réponse en vain - rien ne semble aller tout à fait ce que je cherche.voir git log des commits entre le maître et la branche en direct

Donc, la question est la suivante: J'ai un maître-branche et un en direct branche. Le développement continue sur la master-branch, et lorsque les commits sont jugés appropriés, ils sont sélectionnés dans le live-branch.

Cependant, je découvre que le en direct branche a un bug, qui est fixé dans maître-branche et je suis en train de trouver ce qui engage à maître-branche introduit le correctif. J'essaie de le faire en voyant d'abord quelle est la différence de commit entre le maître et le live. Certains commits en maître ne l'ont pas fait vivre, lesquels?

J'ai essayé les éléments suivants:

git log --cherry-pick --oneline --no-merges --right-only live-branch..master 

mais je ne comprends pas vraiment cette commande, cela me dit la différence commets, mais cela me donne les mêmes commits qui sont en direct et maître, seulement les hash sont différents.

J'ai besoin d'une sorte de patch pour faire cela. git diff commit_from_master, v3.8 si vide ignore.

Comment est-ce que je peux faire ceci?

Je mettrai à jour si plus de clarification est nécessaire.

+0

Pensez à utiliser 'git bisect' –

+0

cela prendra beaucoup trop de temps, c'est un grand projet qui prend des heures à compiler, a besoin de diff diff ... – janjust

+2

' --right-only' nécessite la notation à trois points, 'live-branch ... master' ou' master ... live-branch'. La même chose vaut pour '--cherry-pick' et' --cherry-mark'. Cependant, s'il y a un commit particulier qui corrige un bug particulier, @TimBiegeleisen a raison, 'git bisect' est le moyen de le trouver. – torek

Répondre

3

(expansion commentaire à répondre)

Je pense que vous voudrez peut-être --cherry, qui est synonyme de --right-only --cherry-mark --no-merges (consultez la documentation git log ou git rev-list), ou même avec --cherry-pick (que vous avez essayé) au lieu de --cherry-mark. Ceux-ci nécessitent d'utiliser la différence symétrique ou la notation à trois points, c'est-à-dire, live-branch...master.

Lorsque vous utilisez --left-right avec la notation à trois points, vous obtenez engager hash annotés avec < si elles sont sur le « côté gauche » et avec > si elles sont sur le « côté droit ». Rappelez-vous ici que la différence symétrique de deux ensembles signifie éléments qui sont membres de l'un ou l'autre ensemble, mais pas de l'union des deux ensembles. Appliqué aux branches Git, nous obtenons ceci:

(left side) (right-side) 
    live-branch  master 

      *   * 
      |   | 
      *   X' 
      |   | 
      :   : 
      |   | 
      X   * 
      \  /
       \ /
       \ /
       \/
       * 
       | 
       : 

où chaque lettre majuscule ou * représente une validation. Les deux branches se rejoignent à un certain point, donc left...right regarde tous les commits "au-dessus" de la jointure, et exclut sommairement tous ceux qui se trouvent en dessous. (Le point de jonction est également exclu, car il est dans les deux ensembles, bien que --boundary re-inclut.)

C'est bien, mais nous voulons savoir qui commits sont du côté gauche engage, et bien sûr la même chose pour commits de droite.Puis, en utilisant --cherry ou --cherry-pick ou --cherry-mark, nous obtenons Git pour analyser l'équivalence de correctif de chaque validation sur les côtés gauche et droit. Si deux hachages de commit différents ont le même git patch-id calculé, ce qui signifie que l'un a probablement été sélectionné par un autre, ils sont reliés entre eux. Par exemple dans le diagramme ci-dessus, X et X 'sont "identiques" donc ils sont liés.

Le comportement des différentes options --cherry consiste à utiliser ces marques de diverses manières. Vous recherchez des validations qui sont présentes dans master mais qui ne figurent pas dans live-branch. Par conséquent, après avoir marqué les paires, vous ne souhaitez effectuer que les validations côté droit (master) qui ne correspondent pas aux validations côté gauche (live-branch). En utilisant --cherry-mark, vous obtenez de les voir avec des marques; avec --cherry-pick, Git laissera tomber les marqués/appariés entièrement.