Summary

これは、Gitツリーに変更を加え、レビューのために送信し、コメントに基づいて変更を加えるエンドツーエンドのワークフローを説明するチュートリアルです。

前提条件

このチュートリアルは、あなたがGitを使用してソースコードを管理することにすでにかなり精通していることを前提としています。 Gitワークフローの手順はほとんど説明していません。

このチュートリアルは、以下のドキュメントを要約することを目的としていますが、読めば有用な追加事項を見つけることができるでしょう:

  • Documentation/SubmittingPatches

  • Documentation/howto/new-command.txt

Getting Help

あなたが行き詰まった場合は、以下の場所で助けを求めることができます。

git@vger.kernel.org

これは、コードレビュー、バージョンアナウンス、デザインディスカッションなどが行われるメインのGitプロジェクトメーリングリストです。 貢献に興味のある方は、ここに質問を投稿してください。 Gitメーリングリストにはプレーンテキストのみの電子メールが必要であり、メールに返信するときはインライン投稿とボトム投稿を優先します。 あなたはあなたへのすべての返信でCCされます。 オプションで、本文に「subscribe git」を付けてmajordomo@vger.kernel.orgに電子メールを送信することにより、リストをサブスクライブできます。 このメーリングリストの archive はブラウザで表示できます。

git-mentoring@googlegroups.com

このメーリングリストは、新しい寄稿者を対象としており、メインリストの一般の人の目に触れないように質問を投稿したり回答を受け取ったりする場所として作成されました。 メンターの新参者を支援することに特に関心のあるベテランの貢献者がリストに含まれています。 検索インデクサーを回避するには、メッセージを表示するためにグループメンバーシップが必要です。 誰でも参加でき、承認は必要ありません。

#git-devel on Libera Chat

このIRCチャネルは、Gitコントリビューター間の会話用です。 誰かが現在オンラインで、あなたの質問に対する答えを知っている場合、あなたはリアルタイムで助けを受け取ることができます。 それ以外の場合は、 scrollback を読んで、誰かがあなたに回答したかどうかを確認できます。 IRCはオフラインのプライベートメッセージを許可していません。そのため、誰かにプライベートメッセージを送信してから、IRCからログアウトしようとすると、その人はあなたに応答できません。 切断した場合に回答できるように、また他の人が会話から学ぶことができるように、チャネルで質問することをお勧めします。

Getting Started

Clone the Git Repository

Gitは多くの場所でミラーリングされています。 それらの1つからリポジトリのクローンを作成します。 https://git-scm.com/downloads は、クローンを作成するのに最適な場所の1つがGitHubのミラーであることを示しています。

$ git clone https://github.com/git/git git
$ cd git

依存関係のインストール

ソースからGitをビルドするには、あなたはシステムにいくつかの依存関係をインストールする必要があります。 必要なもののヒントについては、外部プログラムとライブラリへのGitの依存関係に関するセクションに細心の注意を払って、 INSTALL を見ることで分かります。 そのドキュメントには、インストールせずに新しく構築したGitを「テスト運転」(test-drive)する方法が記載されています。 これが、このチュートリアルで使用する方法です。

上記手順でGitの新しいクローンを作成して、環境に必要なものがすべて揃っていることを確認してください:

$ make
Note
Gitのビルドは並列化可能です。 -j# は上記に含まれていませんが、ここや他の場所で好きなように使用できます。

Identify Problem to Solve

このチュートリアルでは、「Pony Saying ‘Um, Hello’」の略である新しいコマンド git psuh (訳注:pushでは無くてpsuh)を追加します。これは、ユーザーの通常の日常のワークフローで頻繁に呼び出されるにもかかわらず、実装されていない機能です。

(この分野では sl のような人気コマンドの実装の他にも、いくつかの取り組みが見られます。)

Set Up Your Workspace

まず、変更に取り組むための開発ブランチを作成することから始めましょう。 Documentation/SubmittingPatches によると、まったく新しいコマンドは新機能であるため、master に基づいて作業するのは問題ありません。 ただし、将来のバグ修正などについては、そのドキュメントを確認し、適切なブランチに基づいて作成する必要があります。

このドキュメントでは、すべての作業を、アップストリームプロジェクトの master ブランチを基にして行います。 以下のように、開発に使用する psuh ブランチを作成します:

$ git checkout -b psuh origin/master

私達は複数のパッチを含むトピックを同時に、レビューのために送信する方法を示すために、ここでいくつかのコミットを行います。

Code It Up!

Note
リファレンス実装は https://github.com/nasamuffin/git/tree/psuh にあります。

Adding a New Command

沢山のサブコマンドが組み込みとして書かれています。つまり、C言語で実装され、メインの git 実行ファイルにコンパイルされているということです。非常にシンプルな psuh コマンドを組み込みで実装することで、コードベースの構造や、内部 APIや、貢献者としてレビュー担当者やメンテナと共にこの変更をシステムに統合するプロセス、を見せることができます。

組み込みサブコマンドは通常、 サブコマンドにちなんで名付けられ、 cmd_ という名前の関数の後にサブコマンドの名前が続く、 builtin/ 内に含まれるソースファイルに実装されます。 したがって、コマンドを builtin/psuh.c に実装するのは理にかなっています。 そのファイルを作成し、その中に、スタイルとシグネチャに一致する関数であなたのコマンドのエントリポイントを記述します:

int cmd_psuh(int argc, const char **argv, const char *prefix)

また、私達は psuhの宣言を追加する必要があります。 builtin.h を開き、宣言をアルファベット順に保つために、 cmd_pull の宣言を見つけ、その直前に psuh の行を追加します。

int cmd_psuh(int argc, const char **argv, const char *prefix);

そして、あなたの push.c に必ず #include "builtin.h" を書き込んでください。

早速、その関数に使い捨てのprintfを追加します。 ビルドルールを追加してコマンドを登録できるようになったので、これは適切な開始点です。

Note
あなたの使い捨てのテキスト、およびこのチュートリアルの過程で追加するテキストの多くは、ユーザー向けです。 つまり、ローカライズ可能である必要があります。 po/README.md の 「Marking strings for translation」をご覧ください。 チュートリアル全体を通して、必要に応じて翻訳用の文字列にマークを付けます。 将来、ユーザー向けのコマンドを作成するときにもそうする必要があります。
int cmd_psuh(int argc, const char **argv, const char *prefix)
{
        printf(_("Pony saying hello goes here.\n"));
        return 0;
}

ではビルドしてみましょう。 Makefile を開き、 builtin /pull.oBUILTIN_OBJS に追加されている場所を見つけ、次に、それと同一の方法でアルファベット順になるように builtin/psuh.o を追加します。それができたら、最上位ディレクトリに移動し、 make を使用してビルドします。 また、 DEVELOPER = 1 変数を追加して、いくつかの追加の警告をオンにします:

