Вы не можете сделать именно это.History в git - это ориентированный ациклический граф - каждый коммит содержит ссылки на своих родителей, но родители не имеют ссылок на своих детей.
Проблема здесь должна стать очевидной, когда вы думаете о коммите, вы создали несколько ветокот.Какой «следующий коммит» вы имеете в виду?С родителями вы можете сосчитать число (обычный коммит слияния имеет первого и второго родителя), но как это сделать с детьми?Даже если вы знаете, на какую ветку вы пытаетесь попасть (например, вы отметили master~4
и теперь хотите посмотреть на master~3
), это не совсем ясно - вы можете оказаться в такой ситуации:
- X (HEAD) - o - o - o - Y (master)
\ /
o - o - o ----------
Тем не менее, в простых случаях вы можете сделать что-то вроде этого:
git checkout $(git rev-list HEAD..master | tail -n 1)
Очевидно, что это будет хорошо работать с линейной историей.Со слияниями * rev-list
работает в истории в настоящем, следуя назад.Я полагаю, что сначала он следует за первым родителем, поэтому последним напечатанным будет коммит после HEAD
, найденный следом за всеми последними родителями.
Редактировать: Предполагается, что вы знаете, какую ветку вы хотите продвинутьв сторону.Если вы не ... ну, вы в значительной степени застряли, просматривая все ссылки для коммитов, у которых текущий HEAD является родителем - возможно, вы получите вывод git rev-parse
:
git rev-list --all --children | grep ^$(git rev-parse HEAD)
Затем возьмитедругой SHA1 из линии (используйте awk, что угодно).Вы должны будете вручную проверить или сделать произвольный выбор, если есть несколько результатов ...