git log упрощение истории

Допустим, я иметь следующую историю

        D---E-------F
       /     \       \
      B---C---G---H---I---J
     /                     \
    A-------K---------------L--M

git log --ancestry-path D..M выдаст мне

            E-------F
             \       \
              G---H---I---J
                           \
                            L--M

Однако я хотел бы только следующее

            E
             \       
              G---H---I---J
                           \
                            L--M

Или

            E-------F
                     \
                      I---J
                           \
                            L--M

По сути, я хотел бы пройти только один путь а не два.

Возможно ли это? И если да, то что это за команда?

Edit:

Я пробовал использовать --first-parent, но это не совсем то. git log --first-parent G..M дает мне

                    F
                     \
                  H---I---J
                           \
                            L--M

Он включает F, потому что F является первым родителем I. Вместо этого я хотел бы

                  H---I---J
                           \
                            L--M

Любая помощь приветствуется.

Решение (которое работало для me):

Как заявил @VonC, нет ни одного однострочника, который бы это делал. В итоге я использовал сценарий bash.

  1. Для каждой фиксации в 'git log --ancestry-path G..M'
  2. Определите, включает ли родительский элемент $ commit ту фиксацию, в которой мы были ранее
  3. Если да, Продолжать. сделайте что-нибудь интересное.
  4. Если нет, пропустите эту фиксацию.

Например, git log --first-commit G..M равно

H - F - I - J - L - M

Однако родителем F является E, а не H. Поэтому мы опускаем F, давая мне

H - I - J - L - M

Ура!

14
задан Ken Hirakawa 20 July 2011 в 23:07
поделиться