73

を起動すると、 や などのgit rebase -iコマンドを発行できます。これらのコマンドは、リベースが進行中の場合にのみ機能します。git rebase --continuegit rebase --abort

リベースが進行中かどうかを知るにはどうすればよいですか?

(リベースが内部でどのように機能するかについての詳細を大いに感謝します。「リベースが進行中」のステータスを与えるレポに対してgitは何をしますか?)

4

8 に答える 8

53

2021 年更新:

git stash「Windows では遅い」で述べたように、Git for Windows 2.19 (2018 年 9 月) では、git stash(およびgit rebase) はスクリプトのみではなく、実際には でコンパイルされたバイナリgit.exeです。

Tim回答は、リベースが進行中かどうかを確認することが依然として難しいことを示しています。

これはメーリング リストで議論され、「 :status同時に進行中の可能性があるrebase」ようなパッチにつながりました。merge

が導入されたのでgit rebase -r、それは可能です。
しかし、私たちの機械はそれが可能だとは考えておらず、マージの最中に進行中のリベースについては何も言いませんでした.

それ以前(2016年)に「リベース進行中」を検出するケースがあり、「worktree.c: ブランチが別のワークツリーでリベースされているかどうかを確認する

この関数find_shared_symref()は、いくつかの場所で使用されます。

  1. in builtin/branch.c: ブランチが他の場所でチェックアウトされているかどうかを検出し、ブランチの削除を拒否するために使用されます。
  2. in builtin/notes.c: メモが別のワークツリーにマージされているかどうかを検出するために使用されます
  3. ではbranch.c、関数は " " と " "die_if_checked_out()によって実際に使用され、ブランチが既に他の場所でチェックアウトされているかどうかを確認し、操作を拒否します。git checkoutgit worktree add

ケース 1 と 3 で、リベースが進行中の場合、「HEAD」は分離モードになります
find_shared_symref()はそれを検出できず、" " を宣言しますがno branch is checked out here、これは実際には望んでいるものではありません。


元の回答: 2010

1つには、リベース中にインプレースがありますORIG_HEAD(ただし、これはリベース コマンドに限定されません)。

git-rebase.shしかし、2010 Git 1.7.0スクリプト自体を見ることもできます(これは可能な限り「内部」です ;))。
これらのような行は、別の手がかりを与えることができます:

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

サブゲントンの コメント:

  • フォルダrebase-applyrebase
  • しかし、フォルダーrebase-mergeは with でのみ表示されますrebase -i

また、ヒッピーは2017 年に次のようにコメントしています。

コーディング ガイドラインでは-o(を参照) の使用が推奨されていないため、現在 (2017 年、2011 年以降は Git 1.7.6)Documentation/CodingGuidelinesの正しい方法は次のとおりです。

(test -d ".git/rebase-merge" || test -d ".git/rebase-apply") || die "No rebase in progress?"

Jelabyはコメントで次のように提案しています。

(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 2015 年 6 月 30 日) を参照してください。
( 2015 年 8 月 3 日にコミット 178d2c7Junio C Hamanoによってマージされました)gitster

status: より詳しい情報を提供してくださいrebase -i

git statusrebase -iでは、リベース中に実行されるコマンドのリストに関する詳細情報を提供します。
以下が表示されます。

  • 最後に実行された 2 つのコマンドと
  • 次の 2 行が実行されます。

.gitまた、ディレクトリ内のファイル全体を見つけるためのヒントも提供します。


commit 6d04ce7に示されているように、Git 2.26+ ではプロンプトの試行と検出が機能しません。

" " はデフォルトでgit rebaseマージ バックエンド (つまり " " を駆動する機械) を使用することを学習しましたが、 " " オプションで " " バックエンド (たとえば、道徳的に " " に相当するもの) を使用できるようにしました。 (構成変数はカスタマイズするように設定できます。)rebase -i--applyapplyformat-patch piped to am
rebase.backend

10CDB9Fのコミット、コミット2AC0D62、コミット8295ED6、コミット76340C8 コミット980B482 C2417D3コミットコミット6D04CE7 、コミット52EB738コミット85553コミット9コミットメント9.コミット9のコミットメントを参照してくださいe98c426コミット d48e5e2 (2020 年 2 月 15 日)、コミット a9ae8fdコミット 22a69fd(2020 年 1 月 16 日) Elijah Newren 著 ( newren) .
( 2020 年 3 月 2 日、コミット 8c22bd9Junio C Hamanoによってマージされました)gitster

git-prompt: 対話ベースのリベースのプロンプトを変更します

以前は、さまざまなタイプのリベースに対してさまざまなプロンプトが表示されていました。

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