$ echo DEVELOPER=1 >config.mak
$ make
Note
あなたがGitプロジェクトを開発するときは、 DEVELOPER フラグを使用することをお勧めします。 何らかの理由で機能しない場合は、オフにすることができますが、その問題をメーリングリストに記載することをお勧めします。

素晴らしい! これで、あなたの新しいコマンドそれ自体は問題なくビルドされます。 しかし、まだ誰もそれを呼び出しません。次はそこをいじりましょう。

コマンドのリストは git.c にあります。 commands[] 配列に cmd_struct を追加することで、新しいコマンドを登録できます。 struct cmd_struct は、コマンド名、コマンドの実装への関数ポインタ、およびセットアップオプションフラグを含む文字列を受け取ります。 今のところは push を模倣し続けることしましょう。 cmd_push が登録されている行を見つけてコピーし、 cmd_psuh に変更して、新しい行をアルファベット順に(cmd_pull の直前に)配置します。

オプションは、「Adding a new built-in. 」の「builtin.h」に記載されています。 後でユーザーの現在のワークスペースコンテキストに関するデータを出力したいので、Gitディレクトリが必要です。 そのため、あなたの唯一のオプションとして RUN_SETUP を選択します。

早速、もう一度ビルドしてください。 きれいなビルドが表示されるはずなので、ざっと動かしてみて、それが機能するかどうかを確認しましょう。 bin-wrappers ディレクトリにあなたがテストに使用できるバイナリがあります。

$ ./bin-wrappers/git psuh

見たまえ!あなたは今、コマンドをゲットしました!よくやった! では、これをコミットするとしましょう。

git status は、変更された Makefilebuiltin.h と` git.c` と 追跡されていない builtin/psuh.cgit-psuh を明らかにします。 まず、無視する必要のあるバイナリを処理しましょう。 エディターで .gitignore`を開き、 `/git-pull を見つけて、新しいコマンドのエントリをアルファベット順に追加します:

...
/git-prune-packed
/git-psuh
/git-pull
/git-push
/git-quiltimport
/git-range-diff
...

git status をもう一度チェックすると、 git-push が追跡されていないリストから削除され、 .gitignore が変更されたリストに追加されていることがわかります。 これで、私達はステージングしてコミットできます:

$ git add Makefile builtin.h builtin/psuh.c git.c .gitignore
$ git commit -s

あなたがコミットメッセージを書くためにエディターが表示されます。 作業中のコンポーネントの名前を含む50桁以下の件名でコミットを開始し、その後に空行1行(常に必須)、そして内容の大部分を提供するコミットメッセージの本文を続けます。 特に、diffから簡単に理解できない場合は、変更の「理由」を明示して提供することを忘れないでください。 コミットメッセージを編集する際に、上記 -s によって追加された Signed-off-by トレーラーを削除しないでください。

psuh: add a built-in by popular demand

Internal metrics indicate this is a command many users expect to be
present. So here's an implementation to help drive customer
satisfaction and engagement: a pony which doubtfully greets the user,
or, a Pony Saying "Um, Hello" (PSUH).

This commit message is intentionally formatted to 72 columns per line,
starts with a single line as "commit message subject" that is written as
if to command the codebase to do something (add this, teach a command
that). The body of the message is designed to add information about the
commit that is not readily deduced from reading the associated diff,
such as answering the question "why?".
JP)このコミットメッセージは意図的に一行72桁のフォーマットになっており、
"commit message subject" という一行で始まり、コードベースに何かを命令
するように書かれています(これを追加しろ、そのコマンドを教える、等)。
メッセージの本文は、関連する diff を読んだだけではわからないコミットに
関する情報、たとえば "なぜ?" という質問に答えるような情報を追加するよ
うに意図されています。

Signed-off-by: A U Thor <author@example.com>

早速、 git show を使用して新しいコミットを調べます。 "psuh:" は、主に psuh コマンドを変更したことを示します。 件名は、読者にあなたが何を変更したかについての考えを与えます。 サインオフライン(-s)は、Developer’s Certificate of Origin 1.1(開発者の原産地証明書1.1)に同意することを示します(Documentation/SubmittingPatches [[dco]] ヘッダー参照)。

チュートリアルの残りの部分では、簡潔にするために件名のみをリストします。 ただし、完全に肉付けされたコミットメッセージの例は、このドキュメントの上部にリンクされているリファレンス実装で入手できます。

Implementation

文字列を出力する以外に、少なくとも何かを行うと便利です。 まず、私たちが得たものすべてを見てみましょう。

あなたの cmd_psuh 実装を変更して、渡された引数をダンプし、既存の printf() 呼び出しはそのままにします:

        int i;

        ...

        printf(Q_("Your args (there is %d):\n",
                  "Your args (there are %d):\n",
                  argc),
               argc);
        for (i = 0; i < argc; i++)
                printf("%d: %s\n", i, argv[i]);

        printf(_("Your current working directory:\n<top-level>%s%s\n"),
               prefix ? "/" : "", prefix ? prefix : "");

ビルドして試してみてください。 ご想像のとおり、私達のコマンドの名前を含め、私達がコマンドラインで与えたものはほとんど何でもあります。 (prefix が空の場合は、 cd Documentation/ && ../bin-wrappers/git psuh としてみてください)。 これあまり役に立ちません。 では、私達は他にどのようなコンテキストを取得できるでしょうか?

#include "config.h" 行を追加します。 そして関数本体にちょびっと追加します:

        const char *cfg_name;

...

        git_config(git_default_config, NULL);
        if (git_config_get_string_tmp("user.name", &cfg_name) > 0)
                printf(_("No name is found in config\n"));
        else
                printf(_("Your name: %s\n"), cfg_name);

git_config() は、Gitに認識されている構成ファイルから構成を把握し、標準の優先順位ルールを適用します。 git_config_get_string_tmp() は特定のキー("user.name")を検索し、値を提供します。 このような単一キー探索関数は多数あります。 それらすべて(および git_config() の使用方法に関する詳細情報)は、 Documentation/technical/api-config.txt で確認できます。

出力された名前が、実行時に表示される名前と一致することがわかります:

$ git config --get user.name

すばらしい! これで、Git構成の値を確認する方法がわかりました。 これもコミットしましょう。そうすれば、自身の成果を失うことはありません。

$ git add builtin/psuh.c
$ git commit -sm "psuh: show parameters & config opts"
Note
繰り返しになりますが、上記のように -m で済ますのはチュートリアルを簡潔にするためです。 実際の変更では、 -m を使用するのではなく、エディターを使用して意味のあるメッセージを記述してください。

