Подтвердить что ты не робот

Список совершает между двумя хэшами фиксации в git

Я знаю, что здесь были очень похожие вопросы, но они не решили мою проблему. Возможно, там что-то я плохо понимаю.

Это часть истории фиксации пригодности (https://github.com/unclebob/fitnesse/):

* | | | | | | | | | | | | | | | fa86be8 Avoid possible issue when using CachingPage under heavy memory load.
|/ / / / / / / / / / / / / / /  
* | | | | | | | | | | | | | |   7b4a07a Merge pull request #256 from barredijkstra/fitnesse_issue_250
|\ \ \ \ \ \ \ \ \ \ \ \ \ \ \  
| * | | | | | | | | | | | | | | ecf5891 Fixed test checking for OS specific exception message.
| * | | | | | | | | | | | | | | 082236e Added rendering of cause exceptions. Fix for unclebob/fitnesse#250
* | | | | | | | | | | | | | | |   a92b37f Merge pull request #243 from amolenaar/fix/243-hash-table-rendering

Мне нужен список коммитов между двумя хэшами фиксации. В этом конкретном случае я хочу, чтобы коммит между ecf5891 и 7b4a07a, и я ожидаю, что результатом будет:

ecf5891
7b4a07a

Si far Я использовал git rev-list commit_hash_from_here^..commit_hash_up_to_here, и он отлично работал с линейной историей. Однако в этом случае я получаю намного больше коммитов.

Я пробовал это, и он работает так, как ожидалось:

git log --since='<date ecf5891>' --until='<date 7b4a07a>'

(Я вручную искал эти 2 даты).

Одним из возможных решений является получение двух дат и просто выполнение этого, но я думаю, что должен быть лучший способ.

Изменить: 7b4a07a родители ecf5891 и a92b37f. Пока что решения работают нормально, если я хочу перейти от ecf5891 в 7b4a07a, но если я хочу перейти от a92b37f в 7b4a07a, я хочу получить:

7b4a07a
ecf5891
082236e
a92b37f

но я не получаю a92b37f

4b9b3361

Ответ 1

"Между" является несколько скользким понятием, когда дело доходит до git.

Текст, который вы показываете выше, с фрагментом вывода графика, показывает, почему from^..to производит больше, чем только две коммиты: часть to является фиксацией слияния.

Обозначение A..B на самом деле является просто сокращением для B ^A. То есть "все, начиная с B и работая назад, минус все, начиная с A и работая назад". Но B является фиксацией слияния, поэтому "все, начиная с этого момента и работая назад", использует обоих родителей.

Здесь первый родительский элемент 7b4a07a равен a92b37f (не в вашем [оригинальном] фрагменте выше, но я клонировал связанное репо и нашел его). Мы можем называть это символически, хотя, и я буду ниже. Второй родительский элемент 7b4a07a - ecf5891, интересующая вас часть.

Когда вы запрашиваете:

ecf5891^..7b4a07a

это означает:

7b4a07a ^ecf5891^

что совпадает с:

7b4a07a ^082236e

который доставит вам обоих родителей слияния, а затем отменит все, начиная с 082236e назад. Вам нужно отрезать все от 7b4a07a^ - от первого родителя и обратно:

git rev-list 7b4a07a ^ecf5891^ ^7b4a07a^
git log --oneline 7b4a07a ^ecf5891^ ^7b4a07a^

В целом, однако, вам нужно выяснить, какая линия (-ы) потомка прерывается.

Изменить: вы можете придерживаться нотации A..B, но вам нужно добавить дополнительный "исключить". Поэтому jthill answer работает, как только вы переместите шляпу на передний план.


Повторите свое редактирование ( "если я хочу перейти от a92b37f до 7b4a07a" ): мы вернулись к этому вопросу о том, что "между" является скользким понятием. Какие фиксации "между"? Прямая строка от a92b37f до 7b4a07a, потому что a92b37f является одним из двух родителей слияния 7b4a07a. Таким образом, по более ранней логике ( "совершает прямо на предковую линию", возможно, "включительно" ), которая была бы просто одной или, возможно, обоими из двух коммитов. Но вы говорите, что хотите, чтобы две коммиты, которые в любом предковском смысле не связаны с a92b37f вообще. Почему вы хотите, чтобы эти два конкретных обязательства? Что делает 082236e "интересным" и 082236e^, его родительский, "неинтересный"?

Ответ 2

Я думаю, что вы ищете --ancestry-path, в вашем случае:

git rev-list --ancestry-path 7b4a07a..ecf5891

Ответ 3

Добавьте ^ 7b4a07a ~, чтобы исключить все, что доступно, из первого родителя слияния. Вы исключаете только то, что доступно для второго родителя.

Ответ 4

Сначала определите релевантные 2 хэша фиксации, которые вам нужны для получения списка хэшей фиксации между ними, используя

git log --oneline

Затем вы можете выбрать соответствующие два хэша commit и найти хэши фиксации между ними, используя

git log <commit hash 1> <commit hash 2> --oneline | cut -d " " -f 1