ref^
относится к коммиту до ref
, как насчет получения коммита после ref
?
Например, если я git checkout 12345
как проверить следующий коммит?
Спасибо.
PS Да, git - это дерево структуры указателя узла DAG. Как мне найти коммит после этого?
git
version-control
Schwern
источник
источник
git children-of
"!Ответы:
Чтобы вывести список всех коммитов, начиная с текущего, потом его потомка и т. Д. - в основном это стандартный git log, но в другом направлении, используйте что-то вроде
где 894e8b4e93d8f3 - первый коммит, который вы хотите показать.
источник
HEAD^
на894e8b4e93d8f3^
....
,^..
молча не получаетсяfatal: unrecognized argument: --ancestry-path
в git версии 1.7.1master
находится на пути предка текущего коммита. Посмотрите второй фрагмент кода моего ответа для решения, которое будет работать во всех случаях.Создатель для Hudson (сейчас Jenkins) Kohsuke Kawaguchi только что опубликовал (ноябрь 2013):
kohsuke / git-children-of :
Как показано в этой теме , в VCS, основанной на истории, представленной DAG (направленный ациклический граф) , нет ни «одного родителя», ни «одного потомка».
Упорядочение коммитов осуществляется с помощью «топо-порядка» или «даты-порядка» (см. Книгу GitPro )
Но начиная с Git1.6.0 , вы можете перечислить потомков коммита.
Примечание: для родительских коммитов
^
возникает та же проблема с суффиксом к параметру ревизии, означающим первого родителя этого объекта коммита.^<n>
означает<n>
родителя (тоrev^
есть эквивалентноrev^1
).Если вы находитесь на ветке
foo
и выпускаете "git merge bar
", тоfoo
будете первым родителем.Т.е.: первый родитель - это ветвь, в которой вы были, когда вы сливались, а второй - коммит в ветке, в которую вы вошли.
источник
git rev-list --children
конечно, похоже на то, что я хочу, но это не DWIM. Кажется, чтобы перечислить всех родителей и их детей. Я полагаю, что могу перечислить их все и разобрать их ... блеф, но это что-то.git rev-list --children
не для перечисления только детей, но для перечисления родителей со своими детьми ... вам всегда нужно разобрать.$ git children0of 9dd5932
fatal: No annotated tags can describe '71d7b5dd89d241072a0a078ff2c7dfec05d52e1f'.
However, there were unannotated tags: try --tags.
какой вывод вы получаете?git-children-of
том, что он использует git description, который пытается отформатировать SHA как удобочитаемый для человека, что может привести к ошибке @ TomHale, и дает такие результатыv1.0.4-14-g2414721
, которые вводят в заблуждение, если вы ожидаете SHA. Замена на простойecho
делает это отличным инструментом, спасибо!что я нашел
где я установил
commit1
текущий коммит иcommit2
текущий заголовок. Это возвращает мне список всех коммитов, которые строят путь междуcommit1
иcommit2
.Последняя строка вывода является дочерним элементом commit1 (на пути к commit2).
источник
| tail -1
чтобы получить ребенка.Я знаю, что Вы имеете ввиду. Расстраивает наличие обильного синтаксиса для перехода к предыдущим коммитам, но нет перехода к следующим. В сложной истории проблема «что будет следующим коммитом» становится довольно сложной, но затем в сложном слиянии возникает такая же сложность и с «предыдущими» коммитами. В простом случае, внутри одной ветви с линейной историей (даже только локально для некоторого ограниченного числа коммитов) было бы неплохо и имеет смысл идти вперед и назад.
Однако реальная проблема заключается в том, что на дочерние коммиты не ссылаются, это только список с обратной связью. Поиск дочернего коммита требует поиска, что не так уж и плохо, но, вероятно, не то, что git хочет включить в логику refspec.
Во всяком случае, я столкнулся с этим вопросом, потому что я просто хочу шагнуть вперед в истории по одному коммиту за раз, выполняя тесты, а иногда вам нужно шагать вперед, а не назад. Ну, подумав еще, я придумал это решение:
Выберите коммит вперед, где вы находитесь. Вероятно, это может быть глава филиала. Если вы находитесь на ветке ~ 10, то "git checkout branch ~ 9", затем "git checkout branch ~ 8", чтобы получить следующую после этого, затем "git checkout branch ~ 7" и так далее.
Уменьшение числа должно быть очень простым в сценарии, если вам это нужно. Намного проще, чем разбирать git rev-list.
источник
BRANCH=master; git co $BRANCH~$[ $(git rev-list HEAD..$BRANCH | wc -l) - 1 ]
" Вы должны идти к ветви, никак не обойти это.Два практических ответа:
Один ребенок
Основываясь на ответе @ Майкла , я взломал
child
псевдоним в моем.gitconfig
.Он работает как положено в случае по умолчанию, а также является универсальным.
По умолчанию он задает дочерний элемент HEAD (если не указан другой аргумент commit-ish), следуя шагу предка до кончика текущей ветви (если только в качестве второго аргумента не указан другой commit-ish).
Используйте
%h
вместо,%H
если вы хотите короткую форму хеша.Несколько детей
С отсоединенной ГОЛОВКОЙ (нет ветки) или чтобы получить всех детей независимо от ветки:
Измените на,
$1
чтобы$*
распечатать всех детей.Вы также можете изменить
--all
коммит, чтобы отображать только потомков, которые являются предками этого коммита, другими словами, отображать только потомков «в направлении» данного коммита. Это может помочь вам сузить вывод от многих детей до одного.источник
Не существует уникального «следующего коммита». Поскольку история в Git - это DAG, а не строка, многие коммиты могут иметь общего родителя (ветви), а коммиты могут иметь более одного родителя (слияния).
Если вы имеете в виду конкретную ветвь, вы можете посмотреть в ее журнале и посмотреть, в каком коммите указана текущая ветка в качестве ее родителя.
источник
<rev>^
является «родительским коммитом» («первый родительский» для коммитов слияния).Я пробовал много разных решений, и ни одно из них не помогло мне. Пришлось придумать свое.
найти следующий коммит
найти предыдущий коммит
источник
В том случае, если вы не имеете в виду конкретный «целевой» коммит, но вместо этого хотите увидеть дочерние коммиты, которые могут быть в любой ветви, вы можете использовать эту команду:
Если вы хотите увидеть всех детей и внуков , вы должны использовать
rev-list --children
рекурсивно, например так:(Версия, которая дает только внукам, будет использовать более сложную
sed
и / илиcut
.)Наконец, вы можете передать это в
log --graph
команду, чтобы увидеть древовидную структуру, вот так:Примечание : все приведенные выше команды предполагают, что вы установили переменную оболочки
${COMMIT}
для некоторой ссылки (branch, tag, sha1) коммита, чьи дочерние элементы вам интересны.источник
${COMMIT}
не важно, но вы могли бы использовать$(git rev-parse HEAD)
вместо этого${COMMIT}
.(Это началось как ответ на дубликат вопроса. Я сделал небольшое редактирование, чтобы очистить его.)
Все внутренние стрелки Git односторонние и направлены назад. Поэтому нет короткого удобного синтаксиса для продвижения вперед: это просто невозможно.
Это является возможным «двигаться против стрел», но способ сделать это удивительно , если вы еще не видели его раньше, и затем очевидно после этого. Допустим, у нас есть:
Используя,
middle~2
следует за стрелками дважды отC
спины кA
. Так как же мы переходим отC
кD
? Ответ: мы начинаемE
, используя имяlast
и работать в обратном направлении , пока не дойдем доmiddle
, записей точек , которые мы посещаем по пути . Затем мы просто движемся так далеко, как мы хотим, в направленииlast
: двигаться на один шагD
или на дваE
.Это особенно важно, когда у нас есть филиалы:
Какой коммит будет на один шаг после
C
? Там нет правильного ответа, пока вы не добавите к вопросу: в направлении признака ___ (заполните пробел).Чтобы перечислить коммиты между
C
(исключаяC
) себя и, скажемG
, мы используем:Это
--topo-order
гарантирует, что даже при наличии сложных ветвлений и слияний коммиты получаются в топологически отсортированном порядке. Это требуется только в том случае, если цепь не является линейной. В--ancestry-path
означает ограничение , что , когда мы работаем в обратном направлении отfeature2
, мы только список коммитов , которые имеют обязательство вC
качестве одного из своих предков. То есть, если график - или его часть в любом случае - на самом деле выглядит так:простой запрос формы
feature2..master
перечисляет коммитыJ
,G
иI
, и,F
иH
в некотором порядке. С--ancestry-path
нами выбиваемH
иI
: они не потомкиC
, только изA
. С помощью--topo-order
мы удостоверимся, что фактический порядок перечисленияJ
тогдаG
, потомF
.Команда
git rev-list
выдает эти хэш-идентификаторы на свой стандартный вывод, по одному на строку. Чтобы сделать шаг вперед в направленииfeature2
, то нам просто нужна последняя строка.Можно (и заманчиво, и полезно) добавить,
--reverse
чтобыgit rev-list
печатать коммиты в обратном порядке после их генерации. Это работает, но если вы используете его в конвейере, как это:чтобы просто получить «следующий коммит в направлении id2», и есть очень длинный список коммитов,
git rev-list
команда может получить прерванный канал, когда она пытается записать,head
который прекратил чтение своего ввода и завершился. Поскольку ошибки в сломанной трубе обычно игнорируются оболочкой, это в основном работает. Просто убедитесь, что они игнорируются при вашем использовании.Также заманчиво добавить
-n 1
вgit rev-list
команду вместе с--reverse
. Не делай этого! Это делаетgit rev-list
остановку после перехода на один шаг назад , а затем переворачивает список посещений (с одной записью). Так что это просто производит<id2>
каждый раз.Важное примечание
Обратите внимание, что с фрагментами графа «алмаз» или «бензольное кольцо»:
перемещая один совершает «вперед» от в
H
сторонуlast
получит Вас либоI
илиK
. С этим ничего не поделаешь: оба коммита на шаг впереди! Если вы затем начнете с полученного коммита и сделаете еще один шаг, то теперь вы привержены тому пути, на котором начали.Лекарство от этого состоит в том, чтобы не двигаться по одному шагу за раз и не зацикливаться на зависимых от пути цепях. Вместо этого, если вы планируете посетить всю цепочку пути предков, прежде чем делать что-либо еще , составьте полный список всех коммитов в цепочке:
Затем, посетите каждый коммит в этом списке, по одному, и вы получите всю цепочку.
--topo-order
Будет убедиться , что вы попалиI
-и-J
в таком порядке, иK
-и-L
в таком порядке (хотя нет никакого простого способа предсказать , будете ли вы сделать пару IJ до или после пары KL).источник
У меня есть этот псевдоним в
~/.gitconfig
источник
f()
? И это должно быть,head -1
чтобы быть первым ребенком, иначе это просто сообщит ГОЛОВУ.f()
. Да,head -1
это смелое предположение.nextref = "!f() { git log --reverse --ancestry-path --pretty=%H $1..HEAD | head -${2:-1} | tail -1; }; f"
чтобы вы могли выбрать, насколько далеко вперед, по желаниюМне удалось найти следующего ребенка следующим образом:
источник
Если все дочерние коммиты находятся в некоторой ветке, вы можете использовать
gitk --all commit^..
, где «коммит» - это что-то, идентифицирующее коммит. Например, если обозначение SHA-1 для фиксации - c6661c5, введитеgitk --all c6661c5^..
Вам, вероятно, потребуется ввести полный SHA-1 в ячейку gitk "SHA1 ID:". Вам понадобится полный SHA-1, который для этого примера можно получить через
git rev-parse c6661c5
В качестве альтернативы,
git rev-list --all --children | grep '^c6661c5883bb53d400ce160a5897610ecedbdc9d'
будет производиться строка, содержащая все дочерние элементы этого коммита, предположительно независимо от того, участвует ли ветвь.источник
Каждый коммит хранит указатель на своего родителя (родителей, в случае коммита (стандартного) коммита).
Таким образом, нет способа указать на дочерний коммит (если он есть) от родителя.
источник
Этот пост ( http://www.jayway.com/2015/03/30/using-git-commits-to-drive-a-live-coding-session/#comment-282667 ) показывает аккуратный способ, если делать это, если Вы можете создать четко определенный тег в конце стека фиксации. По сути,
git config --global alias.next '!git checkout `git rev-list HEAD..demo-end | tail -1`'
где «demo-end» является последним тегом.источник
Существующие ответы предполагают, что у вас есть ветка, содержащая коммит, который вы ищете.
В моем случае, коммит, который я искал, не был
git rev-list --all
включен, так как ни одна ветка не содержала его.Я закончил просматривать
gitk --reflog
вручную.Если вы не можете найти свой коммит даже в reflog, попробуйте либо:
git fsck --full
перечислить висячие (т.е. не в какой-либо ветке) коммиты, илиgit fsck --lost-found
сделать ссылки, указывающие на висячие коммиты, чтобы применить методы в других ответах.источник