当我启动a时git rebase -i
,我可以发出诸如git rebase --continue
或的命令git rebase --abort
。这些命令仅在进行基准变迁时才起作用。
我如何知道是否正在进行重新定基?
(我将不胜感激有关内部变基如何工作的一些细节; git对赋予其“正在变基”状态的存储库做了什么工作?)
当我启动a时git rebase -i
,我可以发出诸如git rebase --continue
或的命令git rebase --abort
。这些命令仅在进行基准变迁时才起作用。
我如何知道是否正在进行重新定基?
(我将不胜感激有关内部变基如何工作的一些细节; git对赋予其“正在变基”状态的存储库做了什么工作?)
Answers:
一方面,在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
。编码指南不鼓励使用
-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>
”。
也可以将错误重定向到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-m
为REBASE-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
在交互式重定基准期间的内容,在冲突期间可以暂停该内容。
git-rebase.sh
此答案中的代码,Git知道,如果.git
在存储库根目录下的文件夹中,存在目录rebase-merge
或目录rebase-apply
存在,则正在进行一个存储库。
(test -d "$(git rev-parse --git-path rebase-merge)" || test -d "$(git rev-parse --git-path rebase-apply)"
。这可以正确处理没有.git目录的工作树和异常或非标准布局,并且还允许您从工作目录的子目录运行此测试。
您还可以在中的__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
如果您有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.)
在彩色终端中,通知非常突出:
(eg help topic middle-of-rebase
显示文档“如何解决或中止不完整的变基”。)
我正在使用此命令 is_rebase=$(git status | grep "rebasing" | wc -l)
我没有看到清楚的说明,所以这里是:
在重新设定基准的过程中,如果正在进行中,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 status
如stackoverflow.com/questions/3921409/…