さらに、ユーザーの作業コンテキストがどのようなものかを知っておくと便利です。 ユーザーの現在のブランチの名前を出力できるかどうかを見てみましょう。 git status の実装を模倣できます。私達は、出力関数が wt-status.c にあり、ブランチが struct wt_status に保持されていることが分かりました。

wt_status_print() は、 builtin/commit.ccmd_status() によって呼び出されます。 その実装を見ると、ステータス構成が以下のように入力されていることがわかります:

status_init_config(&s, git_status_config);

しかし、ドリルダウンすると、 status_init_config()git_config() の呼び出しをラップしていることがわかります。 前のコミットで私達が書いたコードを変更してみましょう。

struct wt_status を使用できるように、必ず以下のヘッダーファイルを含めてください:

#include "wt-status.h"

次に、 あなたの cmd_psuh 実装を変更して、 あなたの struct wt_status を宣言し、準備して、その内容を出力します:

        struct wt_status status;

...

        wt_status_prepare(the_repository, &status);
        git_config(git_default_config, &status);

...

        printf(_("Your current branch: %s\n"), status.branch);

もう一度実行して、確認します。 — これがあなたの現在のブランチの(冗長な)名前です!

これもコミットしましょう。

$ git add builtin/psuh.c
$ git commit -sm "psuh: print the current branch"

(コミットしたので)今や、その特定のコミットに関する情報を私達が取得できるかどうかを見てみましょう。

幸いなことに、ここでは、私達のためにいくつかのヘルパーがあります。 commit.h には lookup_commit_reference_by_name という関数があり、ハードコードされた文字列を簡単に設定できます。 pretty.h には、完全な形式のオブジェクトを渡す必要のない非常に便利な pp_commit_easy() 呼び出しがあります。

以下のインクルードファイルを追加します:

#include "commit.h"
#include "pretty.h"

次に、 cmd_psuh() の実装内で、宣言とロジックの近くにそれぞれ以下の行を追加します。

        struct commit *c = NULL;
        struct strbuf commitline = STRBUF_INIT;

...

        c = lookup_commit_reference_by_name("origin/master");

        if (c != NULL) {
                pp_commit_easy(CMIT_FMT_ONELINE, c, &commitline);
                printf(_("Current commit: %s\n"), commitline.buf);
        }

struct strbuf は、基本的な char * にいくつかの安全機構(safety belts)を提供します。そのうちの1つは、バッファオーバーランを防ぐための長さのメンバーです。 これは STRBUF_INIT でうまく初期化する必要があります。 char* を渡す必要がある場合は、この点に注意してください。

lookup_commit_reference_by_name は渡された名前を解決するので、その値で遊んでみて、どんなことを思いつくか見てみましょう。

pp_commit_easy は、フォーマット構造体全体ではなく、単一のフォーマット列挙型の省略形をとる pretty.h の便利なラッパーです。 そしてそれから、その省略形に従ってコミットをきれいに印刷(pretty-prints)します。 これらは、多くのGitコマンドで --pretty=FOO で使用できる形式に似ています。

ビルドして実行すると、あなたが例で同一の名前を使用している場合は、あなたが知っている origin/master に最新のコミットの件名が表示されます。ちゃんとできました! これもコミットしましょう。

$ git add builtin/psuh.c
$ git commit -sm "psuh: display the top of origin/master"

Adding Documentation

素晴らしい! あなたはコミュニティと共有する準備ができている素晴らしい新しいコマンドを持っています。 だがちょっと待って欲しい。 — これはあまりユーザーフレンドリーではありません。 以下を実行してみます:

$ ./bin-wrappers/git help psuh

あなたの新しいコマンドは文書化されていません! これを直しましょう。

Documentation/git-*.txt を見てください。 これらは、Gitが知っているサブコマンドのマニュアルページです。 これらを開いてフォーマットを理解するために確認することもできますが、まずは新しいファイル Documentation/git-psuh.txt を作成します。 Gitプロジェクトのほとんどのドキュメントと同様に、ヘルプページは AsciiDoc で作成されています(CodingGuidelinesの「Writing Documentation」セクションを参照)。 以下のテンプレートに従ってあなた独自のmanpageを作成します:

git-psuh(1)
===========

NAME
----
git-psuh - Delight users' typo with a shy horse


SYNOPSIS
--------
[verse]
'git-psuh [<arg>...]'

DESCRIPTION
-----------
...

OPTIONS[[OPTIONS]]
------------------
...

OUTPUT
------
...

GIT
---
Part of the linkgit:git[1] suite

注意すべき最も重要な部分は、 = で下線が引かれたファイルヘッダー、NAMEセクション、およびコマンドが引数を取る場合に通常は文法を含むSYNOPSISです。 ドキュメントが他のGitおよびUNIXのmanpageと一致するように、確立されたmanpageヘッダー(well-established manpage headers)を使用するようにしてください。 これにより、ユーザーは必要な情報が含まれていることがわかっているセクションにスキップできるため、ユーザーが楽をできます。

Note
ドキュメントを作成する前に、パッケージ asciidoc がインストールされていることを確認してください。

今や、あなたのmanpageを記述したので、明示的にそれをビルドする必要があります。 以下のようにしてAsciiDocを人間が読めるtroffに変換します:

$ make all doc
$ man Documentation/git-psuh.1

または

$ make -C Documentation/ git-psuh.1
$ man Documentation/git-psuh.1

これは git help を実行するほど満足のいくものではありませんが、少なくともあなたのヘルプページが正しく表示されていることを確認できます。

トップレベルから make check-docs を実行することで、ドキュメントの適用範囲が良好であることを確認することもできます(つまり、プロジェクトはあなたのコマンドが実装され、ドキュメント化されていることを確認します)。

早速、あなたの新しいドキュメントの変更をコミットします。

Adding Usage Text

./bin-wrappers/git psuh -h を実行してみてください。 コマンドは最後にクラッシュするはずです。 なぜならこれは、 -h が、あなたのコマンドが使用法の出力を処理しなければならない特殊なケースであるためです。

Documentation/technical/api-parse-options.txt をご覧下さい。 これはあなたが扱えるようにする必要があるオプションを引っ張り出すめの便利なツールで、使用法の文字列を受け取ります。

これを使用するには、使用文字列のNULLで終了する配列と builtin_psuh_options 配列を準備する必要があります。

#include "parse-options.h" 行を追加します。

グローバルスコープで、あなたの使用法文字列の配列を追加します:

static const char * const psuh_usage[] = {
        N_("git psuh [<arg>...]"),
        NULL,
};

次に、あなたの cmd_psuh() 実装内で、 option 構造体を宣言して入力できます。 私たちのものはかなり退屈ですが、 parse_options() をより詳細に調べたい場合は、さらに追加することができます:

        struct option options[] = {
                OPT_END()
        };

