15

我正在编写一个 Bash 脚本,我想签出一个标签,然后签出回到我开始的地方。

我试过git co HEAD@{1}了,但是当从 master 开始时,这让我回到了 master 的提交 SHA,但头却是分离的。

Git有类似pushd&的东西吗?popd

4

3 回答 3

27

git checkout @{-1}可以简写为git checkout -

从手册页:

作为一种特殊情况,第 N 个最后一个分支的“@{-N}”语法检出分支(而不是分离)。您也可以指定 - 与“@{-1}”同义。

于 2011-03-01T05:53:40.553 回答
4

编辑:如果您不想像 pushd/popd 那样保留明确的历史记录,wnoise 的建议将起作用。如果你这样做(并且不希望普通checkout影响你的 LRU):

我不知道有什么东西可以开箱即用,但是按照这些思路将某些东西拼凑起来并不难。如果您将一个名为PATH 的文件添加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
于 2011-03-01T05:56:05.550 回答
0

在您的脚本中,首先保存当前分支(如在此答案中所写):

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

就是这样。

于 2011-03-01T05:52:27.697 回答