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”.)