なぜこの区別が必要だったのか、または役に立ったのかは明らかではありません。コミットe752019 (「未完了のマージなどのさまざまな状態を検出するための bash プロンプトの改善」、2007-09-30、Git v1.5.5-rc0) でプロンプトが追加されたとき、これら 3 つの異なるタイプが単純に追加されました。
当時は便利な目的があったのかもしれませんが、いくつかの変更が加えられています。

  • インタラクティブなバックエンドの上に実装された後、マージ バックエンドが削除されたため、マージベースのリベースのプロンプトが から に変更されREBASE-mましたREBASE-i
  • 対話型バックエンドは、複数の異なるタイプの非対話型リベースに使用されるため-i、プロンプトの " " 部分は、以前の意味とは異なります。
  • Rebase バックエンドはより多くの機能を獲得し、多くのオーバーラップを持っているため、それらを区別するのが難しい場合があります。
  • バックエンド間の動作の違いも解消されました。
  • デフォルトのバックエンドを am からインタラクティブに変更したいと考えています。つまり、プロンプトを変更しなかった場合、人々はデフォルトで " "をREBASE-i取得することになります。--am--whitespace-CREBASE
  • 将来的には、「--whitespace」、「-C」、さらには「 」でさえも--am、できることすべてを処理できるようになったら、インタラクティブなバックエンドを実行する予定am-backendです。

これらすべての理由から、あらゆるタイプのリベースのプロンプトを単に " REBASE" にしてください。


Git 2.17 (2018 年 3 月) 以降、次のものもあります。

git rebase --show-current-patch

.git/REBASE_HEAD競合中に一時停止できるインタラクティブなリベース中のコンテンツを示しています。

于 2010-10-13T08:29:55.163 に答える
20

__git_ps1の関数でcontrib/completion/git-prompt.shこのような検出がどのように行われるかを確認することもできます。これは、git対応の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
于 2010-10-13T10:12:22.577 に答える
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
$ 
于 2012-08-08T13:32:55.593 に答える
4

bash コマンド ラインから:

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

リベース フォルダーが存在する場合は、終了コード 0 (成功) が返され、リベース フォルダーが STDOUT に出力されます。リベースの途中でない場合は、何も出力されず、0 以外の終了コードが返されます。したがって、次のようなこともできます。

ls `git rev-parse --git-dir` | grep rebase || echo no rebase
于 2014-04-24T18:45:31.747 に答える
2

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

色付きの端末では、通知が非常に目立ちます。

<code>eg status</code> リベース途中のデモンストレーションのスクリーンショット

(eg help topic middle-of-rebaseドキュメント「<a href="http://people.gnome.org/~newren/eg/documentation/topic-middle-of-rebase.html" rel="nofollow noreferrer">解決または中止する方法」を表示します不完全なリベース」)

于 2012-08-23T18:48:12.467 に答える
2

ここにはいくつかの悪い答えがあります。gitどのように機能するかについての仕様は実際にはありません。コードはここにあります:

int wt_status_check_rebase(const struct worktree *wt,
               struct wt_status_state *state)
{
    struct stat st;

    if (!stat(worktree_git_path(wt, "rebase-apply"), &st)) {
        if (!stat(worktree_git_path(wt, "rebase-apply/applying"), &st)) {
            state->am_in_progress = 1;
            if (!stat(worktree_git_path(wt, "rebase-apply/patch"), &st) && !st.st_size)
                state->am_empty_patch = 1;
        } else {
            state->rebase_in_progress = 1;
            state->branch = get_branch(wt, "rebase-apply/head-name");
            state->onto = get_branch(wt, "rebase-apply/onto");
        }
    } else if (!stat(worktree_git_path(wt, "rebase-merge"), &st)) {
        if (!stat(worktree_git_path(wt, "rebase-merge/interactive"), &st))
            state->rebase_interactive_in_progress = 1;
        else
            state->rebase_in_progress = 1;
        state->branch = get_branch(wt, "rebase-merge/head-name");
        state->onto = get_branch(wt, "rebase-merge/onto");
    } else
        return 0;
    return 1;
}

基本的に、これらのいくつかのファイル/ディレクトリが存在するかどうかをチェックします(注!stat()は「ファイルが存在するか」を意味します)。amこれはgit am、Linux 開発者以外の誰もが使用しているとは思えないメールボックスからパッチを適用するためのものです。

  • rebase_in_progress:.git/rebase-apply && !.git/rebase-apply/applying || .git/rebase-merge && !.git/rebase-merge/interactive
  • interactive_rebase_in_progress:.git/rebase-merge && .git/rebase-merge/interactive
  • am_in_progress:.git/rebase-apply && .git/rebase-apply/applying

何らかの種類のリベース/アムが発生しているかどうかを知りたい場合は、存在するかどう.git/rebase-applyかを確認してください.git/rebase-merge

于 2021-04-24T16:26:14.280 に答える
-1

このコマンドを使用していますis_rebase=$(git status | grep "rebasing" | wc -l)

于 2018-05-23T16:01:49.590 に答える