Git pushd & popd?Т.е. оформить заказ в последнем состоянии - PullRequest
13 голосов
/ 01 марта 2011

Я пишу сценарий Bash и хочу извлечь тег, а затем вернуться обратно к тому, с чего начал.

Я пытался git co HEAD@{1}, но при запуске на мастере это возвращает меня к SHA коммита мастера, но с отсоединенной головой.

Есть ли что-то вроде pushd & popd для Git?

Ответы [ 3 ]

24 голосов
/ 01 марта 2011

git checkout @{-1}, который может быть сокращен до git checkout -.

С man-страницы:

В качестве особого случая "@ {-N} "Синтаксис для N-й последней ветви проверяет ветку (вместо отсоединения).Вы также можете указать - что является синонимом "@ {- 1}".

4 голосов
/ 01 марта 2011

РЕДАКТИРОВАТЬ: Предложение wnoise будет работать, если вы не хотите сохранять явную историю, как pushd / popd.Если вы делаете (и не хотите, чтобы обычный checkout влиял на вашу LRU):

Я не знаю ничего, что будет делать то, что вы хотите, из коробки, но это не сложновзломайте что-нибудь по этим направлениям.Если вы добавите файл с именем git-foo в PATH, вы получите новую команду git foo.Итак, git-pushd может выглядеть так:

#!/bin/bash

SUBDIRECTORY_OK=1
. $(git --exec-path)/git-sh-setup

git symbolic-ref HEAD | sed s_refs/heads/__ >> $GIT_DIR/.pushd
git checkout "$@"

И git-popd:

#!/bin/bash

SUBDIRECTORY_OK=1
. $(git --exec-path)/git-sh-setup

REF=$(head -n1 $GIT_DIR/.pushd)

[ -n "$REF" ] || die "No refs to pop"
git checkout "$REF" && sed -i -e '1d' $GIT_DIR/.pushd
0 голосов
/ 01 марта 2011

В вашем скрипте сначала сохраните текущую ветку (как написано в этот ответ ):

branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)"     # detached HEAD
branch_name=${branch_name##refs/heads/}

, затем перейдите и извлеките нужный тег

git checkout -b tag_branch tag_name

Сделайте то, что вы хотите сделать с этой веткой, затем снова извлеките старую ветку:

git checkout $branch_name

Вот и все.

...