如何知道是否有git rebase正在进行?

当我启动git rebase -i ,我可以发出诸如git rebase --continuegit rebase --abort 。 这些命令只有在进行重新绑定时才有效。

我怎样才能知道是否有一个正在改变?

(我将非常感谢一些关于rebase如何在内部工作的细节; git对回购有什么作用,使它具有“正在进行中的rebase”状态,?)

首先,在rebase期间有一个ORIG_HEAD (但不限于rebase命令)

但是你也可以看一下2010 Git 1.7.0 git-rebase.sh脚本本身(就像你可以得到的“内部”一样))。
像那些线可以给你另一个线索:

 dotest="$GIT_DIR"/rebase-merge test -d "$dotest" -o -d "$GIT_DIR"/rebase-apply || die "No rebase in progress?" 

sabgenton 评论 :

  • 文件夹rebase-apply似乎与rebase
  • 但文件夹重新rebase-merge只显示与rebase -i

嬉皮士也在2017年评论说:

编码指南不鼓励使用-o (请参阅Documentation/CodingGuidelines ),所以现在(2017,也是从2011年开始,Git 1.7.6)的正确方法是:

 (test -d ".git/rebase-merge" || test -d ".git/rebase-apply") || die "No rebase in progress?" 

杰拉比 在评论中build议:

 (test -d "$(git rev-parse --git-path rebase-merge)" || test -d "$(git rev-parse --git-path rebase-apply) 

这样可以正确处理没有.git目录的工作树和非常规或非标准布局,并且还允许您从工作目录的子目录运行此testing。

这是因为git rev-parse --git-path <path> :确实parsing了“ $GIT_DIR/<path> ”。


Git 2.6+(2015年第三季度)将会在更新期间打印更多信息:

请参阅提交592e412 , 提交84e6fb9 (2015年7月6日), 提交84e6fb9 (2015年7月6日),并提交由GuillaumePagès( gitster ) 提交的df25e94 , 提交05eb563 (2015年6月30日) 。
(由Junio C gitster合并- gitster -在提交178d2c7 ,2015年8月3日)

status :在rebase -i期间提供更多信息

git statusrebase -i给出了更多的信息,关于rebase期间完成的命令列表。
它显示:

  • 最后两个执行的命令
  • 接下来的两行将被执行。

它也提供了在.git目录中查找整个文件的提示。

您也可以在contrib/completion/git-prompt.sh中的__git_ps1函数中检查这种检测方式,它可以用于git-aware bash提示符:

  if [ -f "$g/rebase-merge/interactive" ]; then r="|REBASE-i" b="$(cat "$g/rebase-merge/head-name")" elif [ -d "$g/rebase-merge" ]; then r="|REBASE-m" b="$(cat "$g/rebase-merge/head-name")" else if [ -d "$g/rebase-apply" ]; then if [ -f "$g/rebase-apply/rebasing" ]; then r="|REBASE" elif [ -f "$g/rebase-apply/applying" ]; then r="|AM" else r="|AM/REBASE" fi 

如果你有EasyGit , eg status会告诉你:

 $ eg status (Not currently on any branch.) (YOU ARE IN THE MIDDLE OF A INTERACTIVE REBASE; RUN 'eg help topic middle-of-rebase' FOR MORE INFO.) Changes ready to be committed ("staged"): modified: .gitmodules renamed: config_loader.rb -> code/config_loader.rb Newly created unknown files: vendor/ (YOU ARE IN THE MIDDLE OF A INTERACTIVE REBASE; RUN 'eg help topic middle-of-rebase' FOR MORE INFO.) 

在彩色terminal上,通知非常突出:

<code>例如状态</ code>中间的rebase示例截图

eg help topic middle-of-rebase显示文档“ 如何解决或中止不完整的资产重置 ”)。

如果正在进行互动式重新贷款,这将告诉您在这个过程中:

 $ cat .git/rebase-merge/done pick 786139e lrg edit 668b8a6 ktio $ 

现在我正在编辑交互式底座的“ktio”补丁。

如果没有发生重build,它将如下所示:

 $ cat .git/rebase-merge/done cat: .git/rebase-merge/done: No such file or directory $ 

从bash命令行:

 ls `git rev-parse --git-dir` | grep rebase 

这将返回退出代码0(成功),如果有一个rebase文件夹,它会输出rebase文件夹到STDOUT。 如果你不在 rebase的中间,那么它将不输出任何内容,并返回非零的退出代码。 所以你甚至可以做这样的事情:

 ls `git rev-parse --git-dir` | grep rebase || echo no rebase