Программно получить ревизию, к которой будет переходить git, с помощью `git checkout -` - PullRequest
0 голосов
/ 25 апреля 2018

Если я использую git checkout -, git вернется к той ревизии, в которой я был раньше. Это верно, если это был отсоединенный HEAD (в этом случае HEAD будет отсоединен в той же ревизии) или ветвь (в этом случае HEAD вернется к тому, чтобы быть в этой ветке).

Мне бы хотелось узнать ревизию, в которой я только что находился, - тот самый мерзавец, к которому я могу перейти, если я его запусту, в идеале, без фактического изменения HEAD.

Так что, если бы HEAD был последним в ветви, я бы хотел получить название этой ветви; и если это не так, я бы хотел получить SHA этого коммита.

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

Если вы имеете в виду, что хотите иметь возможность читать некоторые выходные данные, чтобы вы, как пользователь, знали, что будет делать git checkout -, тогда вы можете сделать

git reflog

и он обычно скажет вам правильную вещь. Он покажет HEAD reflog, с выводом вроде

c5d4ede HEAD@{0}: checkout: moving from master to branch
38c594f HEAD@{1}: checkout: moving from branch to master
c5d4ede HEAD@{2}: checkout: moving from 
c5d4ede3ffa2633bd7b8b0f19a100832a3b3ac86 to branch
c5d4ede HEAD@{3}: checkout: moving from master to HEAD^
38c594f HEAD@{4}: commit: 2
c5d4ede HEAD@{5}: commit (initial): 1

Вы можете видеть, что HEAD@{1} - это то, что было в последний раз извлечено, сокращенный хэш для фиксации - 38c594f, и на основании описания должно быть, что master был извлечен.

Однако есть одна маленькая проблема. В этом случае вывод не показывает, переместился ли master с тех пор, как вы включили master. Существует не так много способов, но если вам нужно быть уверенным, а рефлог HEAD показывает, что ветка будет проверена, то вы должны выполнить

git reflog master

чтобы увидеть, где сейчас находится * 1022; потому что git checkout - будет извлекать ветвь, а не конкретную фиксацию, в этой ситуации.

(В случае, если HEAD@{1} показывает, что вы были в отключенном состоянии, вам не нужно беспокоиться о возможных перемещениях веток, и вы знали бы, что chekcout - приведет вас к коммиту, указанному в журнале. )

Если вы хотите что-то для сценария, это более сложная проблема. Вы можете получить идентификатор коммита, с которым вы были

git rev-parse HEAD@{1}

Но знать, в какой ветке вы находитесь, не так просто (потому что коммит может иметь ноль, одну или несколько веток, указывающих на него), и не зная, в какой ветке вы были, вы не можете знать, могла ли ветвь переехали.

Кажется, что git способен понять это при выполнении checkout, но что касается "как", мы достигли грани моих знаний. Очевидный ответ - использовать reflog, но я не вижу ничего, что выглядит достаточно структурированным в файлах reflog, чтобы это было правильно.

0 голосов
/ 25 апреля 2018

@{-1} соответствует пересмотру процентов.На справочной странице git-checkout:

Синтаксис @{-N} можно использовать для ссылки на N-ую последнюю ветвь / фиксацию, извлеченную с использованием операции git checkout. Вы также можете указать -, который является синонимом @{-1}.

(выделено мной)

Однако, можете ли вы восстановить имя или нетветки (если есть), которая была в последний раз проверена, мне неясно.На справочной странице git-reflog упоминается, что

HEAD reflog записывает переключение веток

, но Git, по-видимому, не предоставляет никаких функций для доступа к этой информации...

0 голосов
/ 25 апреля 2018

Другая возможность - использовать rev-parse --symbolic-full-name, хотя это означает манипулирование выходом для удаления начальных refs/head/

get_last_head() {
    local REV=$(
        git rev-parse --symbolic-full-name @{-1} |
        sed -re 's%^refs/heads/%%' # Not sure how safe this is
    );
    if [ -z "$REV" ]; then REV=$(git rev-parse HEAD); fi
    echo $REV;
}
0 голосов
/ 25 апреля 2018

Что стоит, вот как это сделать, если изменение положения HEAD не является дисквалифицирующим фактором.

get_last_head() { 
  local REV; 
  git checkout -q -; 
  REV=$(git symbolic-ref --short -q HEAD) || 
  REV=$(git rev-parse HEAD); 
  git checkout -q -; 
  echo $REV; 
}; 
get_last_head
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...