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


68

当我启动a时git rebase -i,我可以发出诸如git rebase --continue或的命令git rebase --abort。这些命令仅在进行基准变迁时才起作用。

我如何知道是否正在进行重新定基?

(我将不胜感激有关内部变基如何工作的一些细节; git对赋予其“正在变基”状态的存储库做了什么工作?)

Answers:


54

一方面,在rebase期间有一个ORIG_HEAD适当的位置(但不仅限于rebase命令)

但是您也可以查看2010 Git 1.7.0git-rebase.sh脚本本身(您可以获取为“ internal”;))。
像这样的行可以给您另一个线索:

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

萨布根顿 评论

  • 该文件夹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?"

耶拉比在评论中建议:

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

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

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

Elizandro-SparcBR在评论中添加:

也可以将错误重定向到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季度)将在调整基准期间打印更多信息:

提交592e412提交84e6fb9(2015年7月6日),提交84e6fb9(2015年7月6日),以及提交df25e94提交05eb563(二〇一五年六月三十日)由纪尧姆页(gitster
(通过合并JUNIOÇ滨野- gitster-提交178d2c7,2015年8月3日)

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

git status在期间提供了更多有关rebase -i在调整基准期间完成的命令列表的信息。
它显示:

  • 最后执行的两个命令和
  • 接下来的两行要执行。

它还提示在.git目录中查找整个文件。


尝试并检测到提示不适用于Git 2.26+,如提交6d04ce7所示

git rebase”已经学会rebase -i了默认使用合并后端(即驱动“ ”的机器),同时允许使用“ --apply”选项使用apply后端(例如道德上等同于“ format-patch piped to am”)。
rebase.backend可以将配置变量设置为定制。)

提交10cdb9f提交2ac0d62提交8295ed6提交76340c8提交980b482提交c2417d3提交6d04ce7提交52eb738提交8af14f0提交be50c93提交befb89c提交9a70f3d提交93122c9提交55d2b6d提交8a997ed提交7db00f0提交e98c426提交d48e5e2(2020年2月15日),提交a9ae8fd提交22a69fd(2020年1月16日)通过Elijah Newren(newren
(通过合并JUNIOÇ滨野- gitster-提交8c22bd9,2020年3月2日)

git-prompt:更改提示以基于交互式的基础

过去,对于不同类型的rebase,我们有不同的提示:

REBASE: for am-based rebases
REBASE-m: for merge-based rebases
REBASE-i: for interactive-based rebases

目前尚不清楚为什么这种区别是必要的还是有用的。当在commit e752019中添加提示时(“改进bash提示以检测各种状态,例如未完成的合并”,2007-09-30,Git v1.5.5-rc0),它只是添加了这三种不同的类型。
那时也许有一个有用的目的,但是却发生了一些变化:

  • 在交互式后端之上实施后,合并后端被删除,从而导致基于合并的基准的提示从更改REBASE-mREBASE-i
  • 交互式后端用于多种不同类型的非交互式资源库,因此-i提示的“ ”部分实际上并不意味着它曾经使用过。
  • Rebase后端已经获得了更多的功能,并且有很多重叠之处,有时很难区分它们。
  • 后端之间的行为差​​异也已消除。
  • 我们希望从上午默认后端更改为交互式,这意味着人们将获得“ REBASE-i”在默认情况下,如果我们不改变提示,只有当他们指定--am--whitespace-C他们将获得“ REBASE”的提示。
  • 将来,我们计划让“ --whitespace”,“ -C”甚至“ --am”一旦能够处理所有罐子就运行交互式后端am-backend

由于所有这些原因,使任何类型的变基提示都只是“ REBASE”。


自Git 2.17(2018年3月)以来,您还具有:

git rebase --show-current-patch

它显示了.git/REBASE_HEAD在交互式重定基准期间的内容,在冲突期间可以暂停该内容。


5
git-status不应该告诉你吗?
cmcginty 2010年

5
从1.7.3.1版的git版本开始,git status并没有说明任何变基状态。
Olivier Verdier

4
然而,EasyGiteg status 告诉你
罗里·奥肯

2
解释git-rebase.sh此答案中的代码,Git知道,如果.git在存储库根目录下的文件夹中,存在目录rebase-merge或目录rebase-apply存在,则正在进行一个存储库。
罗里·奥凯恩

2
在Git 2.7或更早的版本中,您可以使用(test -d "$(git rev-parse --git-path rebase-merge)" || test -d "$(git rev-parse --git-path rebase-apply)"。这可以正确处理没有.git目录的工作树和异常或非标准布局,并且还允许您从工作目录的子目录运行此测试。
耶拉比

18

您还可以在中的__git_ps1函数中contrib/completion/git-prompt.sh检查如何进行这种检测,该函数可用于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
                        fi
                fi

4

如果正在进行交互式基础更改,它将告诉您过程中的位置:

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

现在,我正在交互式基础中编辑“ ktio”补丁。

如果没有进行任何基准调整,则它将如下所示:

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

4

从bash命令行:

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

如果存在一个rebase文件夹,它将返回退出代码0(成功),并将该rebase文件夹输出到STDOUT。如果您不在rebase中间,那么它将不输出任何内容并返回非0退出代码。因此,您甚至可以执行以下操作:

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

3

如果您有EasyGiteg 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.)

在彩色终端中,通知非常突出:

<code> eg status </ code>基础中间演示屏幕截图

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


2

我正在使用此命令 is_rebase=$(git status | grep "rebasing" | wc -l)


2
这是坏掉的:如果您有一个包含“重新设置基准”的脏文件,即使您没有,它也会打印出您正在重新定义基准。
CLOVIS '04

0

我没有看到清楚的说明,所以这里是:

在重新设定基准的过程中,如果正在进行中,git status现在已经足够了,因为它可以提供信息(供参考,我将头分支称为master和的枫树分支rbBr):

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.

正确,但不适用于脚本:git statusstackoverflow.com/questions/3921409/…
VonC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.