最後に、あなたの引数とプレフィックスを出力する前に、 parse-options() の呼び出しを追加します:

        argc = parse_options(argc, argv, prefix, options, psuh_usage, 0);

この呼び出しにより、あなたの argv パラメーターが変更されます。 argv から options で指定したオプションが削除され、 options エントリからポイントされた場所が更新されます。 必ず あなたの argcparse_options() の結果に置き換えてください。そうしないと、後で argv をパースしようとしたときに混乱します。

特別な引数 -- に注意する価値があります。 ご存知かもしれませんが、多くのUnixコマンドは「名前付きパラメータの終わり」を示すために -- を使用します — -- の後のすべてのパラメータは単に位置引数として解釈されます。 (これは、通常はフラグとして解釈されるものをパラメーターとして渡したい場合に便利です。) parse_options()-- に達するとパースを終了し、その後、残りのオプションをそのまま提供します。

今や、あなたは使用上のヒントが得られたので、 command-list.txt から生成される git help git または git help -a で示される一般的なコマンドリストにそれを表示する方法をGitに教えることができます。 あなたは git-pull の行を見つけて、その上に あなたの git-psuh 行をアルファベット順に追加できるようにします。これで、前述のヘルプコマンドのどこに表示されるかに影響を与える、コマンドに関するいくつかの属性を追加できます。 command-list.txt の上部は、各属性の意味に関する情報を共有しています。これらのヘルプページでは、コマンドはこれらの属性に従ってソートされています。 git psuh はユーザー向け、つまり磁器コマンドです。そのため、「mainporcelain」としてマークします。 「mainporcelain」コマンドの場合、 command-list.txt の上部にあるコメントは、オプションで別のリストから属性を追加することもできることを示しています。 git psuh はユーザーのワークスペースに関する情報を表示しますが、何も変更しないので、「info」としてマークしましょう。属性を他の command-list.txt と同一のスタイルに保ち、適宜空白を使用してそれらを整列して記述します:

git-prune-packed                        plumbingmanipulators
git-psuh                                mainporcelain           info
git-pull                                mainporcelain           remote
git-push                                mainporcelain           remote

再びビルドします。 これで、 -h を指定して実行すると、他に何か面白いことが起こる前に、使用法が出力され、コマンドが終了するはずです。 すばらしい!

それでは、これもコミットしておいてください。

Testing

あなたのコードをテストすることは重要です — このような小さなおもちゃのようなコマンドであっても。 さらに、あなたのパッチはテストなしではGitツリーに受け入れられません。 テストは以下のようにする必要があります:

  • 機能の現在の振る舞いを説明する

  • 現在の振る舞いが期待される振る舞いと一致することを証明する

  • 変更後に外部から見える動作が壊れていないことを確認します

それでは、いくつかのテストを書いてみましょう。

関連資料: t/README

Overview of Testing Structure

Gitのテストは t/ にあり、 t/README の NamingTestsセクションに示されているスキーマを使用して4桁の10進数で名前が付けられます。

Writing Your Test

今回はおもちゃコマンドなので、思い切ってテストにt9999という名前を付けましょう。 ただし、ファミリとサブコマンドの組み合わせの多くはいっぱいいっぱいであるため、ベストプラクティスは、追加したコマンドに十分近いコマンドを見つけて、その名前付け空間を共有することです。

新しいファイル t/t9999-psuh-tutorial.sh を作成します。 ヘッダーは以下のように始めます(t/README の「WritingTests」および「Source test-lib.sh」参照):

#!/bin/sh

test_description='git-psuh test

This test runs git-psuh and makes sure it does not crash.'

. ./test-lib.sh

TAP形式の結果を出力するために、テストは test_expect_success 内にフレーム化されます。 git psuh がうまく終了せず、どこかで適切な動物について言及していることを確認しましょう:

test_expect_success 'runs correctly with no args and good output' '
        git psuh >actual &&
        grep Pony actual
'

あなたのスクリプトの下部に以下を追加して、あなたが必要なすべてを実行したことを示します:

test_done

あなたのテストスクリプトを実行可能としてマークしてください:

$ chmod +x t/t9999-psuh-tutorial.sh

make -C t test-lint を実行すると、新しいテストスクリプトが正常に作成されたかどうかがわかります。これにより、テスト番号の一意性や実行可能ビットなどがチェックされます。

Running Locally

ローカルで実行してみましょう:

$ make
$ cd t/ && prove t9999-psuh-tutorial.sh

あなたは完全なテストスイートを実行して、 git-push が何も壊さなかったことを確認できます:

$ cd t/
$ prove -j$(nproc) --shuffle t[0-9]*.sh
Note
これは、 make test を使用して行うことも、TAPを話すことができる任意のテストハーネスを使用することもできます。 prove は同時に実行できます。 shuffle`は、テストが実行される順序をランダム化します。これにより、テスト間の不要な依存関係に対する回復力が高まります。 `prove は出力をより良くする事もします。

では、この変更もコミットしておいてください。

共有の準備: パッチシリーズの解剖分析

あなたは、 Gitプロジェクトは電子メールで送信されたパッチを介してコード・レビューが行われ、準備が整いコミュニティによって承認されると、メンテナーによって適用されることに、既に気づかれていると思います。 Git プロジェクトはプル・リクエストからの貢献を受け入れません。また、レビューのために電子メールで送信されるパッチは、指定の方法でフォーマットする必要があります。

コミットを電子メールで送信されるパッチに変換する方法を検討する前に、最終結果である「パッチ・シリーズ」がどのようになるかを分析してみましょう。 は、 Git mailing list archive のWebインターフェース上のパッチ・シリーズの概要ビューです:

2022-02-18 18:40 [PATCH 0/3] libify reflog John Cai via GitGitGadget
2022-02-18 18:40 ` [PATCH 1/3] reflog: libify delete reflog function and helpers John Cai via GitGitGadget
2022-02-18 19:10   ` Ævar Arnfjörð Bjarmason [this message]
2022-02-18 19:39     ` Taylor Blau
2022-02-18 19:48       ` Ævar Arnfjörð Bjarmason
2022-02-18 19:35   ` Taylor Blau
2022-02-21  1:43     ` John Cai
2022-02-21  1:50       ` Taylor Blau
2022-02-23 19:50         ` John Cai
2022-02-18 20:00   ` // other replies elided
2022-02-18 18:40 ` [PATCH 2/3] reflog: call reflog_delete from reflog.c John Cai via GitGitGadget
2022-02-18 19:15   ` Ævar Arnfjörð Bjarmason
2022-02-18 20:26     ` Junio C Hamano
2022-02-18 18:40 ` [PATCH 3/3] stash: call reflog_delete from reflog.c John Cai via GitGitGadget
2022-02-18 19:20   ` Ævar Arnfjörð Bjarmason
2022-02-19  0:21     ` Taylor Blau
2022-02-22  2:36     ` John Cai
2022-02-22 10:51       ` Ævar Arnfjörð Bjarmason
2022-02-18 19:29 ` [PATCH 0/3] libify reflog Ævar Arnfjörð Bjarmason
2022-02-22 18:30 ` [PATCH v2 0/3] libify reflog John Cai via GitGitGadget
2022-02-22 18:30   ` [PATCH v2 1/3] stash: add test to ensure reflog --rewrite --updatref behavior John Cai via GitGitGadget
2022-02-23  8:54     ` Ævar Arnfjörð Bjarmason
2022-02-23 21:27       ` Junio C Hamano
// continued

