git --no-pager show -s --format=%B $(git rev-parse develop)
Еще проще:
git --no-pager show -s --format=%B develop
or:
git --no-pager log --no-walk --format=%B develop
(show -s
и log --no-walk
почти одно и то же; ключевой момент здесь — отбросить ненужные git rev-parse
).
Но я не смог получить первую фиксацию в ветке develop
Первый коммит в этой ветке — master 1
или 27ee6b8
в вашем образе (идентификатор хэша будет меняться в зависимости от времени совершения коммита). Это также первый коммит в ветке master
.
Проблема здесь в том, что ветки не имеют «отправных точек». Ветви являются, в некотором смысле, структурой — фрагментом графа, — до которого можно добраться, начав с конечной точки и вернувшись к началу. Это означает, что некоторые коммиты находятся во многих ветках; как правило, коммит root, первый коммит, который вы делаете в репозитории, находится в каждой ветке (хотя в репозитории с несколькими корнями некоторые корни могут не находиться в некоторых ветках ).
имя ветки, как правило, за некоторыми исключениями, является синонимом концевого коммита в этой ветке, поэтому вам не нужен явный git rev-parse
. Однако ключевой особенностью имени ветки является то, что оно перемещается с течением времени, так что оно всегда называет окончательную фиксацию ветки.
См. также Что именно мы подразумеваем под ветвью?
Если вы хотите пометить какой-то конкретный коммит, чтобы запомнить его позже, обычным инструментом для этого является тег Git. Тег очень похож на имя ветки, поскольку он идентифицирует один конкретный коммит. Однако, в отличие от имени ветки, тег никогда не должен перемещаться, и Git не будет перемещать его автоматически.
git reflog expire --expire=now --all
Reflogs существуют специально для того, чтобы иметь возможность наблюдать за движением (с течением времени) ссылок. Журнал ссылок для ветки с таким названием, как develop
, по умолчанию сохраняет в течение 30 или 90 дней1 хэш-идентификаторы, которые develop
использовались для идентификации. По истечении срока их действия вы лишаетесь возможности вернуться в прошлое и посмотреть на develop@1
, develop@2
и так далее. Если бы вы сохранили их, вы могли бы поискать самые старые develop
из существующих. Это может быть, когда он родился, и вы часто можете сказать:
05d0c47 master@{37}: clone: from ...
(указывая, что master
родился в этот момент).
К сожалению, срок действия журналов ссылок действителен, поэтому это не совсем надежно. Тег надежен, но может раздражать, так как git log
будет украшать коммиты своими тегами. Если есть процедура для поиска интересного коммита, вы можете использовать ее. В этом случае существует есть такая процедура: вам нужны коммиты, которые были или были базами слияния слияния.
Чтобы найти базу слияния, найдите само слияние, затем найдите его родителей:
m=11c63bc # this is the merge
p1=$(git rev-parse ${m}^1)
p2=$(git rev-parse ${m}^2)
Теперь $p1
и $p2
являются двумя родителями этого слияния. (Слияние может иметь более двух родителей, но большинство слияний имеют только два.) Общая точка, где эти две ветви были объединены в последний раз, является базой слияния двух родителей:
git merge-base --all $p1 $p2
Поскольку существует только одна база слияния, это печатает только один хэш коммита. Если бы их было несколько, он напечатал бы их все, потому что мы использовали --all
. Опуская --all
, мы получим один, выбранный (очевидно) случайным образом (фактический выбор зависит от алгоритма, используемого для поиска баз слияния).
Как и прежде, не нужно много временных переменных — можно было бы сделать:
mbases=$(git merge-base --all ${m}^1 ${m}^2)
поскольку git merge-base
использует тот же синтаксис спецификатора фиксации, что и git rev-parse
: суффиксы ^1
и ^2
работают там одинаково (и действительно работают одинаково в большинстве команд Git).
1Срок действия можно настроить. Более короткое время, 30 дней по умолчанию, предназначено для хэш-идентификаторов, которые недоступны из текущего значения ссылки; более длинный 90-дневный срок по умолчанию предназначен для хэш-идентификаторов, которые доступны из текущего значения ссылки.
person
torek
schedule
15.03.2018