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

如何知道是否有正在进行的git rebase?,git,git-rebase,Git,Git Rebase,当我启动一个git-rebase-I时,我可以发出像git-rebase--continue或git-rebase--abort这样的命令。这些命令仅在重新基础正在进行时有效 我如何知道是否有正在进行的重设基准 (我非常希望您能提供一些关于再基础如何在内部运作的详细信息;git对赋予其“再基础进行中”状态的回购做了什么?)更新2021: 正如我在“”中提到的(2018年9月),git stash(和git rebase)不再只是脚本,而是用git.exe编译的二进制文件 这说明了如何仍然很难确定

当我启动一个
git-rebase-I
时,我可以发出像
git-rebase--continue
git-rebase--abort
这样的命令。这些命令仅在重新基础正在进行时有效

我如何知道是否有正在进行的重设基准

(我非常希望您能提供一些关于再基础如何在内部运作的详细信息;git对赋予其“再基础进行中”状态的回购做了什么?)

更新2021:

正如我在“”中提到的(2018年9月),
git stash
(和
git rebase
)不再只是脚本,而是用
git.exe
编译的二进制文件

这说明了如何仍然很难确定是否正在进行调整

这在邮件列表中讨论过,导致类似“”的补丁:

由于引入了
git-rebase-r
,这是可能的。
但是我们的机器并不认为这是可能的,在合并的过程中,我们没有谈到任何正在进行的调整。

在此之前(2016年)有一个“正在进行再基础”检测的案例,带有“”

此函数
find\u shared\u symref()
用于以下几个位置:

  • 内置/branch.c
    中:用于检测分支是否在其他地方签出并拒绝删除该分支
  • builtin/notes.c
    中:用于检测一个注释是否合并到另一个工作树中
  • branch.c
    中,“
    git checkout
    ”和“
    git worktree add
    ”实际使用函数
    die\u if\u checked\u out()
    ”来查看分支是否已在别处签出并拒绝操作
  • 在案例1和案例3中,如果正在进行重基,“头部”将处于分离模式
    find_shared_symref()
    无法检测到它,并声明“
    此处未签出分支
    ”,这并不是我们真正想要的


    原始答复:2010年

    首先,在rebase过程中就位(但不限于rebase命令)

    但是你也可以看看2010年Git 1.7.0本身(你可以看到它是“内部的”)。
    这样的句子可以给你另一个线索:

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

    • 文件夹
      rebase apply
      似乎与
      rebase
      一起出现
    • 但是文件夹
      rebase merge
      仅显示with
      rebase-i
    此外,2017年:

    编码指南不鼓励使用
    -o
    (请参阅),因此正确的方法是:

    建议:

    这将正确处理没有
    .git
    目录的工作树和异常或非标准布局,还允许您从工作目录的子目录运行此测试

    这是因为:确实解析“
    $GIT\u DIR/

    并补充说:

    也可以将错误重定向到null:

    (test -d "$(git rev-parse --git-path rebase-merge)" || test -d "$(git rev-parse --git-path rebase-apply) 2>/dev/null"
    

    Git 2.6+(2015年第3季度)将在重定基础期间打印更多信息:

    参见(2015年7月6日),(2015年7月6日)和(2015年6月30日)作者。
    (于2015年8月3日合并)

    status
    :在
    rebase-i期间提供更多信息
    
    git status
    rebase-i
    期间提供了有关在rebase期间执行的命令列表的更多信息。
    它显示:

    • 执行的最后两个命令和
    • 接下来要执行的两行
    它还提供了在
    .git
    目录中查找整个文件的提示


    尝试并检测提示在Git 2.26+上不起作用,如中所示

    git-rebase
    ”已经学会了默认情况下使用合并后端(即驱动“
    rebase-i
    ”的机器),同时允许“
    --apply
    ”选项使用“
    apply
    ”后端(例如,道德上等同于“
    格式补丁通过管道传输到am
    ”。
    (可以将
    rebase.backend
    配置变量设置为自定义。)

    参见,,,,,,,,,(2020年2月15日)和,(2020年1月16日)的作者。
    (于2020年3月2日合并)

    git提示符
    :更改基于交互的回扣提示 过去,我们对不同类型的折扣有不同的提示:

    REBASE: for am-based rebases
    REBASE-m: for merge-based rebases
    REBASE-i: for interactive-based rebases
    
    不清楚为什么这种区分是必要的或有用的;当 在提交中添加了提示(“改进bash提示以检测 不同的状态如未完成的合并”,2007-09-30,Git v1.5.5-rc0),它只是简单地添加了这三种不同的类型。
    当时或许有一个有用的目的,但也有一些变化:

    • 合并后端在交互式后端之上实现后被删除,导致基于合并的重新基准提示从
      REBASE-m
      更改为
      REBASE-i
    • 交互式后端用于多种不同类型的非交互式回扣,因此提示的“
      -i
      ”部分实际上并不意味着它以前的意思
    • 再基地后端获得了更多的能力,有大量的重叠,有时很难区分它们
    • 后端之间的行为差异也已消除
    • 我们希望将默认后端从am更改为interactive,这意味着如果我们不更改提示,人们将在默认情况下得到“
      REBASE-i
      ”,并且只有当他们指定了
      --am
      --whitespace
      -C
      时,他们才会得到“
      REBASE
      ”提示
    • 在未来,我们计划让“
      --whitespace
      ”、“
      -C
      ”,甚至“
      --am
      ”运行交互式后端,只要它能够处理
      am后端所能处理的一切
    出于所有这些原因,只需将任何类型的rebase的提示设置为“
    rebase


    ,你还有:

    git rebase --show-current-patch
    
    它显示交互式重基期间
    .git/REBASE\u HEAD的内容,该重基可以
    
    REBASE: for am-based rebases
    REBASE-m: for merge-based rebases
    REBASE-i: for interactive-based rebases
    
    git rebase --show-current-patch
    
    $ cat .git/rebase-merge/done 
    pick 786139e lrg
    edit 668b8a6 ktio
    $ 
    
    $ cat .git/rebase-merge/done 
    cat: .git/rebase-merge/done: No such file or directory
    $ 
    
    $ 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.)
    
    ls `git rev-parse --git-dir` | grep rebase
    
    ls `git rev-parse --git-dir` | grep rebase || echo no rebase
    
    interactive rebase in progress; onto 5f8e534
    Last command done (1 command done):
       pick 1b7a450 BRANCH: another comment
    No commands remaining.
    You are currently rebasing branch 'rbBr' on '5f8e534'.
      (fix conflicts and then run "git rebase --continue")
      (use "git rebase --skip" to skip this patch)
      (use "git rebase --abort" to check out the original branch)
    
    Unmerged paths:
      (use "git restore --staged <file>..." to unstage)
      (use "git add <file>..." to mark resolution)
            both modified:   User.java
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    interactive rebase in progress; onto 5f8e534
    Last command done (1 command done):
       pick 1b7a450 BRANCH: another comment
    No commands remaining.
    You are currently rebasing branch 'rbBr' on '5f8e534'.
      (all conflicts fixed: run "git rebase --continue")
    
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   User.java
    
    PS C:\my_git_repos\learning_git> git rebase --continue                                                                                                                                                                                       [detached HEAD 9645135] BRANCH: another comment
     1 file changed, 1 insertion(+)
    Successfully rebased and updated refs/heads/rbBr.