以下の幾つかの点に留意してください:

  • 各コミットは、 n コミット シリーズの i 番目のコミットを表す [PATCH _i_/_n_] という接頭辞が付けられたコミット・メッセージのタイトルを件名として、個別の電子メールとして送信されます。

  • 各パッチは、[PATCH 0/_n_] という接頭辞が付いた、シリーズの、 カバー・レターと呼ばれる紹介メールへの返信として送信されます。

  • パッチ・シリーズの後続の反復は、「PATCH」の代わりに「PATCH v2」、「PATCH v3」などのラベルが付けられます。 たとえば、「[PATCH v2 1/3]」は、2 回目の繰り返しの 3 つのパッチの最初のパッチになります。 各反復は新しいカバー・レター (「[PATCH v2 0/3]」など) と共に送信され、それ自体が前の反復のカバー・レターへの返信です(詳細下記)。

Note
シングル・パッチ・トピックは、i/n 番号なしで「[PATCH]」、「[PATCH v2]」などで送信されます (ただし、上記の「スレッド概要」では、シングル・パッチ・トピックは表示されません)。

The cover letter

パッチごとの電子メールに加えて、Git コミュニティは、パッチにカバー・レターが付属していることも期待しています。 これは変更提出(change submission)の重要な要素であり、パッチを見るだけではなく、何をしようとしているのか、その理由をコミュニティに高レベルで説明するものです。

カバー・レターのタイトルは、トピック・ブランチ全体の目的を簡潔に網羅するものにする必要があります。 コミット・メッセージのタイトルと同じように、しばしば命令調になっています。 シリーズにタイトルを付ける方法は以下のとおりです:

--- Add the psuh command ---

カバー・レターの本文は、レビュー担当者に追加のコンテキストを提供するために使用されます。 パッチだけでは明らかにならないことは必ず説明してください。 ただし、カバー・レターはコミット履歴に記録されないため、将来リポジトリの履歴を読む人にとって役立つ可能性があるものはコミット・メッセージにも記載する必要があることを忘れないでください。

ここで、 push の本文の例を以下に示します:

Our internal metrics indicate widespread interest in the command
git-psuh - that is, many users are trying to use it, but finding it is
unavailable, using some unknown workaround instead.

The following handful of patches add the psuh command and implement some
handy features on top of it.

This patchset is part of the MyFirstContribution tutorial and should not
be merged.

ここから、 パッチ・セットをフォーマットしてレビューを受けるための 2 つの異なる方法を示すために、チュートリアルは分岐します。

一番目の方法はGitGitGadgetです。これは、GitHubの一般的なプルリクエストワークフローに既に精通しているユーザーに役立ちます。 この方法ではGitHubアカウントが必要です。

2番目の方法は git send-email にて対応します。これにより、送信する電子メールを少し細かく制御できます。 この方法には、システムに応じて変更される可能性のあるいくつかの設定が必要であり、このチュートリアルでは説明しません。

どちらの方法を選択しても、レビュー担当者との関わりは同じです。 レビュープロセスについては、GitGitGadget と git send-email のセクションの後で説明します。

Sending Patches via GitGitGadget

パッチを送信するためのオプションの一つは、一般的なプルリクエストワークフローに従い、GitGitGadgetを介してパッチを送信することです。 GitGitGadgetは、GitHub PRワークフローに慣れている人にとって、Git寄稿者としての生活を容易にするために Johannes Schindelin によって作成されたツールです。 これにより、寄稿者はGitプロジェクトのミラーに対してプルリクエストを開くことができ、PRを一連の電子メールに変換して送信するための魔法を実行します。 また、Git継続的インテグレーションスイートも実行します。 これは http://gitgitgadget.github.io で文書化されています。

Forking git/git on GitHub

あなたはGitGitGadgetを使用してレビューするためにパッチを送信する前に、Gitプロジェクトをフォークして変更をアップロードする必要があります。 まず最初に、GitHubアカウントを持っていることを確認してください。

GitHub mirror に移動し、フォークボタン(Fork button)を探します。 あなたの適切と思われる場所にあなたのフォークを配置作成します。

Uploading to Your Own Fork

ブランチを自分のフォークにアップロードするには、新しいフォークをリモートとして追加する必要があります。 git remote -v を使用して、すでに追加したリモートを表示できます。 GitHubの新しいフォークのページから、「Clone or download」(クローンまたはダウンロード)を押してURLを取得できます。 次に、以下を実行してリモートを追加し、提供されている例の独自のURLとリモート名を置き換える必要があります:

$ git remote add remotename git@github.com:remotename/git.git

または、HTTPS URL を使って:

$ git remote add remotename https://github.com/remotename/git/.git

もう一度 git remote -v を実行すると、新しいリモートが表示されます。 プッシュの準備をするために、 git fetch remotename (remotenameの部分はあなたの実際のリモートの名前に置き換えて下さい) とします。

次に、 git branch を実行して、あなたの全ての開発を新しいブランチで行っていることを再確認します。 そうでない場合は、今が新しいコミットを独自のブランチに移動する良い機会です。

このドキュメントの冒頭で簡単に説明したように、作業は master に基づいているため、以下に示すように更新しておくか、好みのワークフローを使用してください。

$ git checkout master
$ git pull -r
$ git rebase master psuh

そして今や、あなたは新しいトピックブランチをプッシュする準備が整いました! (ブランチ名をあなたの実際のに置き換えるのと、あなたのコマンド名がpushじゃなくてpsuhであることに注意して下さい。)

$ git push remotename psuh

これで、あなたはGitHubで新しく作成したブランチにアクセスして確認できるようになります。

Sending a PR to GitGitGadget

コードをテストしてレビュー用にフォーマットするには、まず、 gitgitgadget/git に対してプルリクエストを開く必要があります。 https://github.com/gitgitgadget/git にアクセスし、「New pull request」(新しいプルリクエスト)ボタンまたは、新しくプッシュしたブランチの名前とともに表示される便利な「Compare & pull request」(比較してプルリクエスト)ボタンを使用してPRを開きます。

