Lorsque je lance un git rebase -i
, je peux émettre des commandes telles que git rebase --continue
ou git rebase --abort
. Ces commandes ne fonctionnent que si un rebase est en cours.
Comment puis-je savoir s'il y a un rebase en cours?
(J'apprécierais beaucoup quelques détails sur le fonctionnement interne de rebase; que fait git pour un repo qui lui donne le statut "rebase en cours" ,?)
D'une part, il y a un ORIG_HEAD
en place pendant un rebase (mais cela ne se limite pas à la commande rebase)
Mais vous pouvez aussi regarder le Git 1.7.0 2010 git-rebase.sh
script lui-même (qui est aussi "interne" que vous pouvez obtenir;)).
Des lignes comme celles-là peuvent vous donner un autre indice:
dotest="$GIT_DIR"/rebase-merge
test -d "$dotest" -o -d "$GIT_DIR"/rebase-apply || die "No rebase in progress?"
rebase-apply
semble apparaître avec rebase
, rebase-merge
apparaît uniquement avec avec rebase -i
.Et hippie aussi commentaires , en 2017, que:
Les directives de codage découragent l'utilisation de
-o
(voirDocumentation/CodingGuidelines
), donc la bonne manière maintenant (2017, mais aussi depuis 2011, Git 1.7.6) est:
(test -d ".git/rebase-merge" || test -d ".git/rebase-apply") || die "No rebase in progress?"
Jelaby suggère dans les commentaires :
(test -d "$(git rev-parse --git-path rebase-merge)" || \
test -d "$(git rev-parse --git-path rebase-apply)" )
Cela gère correctement les arbres de travail et les dispositions inhabituelles ou non standard qui ne possèdent pas de répertoire
.git
et vous permet également d'exécuter ce test à partir d'un sous-répertoire du répertoire de travail.
En effet, le git rev-parse --git-path <path>
: résout "$GIT_DIR/<path>
".
Git 2.6+ (T3 2015) affichera plus d'informations lors d'une nouvelle base:
Voir commit 592e412 , commit 84e6fb9 (06 juil. 2015), commit 84e6fb9 (06 juil. 2015), et commit df25e94 , commit 05eb563 (30 juin 2015 ) de Guillaume Pagès (gitster
) .
(Fusion par Junio C Hamano - gitster
- in commit 178d2c7 , 03 août 2015)
status
: donne plus d'informations pendantrebase -i
git status
donne plus d'informations au cours derebase -i
, sur la liste des commandes effectuées lors de la création d'une nouvelle base.
Il affiche:
- les deux dernières commandes exécutées et
- les deux prochaines lignes à exécuter.
Il donne également des astuces pour trouver tous les fichiers dans le répertoire
.git
.
Vous pouvez également vérifier comment cette détection est effectuée dans la fonction __git_ps1
DANS contrib/completion/git-Prompt.sh
, qui peut être utilisée pour l'invite bash git-aware:
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
Si vous avez EasyGit , eg status
vous dira:
$ 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.)
Dans un terminal coloré, la notification est très importante:
(eg help topic middle-of-rebase
affiche la documentation " Comment résoudre ou abandonner une rebase incomplète ".)
Si un rebase interactif est en cours, cela vous indiquera où vous en êtes:
$ cat .git/rebase-merge/done
pick 786139e lrg
edit 668b8a6 ktio
$
En ce moment, je suis en train d’éditer le patch “ktio” dans une base interactive.
S'il n'y a pas de rebase en cours, cela ressemblera à ceci:
$ cat .git/rebase-merge/done
cat: .git/rebase-merge/done: No such file or directory
$
A partir d'une ligne de commande bash:
ls `git rev-parse --git-dir` | grep rebase
Cela retournera le code de sortie 0 (succès) s'il y a un dossier rebase, et le dossier sera renvoyé à STDOUT. Si vous êtes pas au milieu d'une base, alors rien ne sera généré et le code de sortie non nul sera renvoyé. Donc, vous pouvez même faire quelque chose comme ça:
ls `git rev-parse --git-dir` | grep rebase || echo no rebase
J'utilise cette commande is_rebase=$(git status | grep "rebasing" | wc -l)