Git pushd和popd?一、 e.检查最后状态

7uzetpgm  于 2022-10-23  发布在  Git
关注(0)|答案(4)|浏览(199)

我正在写一个Bash脚本,我想 checkout 一个标记,然后再签回我开始的地方。
我尝试了git co HEAD@{1},但当我从master开始时,这会让我回到master的commit SHA,但我的头已脱落。
Git有类似pushdpopd的东西吗?

mec1mxoz

mec1mxoz1#

git checkout @{-1},可以缩写为git checkout -
From the manpage:
作为一种特殊情况,最后第N个分支的“@{-N}”语法将检出该分支(而不是分离)。您还可以指定-,它与“@{-1}”同义。

dsekswqp

dsekswqp2#

  • 编辑:如果你不想像pushd/popd那样保留明确的历史记录,那么wnoise的建议会起作用。如果您这样做(并且不希望普通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
kh212irz

kh212irz3#

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

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

然后去 checkout 你想要的标签

git checkout -b tag_branch tag_name

在该分支上执行您想执行的操作,然后再次 checkout 旧分支:

git checkout $branch_name

就是这样。

szqfcxe2

szqfcxe24#

您还可以使用别名和**/tmp/gitStack**作为临时文件来跟踪堆栈。
查看我制作的主要别名:

[alias]
  pushd         = "!f() { _BRANCH=$(git symbolic-ref head); _BRANCH=${_BRANCH#'refs/heads/'}; echo $_BRANCH >> /tmp/gitStack; git checkout $@;}; f "
  pop           = "!f() { _BRANCH=$(tail -1 /tmp/gitStack); git checkout ${_BRANCH%*:}; head -n+1 /tmp/gitStack > /tmp/_gitStack; mv /tmp/_gitStack /tmp/gitStack; }; f"
  pop-clear     = "!f() { rm /tmp/gitStack; }; f"
  pop-list      = "!f() { cat /tmp/gitStack 2> /dev/null; }; f"

相关问题