PR のタイトルと説明を確認してください。 GitGitGadget では、あなたの変更の、カバー・レターの件名と本文としてそれぞれ使用されます。 提出物にタイトルを付ける方法と説明に含める内容については、上記 "The cover letter" を参照してください。

Note
単一パッチでの貢献の場合、あなたのコミット・メッセージはすでに意味のある内容があり、それはパッチの目的 (何が起こっているのか、その理由) を高レベルで説明しているべきであるため、通常は追加のコンテキストは必要ありません。 その場合、 GitHub がコミット・メッセージから自動的に生成する PR の説明を削除します (PR の説明は空にする必要があります)。 さらに多くのコンテキストを提供する必要がある場合は、その場所で行うことができ、GitGitGadget が送信する電子メールの三点鎖線(three-dash)と diffstat の間に追加されます (送信後の様子については Bonus Chapter: One-Patch Changes を参照してください)。

満足したら、プル・リクエストを送信します。

Running CI and Getting Ready to Send

あなたがGitGitGadgetを初めて使用する場合(このチュートリアルを使用している可能性が高い)、誰かがツールの使用許可を与える必要があります。 GitGitGadgetのドキュメントに記載されているように、PRに /allow<username> を付けてコメントするにはすでにそれを使用している人が必要です。 GitGitGadgetは、許可が与えられていなくてもCIを介してPRを自動的に実行しますが、誰かがあなたにツールの使用を許可するまで、あなたの変更を /submit することはできません。

Note
通常、GitGitGadgetであなたを /allow できる人を見つけるには、誰かに /allow が付与されている最近のプルリクエストを調べます(Search: is:pr is:open "/allow")。この場合、作成者と /allow を付与した人の両方が /allow できるようになります。 /allow するか、またはLiberaChatの #git-devel IRCチャネルで、プルリクエストをリンクして誰かに /allow するように依頼してください。

CIに失敗した場合は、 git rebase -i を使用して変更を更新し、ブランチを再度プッシュできます:

$ git push -f remotename psuh

実際、パッチが next に受け入れられるまで、この方法で変更を続ける必要があります。

Sending Your Patches

あなたのCIを通過し、誰かが /allow コマンドでGitGitGadgetを使用する許可を与えたのなら、レビューのために送信するのは、/submit でPRにコメントするのと同じくらい簡単です。

Updating With Comments

メーリングリストで受け取るレビューコメントに返信する方法については、 Responding to Reviews に進んでください。

すべてのレビューコメントに従って希望の形でブランチを作成したら、もう一度送信できます:

$ git push -f remotename psuh

次に、GitGitGadgetに対するプルリクエストを確認します。 CIが再び開始されたことがわかります。 CIの実行中に、プルリクエストスレッドの上部にある説明を変更するのに適したタイミングです。 カバーレターとして再び使用されます。 この場所を使用して、以前のバージョンから何が変更されたかを説明し、レビュー担当者が何を見ているのかをある程度把握できるようにする必要があります。 CIの実行が完了したら、 /submit でもう一度コメントできます。GitGitGadgetはあなたの変更にv2マークを自動的に追加します。

Sending Patches with git send-email

GitGitGadgetを使用したくない場合は、Git自体を使用してパッチをメールで送信することもできます。 このようにGitを使用する利点には、件名をよりきめ細かく制御できること(たとえば、件名に [RFC PATCH]のタグを使用できること)や、メーリングリストに投稿する前に自分用の「ドライラン」メールを送ってすべてがうまくいくことを確認できることがあります。

Prerequisite: Setting Up git send-email

