How to know if there is a git rebase in progress?
When I start a git rebase -i , I can issue commands like git rebase --continue , or git rebase --abort . Those commands only work if a rebase is in progress.
How can I know if there is a rebase in progress?
(I would greatly appreciate some details on how rebase works internally; what does git do to a repo that gives it the "rebase in progress" status,?)
For one thing, there is a ORIG_HEAD in place during a rebase (but that is not limited to the rebase command)
But you can also look at the 2010 Git 1.7.0 git-rebase.sh script itself (which is as "internal" as you can get ;) ).
Lines like those can give you another clue:
dotest="$GIT_DIR"/rebase-merge
test -d "$dotest" -o -d "$GIT_DIR"/rebase-apply || die "No rebase in progress?"
sabgenton comments:
rebase-apply seems to appear with rebase , rebase-merge shows up only with with rebase -i . And hippy also comments, in 2017, that:
The coding guidelines discourage the usage of -o (see Documentation/CodingGuidelines ), so the correct way now (2017, but also since 2011, Git 1.7.6) is:
(test -d ".git/rebase-merge" || test -d ".git/rebase-apply") || die "No rebase in progress?"
Jelaby suggests in the comments:
(test -d "$(git rev-parse --git-path rebase-merge)" ||
test -d "$(git rev-parse --git-path rebase-apply)" )
This correctly handles worktrees and unusual or non-standard layouts that don't have a .git directory, and also allows you to run this test from a subdir of the working directory.
That is because the git rev-parse --git-path <path> : does resolve " $GIT_DIR/<path> ".
Git 2.6+ (Q3 2015) will print more information during a rebase:
See commit 592e412, commit 84e6fb9 (06 Jul 2015), commit 84e6fb9 (06 Jul 2015), and commit df25e94, commit 05eb563 (30 Jun 2015) by Guillaume Pagès ( gitster ).
(Merged by Junio C Hamano -- gitster -- in commit 178d2c7, 03 Aug 2015)
status : give more information during rebase -i
git status gives more information during rebase -i , about the list of commands that are done during the rebase.
It displays:
It also gives hints to find the whole files in .git directory.
您还可以在contrib/completion/git-prompt.sh中的__git_ps1函数中检查这种检测方式, __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
If you have EasyGit, eg status will tell you:
$ 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.)
In a colored terminal, the notification is very prominent:

( eg help topic middle-of-rebase displays the documentation “How to resolve or abort an incomplete rebase”.)