send-email` の設定はオペレーティングシステムやメールプロバイダーによって異なるので、このチュートリアルでは説明しません。 多くのLinuxディストリビューションでは、 git-send-email は通常の git インストールと一緒にパッケージされていません。 追加パッケージをインストールする必要があるかもしれません。 オンラインには、そのためのリソースがたくさんあります。 また、SMTPサーバーを使用するための正しい設定方法を決定する必要があります。 この設定はシステムやメールの設定によって大きく変わる可能性があるので、このチュートリアルの範囲外です。

Preparing Initial Patchset

Gitを使用したメールの送信は2つの部分からなるプロセスです。 メール自体を準備する前に、パッチを準備する必要があります。 幸いなことに、これは非常に簡単です:

$ git format-patch --cover-letter -o psuh/ --base=auto psuh@{u}..psuh
  1. --cover-letter オプションは、format-patch にカバーレターのテンプレート・ファイルを作成するように指示します。 あなたは送信前にテンプレートに記入する必要があります。 しかし、今のところ、そのテンプレート・ファイルは他のパッチ・ファイルと一緒にあります。

  2. -o psuh / オプションは、パッチファイルをディレクトリに配置するように format-patch に指示します。 git send-email はディレクトリを取得し、そこからすべてのパッチを送信できるため、これは便利です。

  3. --base=auto オプションは、受信者が一連のパッチを適用すると予想されるベース・コミットを記録するようにコマンドに指示します。 auto 値の指定により、 format-patch はベース・コミットを自動的に計算します。これは、リモート追跡ブランチの先端コミットのマージ・ベースと指定されたリビジョン範囲です。

  4. psuh@{u}..psuh オプションは format-patch に、上流(「Set up your workspace」セクションの例に従った場合、これは origin/master です)から分岐したので psuh ブランチ(訳注: push ではなくて psuh)で作成したコミット用のパッチを生成するように指示します。 既に psuh ブランチにいる場合は、 単に @{u} と言うことができます。これは、「上流から分岐したため、現在のブランチでコミットする」ことを意味し、同じことを意味します。

このコマンドは、コミットごとに 1 つのパッチ・ファイルを作成します。 実行した後、お気に入りのテキスト・エディタで各パッチを調べて、すべてが適切に表示されることを確認できます。 ただし、パッチ・ファイルを使用してコードを修正することはお勧めしません。 パッチを変更するよりも、git rebase -i を使用するか、新しいコミットを追加することによって、通常の方法で変更を加える方が良い考えです。

Note
オプションで、 --rfc フラグを使用して、パッチの件名の前に 「[PATCH]」ではなく「[RFCPATCH]」を付けることもできます。 RFCは「request for comments」の略で、コードを送信する準備が整っていないときに、コードレビュープロセスを開始することを示しています。 これは、パッチが提案である場合にも使用できますが、コミュニティがそのアプローチで問題を解決したいかどうか、つまり一種の設計レビューを実施したいかどうかはわかりません。 「WIP」とマークされたパッチもリストに表示される場合があります。これは、パッチが不完全であることを意味しますが、レビュー担当者にこれまでのパッチを確認してもらいたいことを意味します。 このフラグは --subject-prefix=WIP で追加できます。

パッチとカバーレターのテンプレートが指定したディレクトリに存在することを確認してください。これであなたがレビューを送信する準備がほぼ整いました!

Preparing Email

--cover-letter を指定して format-patch を呼び出したので、カバー・レターのテンプレートは既に用意されています。 それをお気に入りのエディターで開きます。

あなたは既に多数のヘッダーを拝んでいるはずです。 From: ヘッダーが正しいことを確認してください。 その次に、Subject: を変更します(パッチシリーズに適切なタイトルを選ぶには、 上記 を参照してください):

Subject: [PATCH 0/7] Add the 'psuh' command

必ず ”[PATCH 0/X]” の部分を保持してください。 これが、このメールがパッチ・シリーズの始まりであることをGitコミュニティに示しており、多くのレビュー担当者がこのタイプのフラグでメールをフィルタリングしています。

あなたはカバーレターを追加するために git send-email を呼び出すときに、いくつかの追加パラメーターを追加する必要があります。

次に、カバーレターの本文を記入する必要があります。 繰り返しますが、含める内容については above を参照してください。

git format-patch --cover-letter によって作成されたテンプレートには、diffstatが含まれています。 これにより、レビュー担当者は、トピックをレビューするときに何をしているのかを要約できます。 サンプル実装から psuh 用に生成されたものは以下のようになります:

 Documentation/git-psuh.txt | 40 +++++++++++++++++++++
 Makefile                   |  1 +
 builtin.h                  |  1 +
 builtin/psuh.c             | 73 ++++++++++++++++++++++++++++++++++++++
 git.c                      |  1 +
 t/t9999-psuh-tutorial.sh   | 12 +++++++
 6 files changed, 128 insertions(+)
 create mode 100644 Documentation/git-psuh.txt
 create mode 100644 builtin/psuh.c
 create mode 100755 t/t9999-psuh-tutorial.sh

最後に、この手紙文にはパッチの生成に使用されたGitのバージョンが含まれます。 この文字列は放っておいても大丈夫です。

Sending Email

この時点で、パッチとカバーレターが入ったディレクトリ psuh/ が作成されているはずです。 あなたがそれを送信する時が来ました! あなたは以下のように送信できます:

$ git send-email --to=target@example.com psuh/*.patch
Note
返信先アドレスの変更やCCおよびBCC行の追加など、役立つと思われるその他のオプションについては、 git help send-email を確認してください。
Note
実際のパッチを送信する場合、 git@vger.kernel.org に送信されますが、チュートリアルから実際のメーリングリストにパッチセットを送信しないでください。 今のところ、それがどのように見えるかを確実に理解するために、それを自分自身に送信することができます。

あなたが上記のコマンドを実行すると、各パッチが送信されるたびにインタラクティブなプロンプトが表示されます。 これにより、何かを編集したり送信をやめたりする最後のチャンスが得られます(ただし、繰り返しになりますが、この方法でコードを編集してはいけません)。 これらのプロンプトで y または a を押すと、メールが送信されます! おめでとうございます!

素晴らしい!これでコミュニティはすべてを捨ててあなたの変更をレビューすることでしょう。 (冗談です、我慢が肝要です)

Sending v2

このセクションでは、あなたのパッチセットの v2 を送信する方法に焦点を当てます。 v2 に何を含める必要があるかについては、 Responding to Reviews にスキップして、レビュー担当者からのコメントの処理方法を確認してください。

v2 の「psuh」トピック ブランチを再利用します。 変更を加える前に、簡単に参照できるように v1 ブランチの先端をマークします:

$ git checkout psuh
$ git branch psuh-v1

レビュアーのコメントに基づいてコミットを調整するには、 git rebase -i を使用してパッチ・シリーズを改良します。 パッチ・シリーズを送信する準備ができたら、パッチを再度生成しますが、いくつかの新しいフラグを使用します:

$ git format-patch -v2 --cover-letter -o psuh/ --range-diff master..psuh-v1 master..

--range-diff master..psuh-v1 パラメータは、カバー・レターに psuh-v1psuh の間の範囲差分(range-diff)を含めるように format-patch に指示します (git-range-diff(1) 参照)。 これは、v1 パッチと v2 パッチの違いをレビュアーに伝えるのに役立ちます。

-v2 パラメータは、パッチをバージョン「2」として出力するように format-patch に指示します。 たとえば、v2 パッチはすべて v2-000n-my-commit-subject.patch のような名前になっていることに気付くかもしれません。 -v2 は、[PATCH] の代わりに [PATCH v2] をプレフィックスとしてパッチをフォーマットし、 range-diff は Range-diff against v1 で始まります。

このコマンドを実行すると、 format-patch は v1 パッチと一緒に psuh/ ディレクトリにパッチを出力します。 単一のディレクトリを使用すると、v2 パッチを校正しながら古い v1 パッチを簡単に参照できますが、v2 パッチのみを送信するように注意する必要があります。 psuh/v2-*.patch のようなパターンを使用します (v1 および v2 パッチに一致する psuh/*.patch ではありません)。

カバーレターをもう一度編集します。 何か重要なことがあれば、今が前回のバージョンと現在のバージョンの違いについて言及する良い機会です。 2番目のカバーレターにまったく同じ本文は必要ありません。 レビューアの目に見えない可能性のある変更を説明することに焦点を当てます。

また、あなたはカバーレターのメッセージ ID を見つけなければなりません。 最初のシリーズを送信するときに git send-email の出力をメモしておくができますし、 mailing list で調べることもできます。アーカイブでカバーレターを見つてクリックし、 そして "permalink" または "raw" をクリックすると、 以下のような Message-ID ヘッダーが表示されます:

Message-ID: <foo.12345.author@example.com>

あなたのメッセージIDは <foo.12345.author@example.com> です。 この文章では以降、この例を使います。 previous cover letter を正しいメッセージIDに置き換えてください。つまり、v2を送信する場合は、v1からのMessage-IDを使用します。 v3を送信する場合は、v2からのMessage-Idを使用します。

メーリングリストではすべてのCCをスレッドに保持するのが一般的であるため、電子メールを見ている間、誰がCCされているかにも注意する必要があります。 これらのCC行は、ヘッダー(件名行の前)に以下のような行を使用して、カバーレターに直接追加できます:

CC: author@example.com, Othe R <other@example.com>

コマンドに渡すメッセージに細心の注意を払いながら、もう一度メールを送信します:

$ git send-email --to=target@example.com
                 --in-reply-to="<foo.12345.author@example.com>"
                 psuh/v2-*.patch

Bonus Chapter: One-Patch Changes

場合によっては、あなたのごくわずかな変更が1つのパッチのみで構成されていることがあります。 その場合、送信する必要があるのは1通のメールだけです。 コミットメッセージはすでに意味があり、パッチの目的(何が起こっているのか、その理由)を高レベルで説明しているはずですが、さらに多くのコンテキストを提供する必要がある場合は、パッチの --- の下で行うことができます。 以下の例を見てください。これは、1回のコミットで git format-patch を使用して生成され、編集されて、 --- とdiffstatの間にコンテンツが追加されています。

From 1345bbb3f7ac74abde040c12e737204689a72723 Mon Sep 17 00:00:00 2001
From: A U Thor <author@example.com>
Date: Thu, 18 Apr 2019 15:11:02 -0700
Subject: [PATCH] README: change the grammar

I think it looks better this way. This part of the commit message will
end up in the commit-log.

Signed-off-by: A U Thor <author@example.com>
---
Let's have a wild discussion about grammar on the mailing list. This part of my email will never end up in the commit log. Here is where I can add additional context to the mailing list about my intent, outside of the context of the commit log. This section was added after `git format-patch` was run, by editing the patch file in a text editor.

 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 88f126184c..38da593a60 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
 Git - fast, scalable, distributed revision control system
 =========================================================

-Git is a fast, scalable, distributed revision control system with an
+Git is a fast, scalable, and distributed revision control system with an
 unusually rich command set that provides both high-level operations
 and full access to internals.

--
2.21.0.392.gf8f6787159e-goog

My Patch Got Emailed - Now What?

Responding to Reviews

うまくいけば、数日後にはあなたのパッチセットへのコメント付きの返信が届くことでしょう。 やったね! まぁともあれ、これであなたは本来の作業に戻ることができます。

それぞれのコメントには、提案された変更を行ったこと、オリジナルの方が良いと思ったこと、あるいはコメントによって新しい方法を思いついたこと(オリジナルと提案された変更の両方が優れている) をレビュアーに知らせるのが良いマナーです。こうすることで、査読者は、あなたがコメントした事を実装したかどうかを判断するために、あなたのV2を検査する必要がなくなります。

査読者は、提案されたコミットログメッセージまたは変更自体のいずれかで、パッチセットに何を書き込んだかについて質問する場合があります。 応答メッセージでこれらの質問に答える必要がありますが、多くの場合、レビュー担当者が、あなたが何を書くつもりかを理解するためにこれらの質問をした理由は、パッチセットを理解するために説明が必要だったためです。

レビュアーの質問に答えて、レビュアーが「言いたいことがわかった」と言うだけで、満足してはいけないのです。 レビュアーが困っている点を明確にするためにパッチを更新し、v2を準備します。v1でレビュアーからの質問に答えるために使った言葉が、役に立つかもしれません。 あなたの目標は、v2を十分に明確にして、次に読む人に同じ説明をする必要がなくなるようにすることです。

コメントに対して反論する場合は、礼儀正しく、なぜあなたのオリジナルの方が良いと思うのかを説明します。レビュアーがまだあなたに同意しないかもしれないことや、コミュニティの他のメンバーが双方の側に意見するかもしれないことを覚悟してください。他のレビュアーは、あなたとは異なる視点でプロジェクトを見ており、あなたには思いもよらなかったような副作用について考えているかもしれません。なぜその変更が提案されたのか、あるいは査読者があなたに何を求めているのかがわからない場合は、いつでも説明を求めてかまいません。

あなたの電子メールクライアントにプレーンテキストの電子メールモードがあり、オンになっていることを確認してください。 GitメーリングリストはHTMLメールを拒否します。 Maintainer’s Note で概説されているメーリングリストのエチケットにも従ってください。 これは、ボトムポストやインラインリプライに関するほとんどのオープンソースコミュニティのエチケットルールに似ています。

コードに変更を加える場合、 git rebase -i (対話的リベース)を使用すると、最もクリーンになります。つまり、結果のコミットが最も見やすくなります。 O’Reillyの overview ご覧ください。 一般的な考え方は、変更が必要な各コミットを変更することです。 このようにすると、v1では間違いのあるパッチAと、問題なく上流のレビューも必要ないパッチBと、v2ではパッチAを修正したパッチC、を用意する代わりに、正しいパッチAと正しいパッチBでv2を出荷すればいいのです。これは履歴を変更していますが、誰とも共有していないローカル履歴なので、今のところは問題ありません。 (後でこれを行うのは意味がない場合があります。コンテキストについては、次のセクションを参照してください。)

After Review Approval

Gitプロジェクトには、 seennextmastermaint の4つの統合ブランチがあります。 変更は、レビュープロセスの途中で、メンテナによってかなり早い段階で「seen」(表示)されます。 そこから、より広範なテストの準備ができたら、next にマージされます。 多くの初期のテスターは next を使用し、問題を報告する可能性があります。 最終的に、 next を変更すると、通常は安定していると見なされる master になります。 最後に、新しいリリースが出ると、 maint がバグ修正のベースとして使用されます。 このドキュメントの冒頭で述べたように、さまざまな統合ブランチの使用に関する詳細については、「Documents/SubmittingPatches」を参照してください。

話を戻します。 今や、 あなたのコードは上流のレビューアから賞賛されています。 あなたのコードは完璧で、 受け入れられる準備ができています。 他に何もする必要はありません。 メンテナはトピックブランチを next にマージし、最高な気分ですおすし。

しかしながら、この時点以降に完全ではないことにあなたが気付いた場合は、あなたがプロセスのどこにいるかに応じて、いくつかの特別な手順を実行する必要があります。

メンテナが「What’s cooking in git.git」メールで、あなたのトピックに「next」のマークが付けられていることを発表した場合、つまり、トピックを「next」にマージする予定であるが、まだマージしていない場合は、 メンテナにもう少し待つように依頼するメールを送るべきです: 「シリーズのv4を送信し、 next のマークを付けましたが、これを変更する必要があります。v5を待ってからマージしてください。」

トピックがすでに next にマージされている場合は、git rebase -i でパッチを修正するのではなく、インクリメンタルに、つまり https://github.com/gitster/git にあるようにメンテナのトピックブランチを基点として別のコミットで変更を加えてください。 あなたの仕事はまだ同じトピックにありますが、トピックブランチの大規模な書き直しではなく、インクリメンタルになっています。

メンテナのGitHubのトピックブランチはGitGitGadgetにミラーリングされているため、レビューをそのように送信する場合は、適切なGitGitGadget/Gitブランチに対してPRを開く必要があります。

git send-email を使用している場合は、以前と同じように使用できますが、 <topic>..<mybranch> からdiffを生成し、 master の代わりに <topic> に基づいて作業する必要があります。