Git fork
at reftables-rust 1419 lines 56 kB view raw
1My First Contribution to the Git Project 2======================================== 3:sectanchors: 4 5[[summary]] 6== Summary 7 8This is a tutorial demonstrating the end-to-end workflow of creating a change to 9the Git tree, sending it for review, and making changes based on comments. 10 11[[prerequisites]] 12=== Prerequisites 13 14This tutorial assumes you're already fairly familiar with using Git to manage 15source code. The Git workflow steps will largely remain unexplained. 16 17[[related-reading]] 18=== Related Reading 19 20This tutorial aims to summarize the following documents, but the reader may find 21useful additional context: 22 23- `Documentation/SubmittingPatches` 24- `Documentation/howto/new-command.adoc` 25 26[[getting-help]] 27=== Getting Help 28 29If you get stuck, you can seek help in the following places. 30 31==== git@vger.kernel.org 32 33This is the main Git project mailing list where code reviews, version 34announcements, design discussions, and more take place. Those interested in 35contributing are welcome to post questions here. The Git list requires 36plain-text-only emails and prefers inline and bottom-posting when replying to 37mail; you will be CC'd in all replies to you. Optionally, you can subscribe to 38the list by sending an email to <git+subscribe@vger.kernel.org> 39(see https://subspace.kernel.org/subscribing.html for details). 40The https://lore.kernel.org/git[archive] of this mailing list is 41available to view in a browser. 42 43==== https://web.libera.chat/#git-devel[#git-devel] on Libera Chat 44 45This IRC channel is for conversations between Git contributors. If someone is 46currently online and knows the answer to your question, you can receive help 47in real time. Otherwise, you can read the 48https://colabti.org/irclogger/irclogger_logs/git-devel[scrollback] to see 49whether someone answered you. IRC does not allow offline private messaging, so 50if you try to private message someone and then log out of IRC, they cannot 51respond to you. It's better to ask your questions in the channel so that you 52can be answered if you disconnect and so that others can learn from the 53conversation. 54 55==== https://discord.gg/GRFVkzgxRd[#discord] on Discord 56This is an unofficial Git Discord server for everyone, from people just 57starting out with Git to those who develop it. It's a great place to ask 58questions, share tips, and connect with the broader Git community in real time. 59 60The server has channels for general discussions and specific channels for those 61who use Git and those who develop it. The server's search functionality also 62allows you to find previous conversations and answers to common questions. 63 64[[getting-started]] 65== Getting Started 66 67[[cloning]] 68=== Clone the Git Repository 69 70Git is mirrored in a number of locations. Clone the repository from one of them; 71https://git-scm.com/downloads suggests one of the best places to clone from is 72the mirror on GitHub. 73 74---- 75$ git clone https://github.com/git/git git 76$ cd git 77---- 78 79[[dependencies]] 80=== Installing Dependencies 81 82To build Git from source, you need to have a handful of dependencies installed 83on your system. For a hint of what's needed, you can take a look at 84`INSTALL`, paying close attention to the section about Git's dependencies on 85external programs and libraries. That document mentions a way to "test-drive" 86our freshly built Git without installing; that's the method we'll be using in 87this tutorial. 88 89Make sure that your environment has everything you need by building your brand 90new clone of Git from the above step: 91 92---- 93$ make 94---- 95 96NOTE: The Git build is parallelizable. `-j#` is not included above but you can 97use it as you prefer, here and elsewhere. 98 99[[identify-problem]] 100=== Identify Problem to Solve 101 102//// 103Use + to indicate fixed-width here; couldn't get ` to work nicely with the 104quotes around "Pony Saying 'Um, Hello'". 105//// 106In this tutorial, we will add a new command, +git psuh+, short for ``Pony Saying 107`Um, Hello''' - a feature which has gone unimplemented despite a high frequency 108of invocation during users' typical daily workflow. 109 110(We've seen some other effort in this space with the implementation of popular 111commands such as `sl`.) 112 113[[setup-workspace]] 114=== Set Up Your Workspace 115 116Let's start by making a development branch to work on our changes. Per 117`Documentation/SubmittingPatches`, since a brand new command is a new feature, 118it's fine to base your work on `master`. However, in the future for bugfixes, 119etc., you should check that document and base it on the appropriate branch. 120 121For the purposes of this document, we will base all our work on the `master` 122branch of the upstream project. Create the `psuh` branch you will use for 123development like so: 124 125---- 126$ git checkout -b psuh origin/master 127---- 128 129We'll make a number of commits here in order to demonstrate how to send a topic 130with multiple patches up for review simultaneously. 131 132[[code-it-up]] 133== Code It Up! 134 135NOTE: A reference implementation can be found at 136https://github.com/nasamuffin/git/tree/psuh. 137 138[[add-new-command]] 139=== Adding a New Command 140 141Lots of the subcommands are written as builtins, which means they are 142implemented in C and compiled into the main `git` executable. Implementing the 143very simple `psuh` command as a built-in will demonstrate the structure of the 144codebase, the internal API, and the process of working together as a contributor 145with the reviewers and maintainer to integrate this change into the system. 146 147Built-in subcommands are typically implemented in a function named "cmd_" 148followed by the name of the subcommand, in a source file named after the 149subcommand and contained within `builtin/`. So it makes sense to implement your 150command in `builtin/psuh.c`. Create that file, and within it, write the entry 151point for your command in a function matching the style and signature: 152 153---- 154int cmd_psuh(int argc UNUSED, const char **argv UNUSED, 155 const char *prefix UNUSED, struct repository *repo UNUSED) 156---- 157 158A few things to note: 159 160* A subcommand implementation takes its command line arguments 161 in `int argc` + `const char **argv`, like `main()` would. 162 163* It also takes two extra parameters, `prefix` and `repo`. What 164 they mean will not be discussed until much later. 165 166* Because this first example will not use any of the parameters, 167 your compiler will give warnings on unused parameters. As the 168 list of these four parameters is mandated by the API to add 169 new built-in commands, you cannot omit them. Instead, you add 170 `UNUSED` to each of them to tell the compiler that you *know* 171 you are not (yet) using it. 172 173We'll also need to add the declaration of psuh; open up `builtin.h`, find the 174declaration for `cmd_pull`, and add a new line for `psuh` immediately before it, 175in order to keep the declarations alphabetically sorted: 176 177---- 178int cmd_psuh(int argc, const char **argv, const char *prefix, struct repository *repo); 179---- 180 181Be sure to `#include "builtin.h"` in your `psuh.c`. You'll also need to 182`#include "gettext.h"` to use functions related to printing output text. 183 184Go ahead and add some throwaway printf to the `cmd_psuh` function. This is a 185decent starting point as we can now add build rules and register the command. 186 187NOTE: Your throwaway text, as well as much of the text you will be adding over 188the course of this tutorial, is user-facing. That means it needs to be 189localizable. Take a look at `po/README` under "Marking strings for translation". 190Throughout the tutorial, we will mark strings for translation as necessary; you 191should also do so when writing your user-facing commands in the future. 192 193---- 194int cmd_psuh(int argc UNUSED, const char **argv UNUSED, 195 const char *prefix UNUSED, struct repository *repo UNUSED) 196{ 197 printf(_("Pony saying hello goes here.\n")); 198 return 0; 199} 200---- 201 202Let's try to build it. Open `Makefile`, find where `builtin/pull.o` is added 203to `BUILTIN_OBJS`, and add `builtin/psuh.o` in the same way next to it in 204alphabetical order. Once you've done so, move to the top-level directory and 205build simply with `make`. Also add the `DEVELOPER=1` variable to turn on 206some additional warnings: 207 208---- 209$ echo DEVELOPER=1 >config.mak 210$ make 211---- 212 213NOTE: When you are developing the Git project, it's preferred that you use the 214`DEVELOPER` flag; if there's some reason it doesn't work for you, you can turn 215it off, but it's a good idea to mention the problem to the mailing list. 216 217Great, now your new command builds happily on its own. But nobody invokes it. 218Let's change that. 219 220The list of commands lives in `git.c`. We can register a new command by adding 221a `cmd_struct` to the `commands[]` array. `struct cmd_struct` takes a string 222with the command name, a function pointer to the command implementation, and a 223setup option flag. For now, let's keep mimicking `push`. Find the line where 224`cmd_push` is registered, copy it, and modify it for `cmd_psuh`, placing the new 225line in alphabetical order (immediately before `cmd_pull`). 226 227The options are documented in `builtin.h` under "Adding a new built-in." Since 228we hope to print some data about the user's current workspace context later, 229we need a Git directory, so choose `RUN_SETUP` as your only option. 230 231Go ahead and build again. You should see a clean build, so let's kick the tires 232and see if it works. There's a binary you can use to test with in the 233`bin-wrappers` directory. 234 235---- 236$ ./bin-wrappers/git psuh 237---- 238 239Check it out! You've got a command! Nice work! Let's commit this. 240 241`git status` reveals modified `Makefile`, `builtin.h`, and `git.c` as well as 242untracked `builtin/psuh.c` and `git-psuh`. First, let's take care of the binary, 243which should be ignored. Open `.gitignore` in your editor, find `/git-pull`, and 244add an entry for your new command in alphabetical order: 245 246---- 247... 248/git-prune-packed 249/git-psuh 250/git-pull 251/git-push 252/git-quiltimport 253/git-range-diff 254... 255---- 256 257Checking `git status` again should show that `git-psuh` has been removed from 258the untracked list and `.gitignore` has been added to the modified list. Now we 259can stage and commit: 260 261---- 262$ git add Makefile builtin.h builtin/psuh.c git.c .gitignore 263$ git commit -s 264---- 265 266You will be presented with your editor in order to write a commit message. Start 267the commit with a 50-column or less subject line, including the name of the 268component you're working on, followed by a blank line (always required) and then 269the body of your commit message, which should provide the bulk of the context. 270Remember to be explicit and provide the "Why" of your change, especially if it 271couldn't easily be understood from your diff. When editing your commit message, 272don't remove the `Signed-off-by` trailer which was added by `-s` above. 273 274---- 275psuh: add a built-in by popular demand 276 277Internal metrics indicate this is a command many users expect to be 278present. So here's an implementation to help drive customer 279satisfaction and engagement: a pony which doubtfully greets the user, 280or, a Pony Saying "Um, Hello" (PSUH). 281 282This commit message is intentionally formatted to 72 columns per line, 283starts with a single line as "commit message subject" that is written as 284if to command the codebase to do something (add this, teach a command 285that). The body of the message is designed to add information about the 286commit that is not readily deduced from reading the associated diff, 287such as answering the question "why?". 288 289Signed-off-by: A U Thor <author@example.com> 290---- 291 292Go ahead and inspect your new commit with `git show`. "psuh:" indicates you 293have modified mainly the `psuh` command. The subject line gives readers an idea 294of what you've changed. The sign-off line (`-s`) indicates that you agree to 295the Developer's Certificate of Origin 1.1 (see the 296`Documentation/SubmittingPatches` +++[[dco]]+++ header). 297 298For the remainder of the tutorial, the subject line only will be listed for the 299sake of brevity. However, fully-fleshed example commit messages are available 300on the reference implementation linked at the top of this document. 301 302[[implementation]] 303=== Implementation 304 305It's probably useful to do at least something besides printing out a string. 306Let's start by having a look at everything we get. 307 308Modify your `cmd_psuh` implementation to dump the args you're passed, 309keeping existing `printf()` calls in place; because the args are now 310used, remove the `UNUSED` macro from them: 311 312---- 313 int i; 314 315 ... 316 317 printf(Q_("Your args (there is %d):\n", 318 "Your args (there are %d):\n", 319 argc), 320 argc); 321 for (i = 0; i < argc; i++) 322 printf("%d: %s\n", i, argv[i]); 323 324 printf(_("Your current working directory:\n<top-level>%s%s\n"), 325 prefix ? "/" : "", prefix ? prefix : ""); 326 327---- 328 329Build and try it. As you may expect, there's pretty much just whatever we give 330on the command line, including the name of our command. (If `prefix` is empty 331for you, try `cd Documentation/ && ../bin-wrappers/git psuh`). That's not so 332helpful. So what other context can we get? 333 334Add a line to `#include "config.h"` and `#include "repository.h"`. 335Then, add the following bits to the function body: 336function body: 337 338---- 339 const char *cfg_name; 340 341... 342 343 repo_config(repo, git_default_config, NULL); 344 if (repo_config_get_string_tmp(repo, "user.name", &cfg_name)) 345 printf(_("No name is found in config\n")); 346 else 347 printf(_("Your name: %s\n"), cfg_name); 348---- 349 350`repo_config()` will grab the configuration from config files known to Git and 351apply standard precedence rules. `repo_config_get_string_tmp()` will look up 352a specific key ("user.name") and give you the value. There are a number of 353single-key lookup functions like this one; you can see them all (and more info 354about how to use `repo_config()`) in `Documentation/technical/api-config.adoc`. 355 356You should see that the name printed matches the one you see when you run: 357 358---- 359$ git config --get user.name 360---- 361 362Great! Now we know how to check for values in the Git config. Let's commit this 363too, so we don't lose our progress. 364 365---- 366$ git add builtin/psuh.c 367$ git commit -sm "psuh: show parameters & config opts" 368---- 369 370NOTE: Again, the above is for sake of brevity in this tutorial. In a real change 371you should not use `-m` but instead use the editor to write a meaningful 372message. 373 374Still, it'd be nice to know what the user's working context is like. Let's see 375if we can print the name of the user's current branch. We can mimic the 376`git status` implementation; the printer is located in `wt-status.c` and we can 377see that the branch is held in a `struct wt_status`. 378 379`wt_status_print()` gets invoked by `cmd_status()` in `builtin/commit.c`. 380Looking at that implementation we see the status config being populated like so: 381 382---- 383status_init_config(&s, git_status_config); 384---- 385 386But as we drill down, we can find that `status_init_config()` wraps a call 387to `repo_config()`. Let's modify the code we wrote in the previous commit. 388 389Be sure to include the header to allow you to use `struct wt_status`: 390 391---- 392#include "wt-status.h" 393---- 394 395Then modify your `cmd_psuh` implementation to declare your `struct wt_status`, 396prepare it, and print its contents: 397 398---- 399 struct wt_status status; 400 401... 402 403 wt_status_prepare(repo, &status); 404 repo_config(repo, git_default_config, &status); 405 406... 407 408 printf(_("Your current branch: %s\n"), status.branch); 409---- 410 411Run it again. Check it out - here's the (verbose) name of your current branch! 412 413Let's commit this as well. 414 415---- 416$ git add builtin/psuh.c 417$ git commit -sm "psuh: print the current branch" 418---- 419 420Now let's see if we can get some info about a specific commit. 421 422Luckily, there are some helpers for us here. `commit.h` has a function called 423`lookup_commit_reference_by_name` to which we can simply provide a hardcoded 424string; `pretty.h` has an extremely handy `pp_commit_easy()` call which doesn't 425require a full format object to be passed. 426 427Add the following includes: 428 429---- 430#include "commit.h" 431#include "pretty.h" 432---- 433 434Then, add the following lines within your implementation of `cmd_psuh()` near 435the declarations and the logic, respectively. 436 437---- 438 struct commit *c = NULL; 439 struct strbuf commitline = STRBUF_INIT; 440 441... 442 443 c = lookup_commit_reference_by_name("origin/master"); 444 445 if (c != NULL) { 446 pp_commit_easy(CMIT_FMT_ONELINE, c, &commitline); 447 printf(_("Current commit: %s\n"), commitline.buf); 448 } 449---- 450 451The `struct strbuf` provides some safety belts to your basic `char*`, one of 452which is a length member to prevent buffer overruns. It needs to be initialized 453nicely with `STRBUF_INIT`. Keep it in mind when you need to pass around `char*`. 454 455`lookup_commit_reference_by_name` resolves the name you pass it, so you can play 456with the value there and see what kind of things you can come up with. 457 458`pp_commit_easy` is a convenience wrapper in `pretty.h` that takes a single 459format enum shorthand, rather than an entire format struct. It then 460pretty-prints the commit according to that shorthand. These are similar to the 461formats available with `--pretty=FOO` in many Git commands. 462 463Build it and run, and if you're using the same name in the example, you should 464see the subject line of the most recent commit in `origin/master` that you know 465about. Neat! Let's commit that as well. 466 467---- 468$ git add builtin/psuh.c 469$ git commit -sm "psuh: display the top of origin/master" 470---- 471 472[[add-documentation]] 473=== Adding Documentation 474 475Awesome! You've got a fantastic new command that you're ready to share with the 476community. But hang on just a minute - this isn't very user-friendly. Run the 477following: 478 479---- 480$ ./bin-wrappers/git help psuh 481---- 482 483Your new command is undocumented! Let's fix that. 484 485Take a look at `Documentation/git-*.adoc`. These are the manpages for the 486subcommands that Git knows about. You can open these up and take a look to get 487acquainted with the format, but then go ahead and make a new file 488`Documentation/git-psuh.adoc`. Like with most of the documentation in the Git 489project, help pages are written with AsciiDoc (see CodingGuidelines, "Writing 490Documentation" section). Use the following template to fill out your own 491manpage: 492 493// Surprisingly difficult to embed AsciiDoc source within AsciiDoc. 494[listing] 495.... 496git-psuh(1) 497=========== 498 499NAME 500---- 501git-psuh - Delight users' typo with a shy horse 502 503 504SYNOPSIS 505-------- 506[verse] 507'git-psuh [<arg>...]' 508 509DESCRIPTION 510----------- 511... 512 513OPTIONS[[OPTIONS]] 514------------------ 515... 516 517OUTPUT 518------ 519... 520 521GIT 522--- 523Part of the linkgit:git[1] suite 524.... 525 526The most important pieces of this to note are the file header, underlined by =, 527the NAME section, and the SYNOPSIS, which would normally contain the grammar if 528your command took arguments. Try to use well-established manpage headers so your 529documentation is consistent with other Git and UNIX manpages; this makes life 530easier for your user, who can skip to the section they know contains the 531information they need. 532 533NOTE: Before trying to build the docs, make sure you have the package `asciidoc` 534installed. 535 536Now that you've written your manpage, you'll need to build it explicitly. We 537convert your AsciiDoc to troff which is man-readable like so: 538 539---- 540$ make all doc 541$ man Documentation/git-psuh.1 542---- 543 544or 545 546---- 547$ make -C Documentation/ git-psuh.1 548$ man Documentation/git-psuh.1 549---- 550 551While this isn't as satisfying as running through `git help`, you can at least 552check that your help page looks right. 553 554You can also check that the documentation coverage is good (that is, the project 555sees that your command has been implemented as well as documented) by running 556`make check-docs` from the top-level. 557 558Go ahead and commit your new documentation change. 559 560[[add-usage]] 561=== Adding Usage Text 562 563Try and run `./bin-wrappers/git psuh -h`. Your command should crash at the end. 564That's because `-h` is a special case which your command should handle by 565printing usage. 566 567Take a look at `Documentation/technical/api-parse-options.adoc`. This is a handy 568tool for pulling out options you need to be able to handle, and it takes a 569usage string. 570 571In order to use it, we'll need to prepare a NULL-terminated array of usage 572strings and a `builtin_psuh_options` array. 573 574Add a line to `#include "parse-options.h"`. 575 576At global scope, add your array of usage strings: 577 578---- 579static const char * const psuh_usage[] = { 580 N_("git psuh [<arg>...]"), 581 NULL, 582}; 583---- 584 585Then, within your `cmd_psuh()` implementation, we can declare and populate our 586`option` struct. Ours is pretty boring but you can add more to it if you want to 587explore `parse_options()` in more detail: 588 589---- 590 struct option options[] = { 591 OPT_END() 592 }; 593---- 594 595Finally, before you print your args and prefix, add the call to 596`parse-options()`: 597 598---- 599 argc = parse_options(argc, argv, prefix, options, psuh_usage, 0); 600---- 601 602This call will modify your `argv` parameter. It will strip the options you 603specified in `options` from `argv` and the locations pointed to from `options` 604entries will be updated. Be sure to replace your `argc` with the result from 605`parse_options()`, or you will be confused if you try to parse `argv` later. 606 607It's worth noting the special argument `--`. As you may be aware, many Unix 608commands use `--` to indicate "end of named parameters" - all parameters after 609the `--` are interpreted merely as positional arguments. (This can be handy if 610you want to pass as a parameter something which would usually be interpreted as 611a flag.) `parse_options()` will terminate parsing when it reaches `--` and give 612you the rest of the options afterwards, untouched. 613 614Now that you have a usage hint, you can teach Git how to show it in the general 615command list shown by `git help git` or `git help -a`, which is generated from 616`command-list.txt`. Find the line for 'git-pull' so you can add your 'git-psuh' 617line above it in alphabetical order. Now, we can add some attributes about the 618command which impacts where it shows up in the aforementioned help commands. The 619top of `command-list.txt` shares some information about what each attribute 620means; in those help pages, the commands are sorted according to these 621attributes. `git psuh` is user-facing, or porcelain - so we will mark it as 622"mainporcelain". For "mainporcelain" commands, the comments at the top of 623`command-list.txt` indicate we can also optionally add an attribute from another 624list; since `git psuh` shows some information about the user's workspace but 625doesn't modify anything, let's mark it as "info". Make sure to keep your 626attributes in the same style as the rest of `command-list.txt` using spaces to 627align and delineate them: 628 629---- 630git-prune-packed plumbingmanipulators 631git-psuh mainporcelain info 632git-pull mainporcelain remote 633git-push mainporcelain remote 634---- 635 636Build again. Now, when you run with `-h`, you should see your usage printed and 637your command terminated before anything else interesting happens. Great! 638 639Go ahead and commit this one, too. 640 641[[testing]] 642== Testing 643 644It's important to test your code - even for a little toy command like this one. 645Moreover, your patch won't be accepted into the Git tree without tests. Your 646tests should: 647 648* Illustrate the current behavior of the feature 649* Prove the current behavior matches the expected behavior 650* Ensure the externally-visible behavior isn't broken in later changes 651 652So let's write some tests. 653 654Related reading: `t/README` 655 656[[overview-test-structure]] 657=== Overview of Testing Structure 658 659The tests in Git live in `t/` and are named with a 4-digit decimal number using 660the schema shown in the Naming Tests section of `t/README`. 661 662[[write-new-test]] 663=== Writing Your Test 664 665Since this a toy command, let's go ahead and name the test with t9999. However, 666as many of the family/subcmd combinations are full, best practice seems to be 667to find a command close enough to the one you've added and share its naming 668space. 669 670Create a new file `t/t9999-psuh-tutorial.sh`. Begin with the header as so (see 671"Writing Tests" and "Source 'test-lib.sh'" in `t/README`): 672 673---- 674#!/bin/sh 675 676test_description='git-psuh test 677 678This test runs git-psuh and makes sure it does not crash.' 679 680. ./test-lib.sh 681---- 682 683Tests are framed inside of a `test_expect_success` in order to output TAP 684formatted results. Let's make sure that `git psuh` doesn't exit poorly and does 685mention the right animal somewhere: 686 687---- 688test_expect_success 'runs correctly with no args and good output' ' 689 git psuh >actual && 690 grep Pony actual 691' 692---- 693 694Indicate that you've run everything you wanted by adding the following at the 695bottom of your script: 696 697---- 698test_done 699---- 700 701Make sure you mark your test script executable: 702 703---- 704$ chmod +x t/t9999-psuh-tutorial.sh 705---- 706 707You can get an idea of whether you created your new test script successfully 708by running `make -C t test-lint`, which will check for things like test number 709uniqueness, executable bit, and so on. 710 711[[local-test]] 712=== Running Locally 713 714Let's try and run locally: 715 716---- 717$ make 718$ cd t/ && prove t9999-psuh-tutorial.sh 719---- 720 721You can run the full test suite and ensure `git-psuh` didn't break anything: 722 723---- 724$ cd t/ 725$ prove -j$(nproc) --shuffle t[0-9]*.sh 726---- 727 728NOTE: You can also do this with `make test` or use any testing harness which can 729speak TAP. `prove` can run concurrently. `shuffle` randomizes the order the 730tests are run in, which makes them resilient against unwanted inter-test 731dependencies. `prove` also makes the output nicer. 732 733Go ahead and commit this change, as well. 734 735[[ready-to-share]] 736== Getting Ready to Share: Anatomy of a Patch Series 737 738You may have noticed already that the Git project performs its code reviews via 739emailed patches, which are then applied by the maintainer when they are ready 740and approved by the community. The Git project does not accept contributions from 741pull requests, and the patches emailed for review need to be formatted a 742specific way. 743 744:patch-series: https://lore.kernel.org/git/pull.1218.git.git.1645209647.gitgitgadget@gmail.com/ 745:lore: https://lore.kernel.org/git/ 746 747Before taking a look at how to convert your commits into emailed patches, 748let's analyze what the end result, a "patch series", looks like. Here is an 749{patch-series}[example] of the summary view for a patch series on the web interface of 750the {lore}[Git mailing list archive]: 751 752---- 7532022-02-18 18:40 [PATCH 0/3] libify reflog John Cai via GitGitGadget 7542022-02-18 18:40 ` [PATCH 1/3] reflog: libify delete reflog function and helpers John Cai via GitGitGadget 7552022-02-18 19:10 ` Ævar Arnfjörð Bjarmason [this message] 7562022-02-18 19:39 ` Taylor Blau 7572022-02-18 19:48 ` Ævar Arnfjörð Bjarmason 7582022-02-18 19:35 ` Taylor Blau 7592022-02-21 1:43 ` John Cai 7602022-02-21 1:50 ` Taylor Blau 7612022-02-23 19:50 ` John Cai 7622022-02-18 20:00 ` // other replies elided 7632022-02-18 18:40 ` [PATCH 2/3] reflog: call reflog_delete from reflog.c John Cai via GitGitGadget 7642022-02-18 19:15 ` Ævar Arnfjörð Bjarmason 7652022-02-18 20:26 ` Junio C Hamano 7662022-02-18 18:40 ` [PATCH 3/3] stash: call reflog_delete from reflog.c John Cai via GitGitGadget 7672022-02-18 19:20 ` Ævar Arnfjörð Bjarmason 7682022-02-19 0:21 ` Taylor Blau 7692022-02-22 2:36 ` John Cai 7702022-02-22 10:51 ` Ævar Arnfjörð Bjarmason 7712022-02-18 19:29 ` [PATCH 0/3] libify reflog Ævar Arnfjörð Bjarmason 7722022-02-22 18:30 ` [PATCH v2 0/3] libify reflog John Cai via GitGitGadget 7732022-02-22 18:30 ` [PATCH v2 1/3] stash: add test to ensure reflog --rewrite --updatref behavior John Cai via GitGitGadget 7742022-02-23 8:54 ` Ævar Arnfjörð Bjarmason 7752022-02-23 21:27 ` Junio C Hamano 776// continued 777---- 778 779We can note a few things: 780 781- Each commit is sent as a separate email, with the commit message title as 782 subject, prefixed with "[PATCH _i_/_n_]" for the _i_-th commit of an 783 _n_-commit series. 784- Each patch is sent as a reply to an introductory email called the _cover 785 letter_ of the series, prefixed "[PATCH 0/_n_]". 786- Subsequent iterations of the patch series are labelled "PATCH v2", "PATCH 787 v3", etc. in place of "PATCH". For example, "[PATCH v2 1/3]" would be the first of 788 three patches in the second iteration. Each iteration is sent with a new cover 789 letter (like "[PATCH v2 0/3]" above), itself a reply to the cover letter of the 790 previous iteration (more on that below). 791 792NOTE: A single-patch topic is sent with "[PATCH]", "[PATCH v2]", etc. without 793_i_/_n_ numbering (in the above thread overview, no single-patch topic appears, 794though). 795 796[[cover-letter]] 797=== The cover letter 798 799In addition to an email per patch, the Git community also expects your patches 800to come with a cover letter. This is an important component of change 801submission as it explains to the community from a high level what you're trying 802to do, and why, in a way that's more apparent than just looking at your 803patches. 804 805The title of your cover letter should be something which succinctly covers the 806purpose of your entire topic branch. It's often in the imperative mood, just 807like our commit message titles. Here is how we'll title our series: 808 809--- 810Add the 'psuh' command 811--- 812 813The body of the cover letter is used to give additional context to reviewers. 814Be sure to explain anything your patches don't make clear on their own, but 815remember that since the cover letter is not recorded in the commit history, 816anything that might be useful to future readers of the repository's history 817should also be in your commit messages. 818 819Here's an example body for `psuh`: 820 821---- 822Our internal metrics indicate widespread interest in the command 823git-psuh - that is, many users are trying to use it, but finding it is 824unavailable, using some unknown workaround instead. 825 826The following handful of patches add the psuh command and implement some 827handy features on top of it. 828 829This patchset is part of the MyFirstContribution tutorial and should not 830be merged. 831---- 832 833At this point the tutorial diverges, in order to demonstrate two 834different methods of formatting your patchset and getting it reviewed. 835 836The first method to be covered is GitGitGadget, which is useful for those 837already familiar with GitHub's common pull request workflow. This method 838requires a GitHub account. 839 840The second method to be covered is `git send-email`, which can give slightly 841more fine-grained control over the emails to be sent. This method requires some 842setup which can change depending on your system and will not be covered in this 843tutorial. 844 845Regardless of which method you choose, your engagement with reviewers will be 846the same; the review process will be covered after the sections on GitGitGadget 847and `git send-email`. 848 849[[howto-ggg]] 850== Sending Patches via GitGitGadget 851 852One option for sending patches is to follow a typical pull request workflow and 853send your patches out via GitGitGadget. GitGitGadget is a tool created by 854Johannes Schindelin to make life as a Git contributor easier for those used to 855the GitHub PR workflow. It allows contributors to open pull requests against its 856mirror of the Git project, and does some magic to turn the PR into a set of 857emails and send them out for you. It also runs the Git continuous integration 858suite for you. It's documented at https://gitgitgadget.github.io/. 859 860[[create-fork]] 861=== Forking `git/git` on GitHub 862 863Before you can send your patch off to be reviewed using GitGitGadget, you will 864need to fork the Git project and upload your changes. First thing - make sure 865you have a GitHub account. 866 867Head to the https://github.com/git/git[GitHub mirror] and look for the Fork 868button. Place your fork wherever you deem appropriate and create it. 869 870[[upload-to-fork]] 871=== Uploading to Your Own Fork 872 873To upload your branch to your own fork, you'll need to add the new fork as a 874remote. You can use `git remote -v` to show the remotes you have added already. 875From your new fork's page on GitHub, you can press "Clone or download" to get 876the URL; then you need to run the following to add, replacing your own URL and 877remote name for the examples provided: 878 879---- 880$ git remote add remotename git@github.com:remotename/git.git 881---- 882 883or to use the HTTPS URL: 884 885---- 886$ git remote add remotename https://github.com/remotename/git/.git 887---- 888 889Run `git remote -v` again and you should see the new remote showing up. 890`git fetch remotename` (with the real name of your remote replaced) in order to 891get ready to push. 892 893Next, double-check that you've been doing all your development in a new branch 894by running `git branch`. If you didn't, now is a good time to move your new 895commits to their own branch. 896 897As mentioned briefly at the beginning of this document, we are basing our work 898on `master`, so go ahead and update as shown below, or using your preferred 899workflow. 900 901---- 902$ git checkout master 903$ git pull -r 904$ git rebase master psuh 905---- 906 907Finally, you're ready to push your new topic branch! (Due to our branch and 908command name choices, be careful when you type the command below.) 909 910---- 911$ git push remotename psuh 912---- 913 914Now you should be able to go and check out your newly created branch on GitHub. 915 916[[send-pr-ggg]] 917=== Sending a PR to GitGitGadget 918 919In order to have your code tested and formatted for review, you need to start by 920opening a Pull Request against either `gitgitgadget/git` or `git/git`. Head to 921https://github.com/gitgitgadget/git or https://github.com/git/git and open a PR 922either with the "New pull request" button or the convenient "Compare & pull 923request" button that may appear with the name of your newly pushed branch. 924 925The differences between using `gitgitgadget/git` and `git/git` as your base can 926be found [here](https://gitgitgadget.github.io/#should-i-use-gitgitgadget-on-gitgitgadgets-git-fork-or-on-gits-github-mirror) 927 928Review the PR's title and description, as they're used by GitGitGadget 929respectively as the subject and body of the cover letter for your change. Refer 930to <<cover-letter,"The cover letter">> above for advice on how to title your 931submission and what content to include in the description. 932 933NOTE: For single-patch contributions, your commit message should already be 934meaningful and explain at a high level the purpose (what is happening and why) 935of your patch, so you usually do not need any additional context. In that case, 936remove the PR description that GitHub automatically generates from your commit 937message (your PR description should be empty). If you do need to supply even 938more context, you can do so in that space and it will be appended to the email 939that GitGitGadget will send, between the three-dash line and the diffstat 940(see <<single-patch,Bonus Chapter: One-Patch Changes>> for how this looks once 941submitted). 942 943When you're happy, submit your pull request. 944 945[[run-ci-ggg]] 946=== Running CI and Getting Ready to Send 947 948If it's your first time using GitGitGadget (which is likely, as you're using 949this tutorial) then someone will need to give you permission to use the tool. 950As mentioned in the GitGitGadget documentation, you just need someone who 951already uses it to comment on your PR with `/allow <username>`. GitGitGadget 952will automatically run your PRs through the CI even without the permission given 953but you will not be able to `/submit` your changes until someone allows you to 954use the tool. 955 956NOTE: You can typically find someone who can `/allow` you on GitGitGadget by 957either examining recent pull requests where someone has been granted `/allow` 958(https://github.com/gitgitgadget/git/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+%22%2Fallow%22[Search: 959is:pr is:open "/allow"]), in which case both the author and the person who 960granted the `/allow` can now `/allow` you, or by inquiring on the 961https://web.libera.chat/#git-devel[#git-devel] IRC channel on Libera Chat 962linking your pull request and asking for someone to `/allow` you. 963 964If the CI fails, you can update your changes with `git rebase -i` and push your 965branch again: 966 967---- 968$ git push -f remotename psuh 969---- 970 971In fact, you should continue to make changes this way up until the point when 972your patch is accepted into `next`. 973 974//// 975TODO https://github.com/gitgitgadget/gitgitgadget/issues/83 976It'd be nice to be able to verify that the patch looks good before sending it 977to everyone on Git mailing list. 978[[check-work-ggg]] 979=== Check Your Work 980//// 981 982[[send-mail-ggg]] 983=== Sending Your Patches 984 985Now that your CI is passing and someone has granted you permission to use 986GitGitGadget with the `/allow` command, sending out for review is as simple as 987commenting on your PR with `/submit`. 988 989[[responding-ggg]] 990=== Updating With Comments 991 992Skip ahead to <<reviewing,Responding to Reviews>> for information on how to 993reply to review comments you will receive on the mailing list. 994 995Once you have your branch again in the shape you want following all review 996comments, you can submit again: 997 998---- 999$ git push -f remotename psuh 1000---- 1001 1002Next, go look at your pull request against GitGitGadget; you should see the CI 1003has been kicked off again. Now while the CI is running is a good time for you 1004to modify your description at the top of the pull request thread; it will be 1005used again as the cover letter. You should use this space to describe what 1006has changed since your previous version, so that your reviewers have some idea 1007of what they're looking at. When the CI is done running, you can comment once 1008more with `/submit` - GitGitGadget will automatically add a v2 mark to your 1009changes. 1010 1011[[howto-git-send-email]] 1012== Sending Patches with `git send-email` 1013 1014If you don't want to use GitGitGadget, you can also use Git itself to mail your 1015patches. Some benefits of using Git this way include finer grained control of 1016subject line (for example, being able to use the tag [RFC PATCH] in the subject) 1017and being able to send a ``dry run'' mail to yourself to ensure it all looks 1018good before going out to the list. 1019 1020[[setup-git-send-email]] 1021=== Prerequisite: Setting Up `git send-email` 1022 1023Configuration for `send-email` can vary based on your operating system and email 1024provider, and so will not be covered in this tutorial, beyond stating that in 1025many distributions of Linux, `git-send-email` is not packaged alongside the 1026typical `git` install. You may need to install this additional package; there 1027are a number of resources online to help you do so. You will also need to 1028determine the right way to configure it to use your SMTP server; again, as this 1029configuration can change significantly based on your system and email setup, it 1030is out of scope for the context of this tutorial. 1031 1032[[format-patch]] 1033=== Preparing Initial Patchset 1034 1035Sending emails with Git is a two-part process; before you can prepare the emails 1036themselves, you'll need to prepare the patches. Luckily, this is pretty simple: 1037 1038---- 1039$ git format-patch --cover-letter -o psuh/ --base=auto psuh@{u}..psuh 1040---- 1041 1042 . The `--cover-letter` option tells `format-patch` to create a 1043 cover letter template for you. You will need to fill in the 1044 template before you're ready to send - but for now, the template 1045 will be next to your other patches. 1046 1047 . The `-o psuh/` option tells `format-patch` to place the patch 1048 files into a directory. This is useful because `git send-email` 1049 can take a directory and send out all the patches from there. 1050 1051 . The `--base=auto` option tells the command to record the "base 1052 commit", on which the recipient is expected to apply the patch 1053 series. The `auto` value will cause `format-patch` to compute 1054 the base commit automatically, which is the merge base of tip 1055 commit of the remote-tracking branch and the specified revision 1056 range. 1057 1058 . The `psuh@{u}..psuh` option tells `format-patch` to generate 1059 patches for the commits you created on the `psuh` branch since it 1060 forked from its upstream (which is `origin/master` if you 1061 followed the example in the "Set up your workspace" section). If 1062 you are already on the `psuh` branch, you can just say `@{u}`, 1063 which means "commits on the current branch since it forked from 1064 its upstream", which is the same thing. 1065 1066The command will make one patch file per commit. After you 1067run, you can go have a look at each of the patches with your favorite text 1068editor and make sure everything looks alright; however, it's not recommended to 1069make code fixups via the patch file. It's a better idea to make the change the 1070normal way using `git rebase -i` or by adding a new commit than by modifying a 1071patch. 1072 1073NOTE: Optionally, you can also use the `--rfc` flag to prefix your patch subject 1074with ``[RFC PATCH]'' instead of ``[PATCH]''. RFC stands for ``request for 1075comments'' and indicates that while your code isn't quite ready for submission, 1076you'd like to begin the code review process. This can also be used when your 1077patch is a proposal, but you aren't sure whether the community wants to solve 1078the problem with that approach or not - to conduct a sort of design review. You 1079may also see on the list patches marked ``WIP'' - this means they are incomplete 1080but want reviewers to look at what they have so far. You can add this flag with 1081`--subject-prefix=WIP`. 1082 1083Check and make sure that your patches and cover letter template exist in the 1084directory you specified - you're nearly ready to send out your review! 1085 1086[[preparing-cover-letter]] 1087=== Preparing Email 1088 1089Since you invoked `format-patch` with `--cover-letter`, you've already got a 1090cover letter template ready. Open it up in your favorite editor. 1091 1092You should see a number of headers present already. Check that your `From:` 1093header is correct. Then modify your `Subject:` (see <<cover-letter,above>> for 1094how to choose good title for your patch series): 1095 1096---- 1097Subject: [PATCH 0/7] Add the 'psuh' command 1098---- 1099 1100Make sure you retain the ``[PATCH 0/X]'' part; that's what indicates to the Git 1101community that this email is the beginning of a patch series, and many 1102reviewers filter their email for this type of flag. 1103 1104You'll need to add some extra parameters when you invoke `git send-email` to add 1105the cover letter. 1106 1107Next you'll have to fill out the body of your cover letter. Again, see 1108<<cover-letter,above>> for what content to include. 1109 1110The template created by `git format-patch --cover-letter` includes a diffstat. 1111This gives reviewers a summary of what they're in for when reviewing your topic. 1112The one generated for `psuh` from the sample implementation looks like this: 1113 1114---- 1115 Documentation/git-psuh.adoc | 40 +++++++++++++++++++++ 1116 Makefile | 1 + 1117 builtin.h | 1 + 1118 builtin/psuh.c | 73 ++++++++++++++++++++++++++++++++++++++ 1119 git.c | 1 + 1120 t/t9999-psuh-tutorial.sh | 12 +++++++ 1121 6 files changed, 128 insertions(+) 1122 create mode 100644 Documentation/git-psuh.adoc 1123 create mode 100644 builtin/psuh.c 1124 create mode 100755 t/t9999-psuh-tutorial.sh 1125---- 1126 1127Finally, the letter will include the version of Git used to generate the 1128patches. You can leave that string alone. 1129 1130[[sending-git-send-email]] 1131=== Sending Email 1132 1133At this point you should have a directory `psuh/` which is filled with your 1134patches and a cover letter. Time to mail it out! You can send it like this: 1135 1136---- 1137$ git send-email --to=target@example.com psuh/*.patch 1138---- 1139 1140NOTE: Check `git help send-email` for some other options which you may find 1141valuable, such as changing the Reply-to address or adding more CC and BCC lines. 1142 1143:contrib-scripts: footnoteref:[contrib-scripts,Scripts under `contrib/` are + 1144not part of the core `git` binary and must be called directly. Clone the Git + 1145codebase and run `perl contrib/contacts/git-contacts`.] 1146 1147NOTE: If you're not sure whom to CC, running `contrib/contacts/git-contacts` can 1148list potential reviewers. In addition, you can do `git send-email 1149--cc-cmd='perl contrib/contacts/git-contacts' feature/*.patch`{contrib-scripts} to 1150automatically pass this list of emails to `send-email`. 1151 1152NOTE: When you are sending a real patch, it will go to git@vger.kernel.org - but 1153please don't send your patchset from the tutorial to the real mailing list! For 1154now, you can send it to yourself, to make sure you understand how it will look. 1155 1156After you run the command above, you will be presented with an interactive 1157prompt for each patch that's about to go out. This gives you one last chance to 1158edit or quit sending something (but again, don't edit code this way). Once you 1159press `y` or `a` at these prompts your emails will be sent! Congratulations! 1160 1161Awesome, now the community will drop everything and review your changes. (Just 1162kidding - be patient!) 1163 1164[[v2-git-send-email]] 1165=== Sending v2 1166 1167This section will focus on how to send a v2 of your patchset. To learn what 1168should go into v2, skip ahead to <<reviewing,Responding to Reviews>> for 1169information on how to handle comments from reviewers. 1170 1171We'll reuse our `psuh` topic branch for v2. Before we make any changes, we'll 1172mark the tip of our v1 branch for easy reference: 1173 1174---- 1175$ git checkout psuh 1176$ git branch psuh-v1 1177---- 1178 1179Refine your patch series by using `git rebase -i` to adjust commits based upon 1180reviewer comments. Once the patch series is ready for submission, generate your 1181patches again, but with some new flags: 1182 1183---- 1184$ git format-patch -v2 --cover-letter -o psuh/ --range-diff master..psuh-v1 master.. 1185---- 1186 1187The `--range-diff master..psuh-v1` parameter tells `format-patch` to include a 1188range-diff between `psuh-v1` and `psuh` in the cover letter (see 1189linkgit:git-range-diff[1]). This helps tell reviewers about the differences 1190between your v1 and v2 patches. 1191 1192The `-v2` parameter tells `format-patch` to output your patches 1193as version "2". For instance, you may notice that your v2 patches are 1194all named like `v2-000n-my-commit-subject.patch`. `-v2` will also format 1195your patches by prefixing them with "[PATCH v2]" instead of "[PATCH]", 1196and your range-diff will be prefaced with "Range-diff against v1". 1197 1198After you run this command, `format-patch` will output the patches to the `psuh/` 1199directory, alongside the v1 patches. Using a single directory makes it easy to 1200refer to the old v1 patches while proofreading the v2 patches, but you will need 1201to be careful to send out only the v2 patches. We will use a pattern like 1202`psuh/v2-*.patch` (not `psuh/*.patch`, which would match v1 and v2 patches). 1203 1204Edit your cover letter again. Now is a good time to mention what's different 1205between your last version and now, if it's something significant. You do not 1206need the exact same body in your second cover letter; focus on explaining to 1207reviewers the changes you've made that may not be as visible. 1208 1209You will also need to go and find the Message-ID of your previous cover letter. 1210You can either note it when you send the first series, from the output of `git 1211send-email`, or you can look it up on the 1212https://lore.kernel.org/git[mailing list]. Find your cover letter in the 1213archives, click on it, then click "permalink" or "raw" to reveal the Message-ID 1214header. It should match: 1215 1216---- 1217Message-ID: <foo.12345.author@example.com> 1218---- 1219 1220Your Message-ID is `<foo.12345.author@example.com>`. This example will be used 1221below as well; make sure to replace it with the correct Message-ID for your 1222**previous cover letter** - that is, if you're sending v2, use the Message-ID 1223from v1; if you're sending v3, use the Message-ID from v2. 1224 1225While you're looking at the email, you should also note who is CC'd, as it's 1226common practice in the mailing list to keep all CCs on a thread. You can add 1227these CC lines directly to your cover letter with a line like so in the header 1228(before the Subject line): 1229 1230---- 1231CC: author@example.com, Othe R <other@example.com> 1232---- 1233 1234Now send the emails again, paying close attention to which messages you pass in 1235to the command: 1236 1237---- 1238$ git send-email --to=target@example.com 1239 --in-reply-to="<foo.12345.author@example.com>" 1240 psuh/v2-*.patch 1241---- 1242 1243[[single-patch]] 1244=== Bonus Chapter: One-Patch Changes 1245 1246In some cases, your very small change may consist of only one patch. When that 1247happens, you only need to send one email. Your commit message should already be 1248meaningful and explain at a high level the purpose (what is happening and why) 1249of your patch, but if you need to supply even more context, you can do so below 1250the `---` in your patch. Take the example below, which was generated with `git 1251format-patch` on a single commit, and then edited to add the content between 1252the `---` and the diffstat. 1253 1254---- 1255From 1345bbb3f7ac74abde040c12e737204689a72723 Mon Sep 17 00:00:00 2001 1256From: A U Thor <author@example.com> 1257Date: Thu, 18 Apr 2019 15:11:02 -0700 1258Subject: [PATCH] README: change the grammar 1259 1260I think it looks better this way. This part of the commit message will 1261end up in the commit-log. 1262 1263Signed-off-by: A U Thor <author@example.com> 1264--- 1265Let's have a wild discussion about grammar on the mailing list. This 1266part of my email will never end up in the commit log. Here is where I 1267can add additional context to the mailing list about my intent, outside 1268of the context of the commit log. This section was added after `git 1269format-patch` was run, by editing the patch file in a text editor. 1270 1271 README.md | 2 +- 1272 1 file changed, 1 insertion(+), 1 deletion(-) 1273 1274diff --git a/README.md b/README.md 1275index 88f126184c..38da593a60 100644 1276--- a/README.md 1277+++ b/README.md 1278@@ -3,7 +3,7 @@ 1279 Git - fast, scalable, distributed revision control system 1280 ========================================================= 1281 1282-Git is a fast, scalable, distributed revision control system with an 1283+Git is a fast, scalable, and distributed revision control system with an 1284 unusually rich command set that provides both high-level operations 1285 and full access to internals. 1286 1287-- 12882.21.0.392.gf8f6787159e-goog 1289---- 1290 1291[[now-what]] 1292== My Patch Got Emailed - Now What? 1293 1294Please give reviewers enough time to process your initial patch before 1295sending an updated version. That is, resist the temptation to send a new 1296version immediately, because others may have already started reviewing 1297your initial version. 1298 1299While waiting for review comments, you may find mistakes in your initial 1300patch, or perhaps realize a different and better way to achieve the goal 1301of the patch. In this case you may communicate your findings to other 1302reviewers as follows: 1303 1304 - If the mistakes you found are minor, send a reply to your patch as if 1305 you were a reviewer and mention that you will fix them in an 1306 updated version. 1307 1308 - On the other hand, if you think you want to change the course so 1309 drastically that reviews on the initial patch would be a waste of 1310 time (for everyone involved), retract the patch immediately with 1311 a reply like "I am working on a much better approach, so please 1312 ignore this patch and wait for the updated version." 1313 1314Now, the above is a good practice if you sent your initial patch 1315prematurely without polish. But a better approach of course is to avoid 1316sending your patch prematurely in the first place. 1317 1318Please be considerate of the time needed by reviewers to examine each 1319new version of your patch. Rather than seeing the initial version right 1320now (followed by several "oops, I like this version better than the 1321previous one" patches over 2 days), reviewers would strongly prefer if a 1322single polished version came 2 days later instead, and that version with 1323fewer mistakes were the only one they would need to review. 1324 1325 1326[[reviewing]] 1327=== Responding to Reviews 1328 1329After a few days, you will hopefully receive a reply to your patchset with some 1330comments. Woohoo! Now you can get back to work. 1331 1332It's good manners to reply to each comment, notifying the reviewer that you have 1333made the change suggested, feel the original is better, or that the comment 1334inspired you to do something a new way which is superior to both the original 1335and the suggested change. This way reviewers don't need to inspect your v2 to 1336figure out whether you implemented their comment or not. 1337 1338Reviewers may ask you about what you wrote in the patchset, either in 1339the proposed commit log message or in the changes themselves. You 1340should answer these questions in your response messages, but often the 1341reason why reviewers asked these questions to understand what you meant 1342to write is because your patchset needed clarification to be understood. 1343 1344Do not be satisfied by just answering their questions in your response 1345and hear them say that they now understand what you wanted to say. 1346Update your patches to clarify the points reviewers had trouble with, 1347and prepare your v2; the words you used to explain your v1 to answer 1348reviewers' questions may be useful thing to use. Your goal is to make 1349your v2 clear enough so that it becomes unnecessary for you to give the 1350same explanation to the next person who reads it. 1351 1352If you are going to push back on a comment, be polite and explain why you feel 1353your original is better; be prepared that the reviewer may still disagree with 1354you, and the rest of the community may weigh in on one side or the other. As 1355with all code reviews, it's important to keep an open mind to doing something a 1356different way than you originally planned; other reviewers have a different 1357perspective on the project than you do, and may be thinking of a valid side 1358effect which had not occurred to you. It is always okay to ask for clarification 1359if you aren't sure why a change was suggested, or what the reviewer is asking 1360you to do. 1361 1362Make sure your email client has a plaintext email mode and it is turned on; the 1363Git list rejects HTML email. Please also follow the mailing list etiquette 1364outlined in the 1365https://kernel.googlesource.com/pub/scm/git/git/+/todo/MaintNotes[Maintainer's 1366Note], which are similar to etiquette rules in most open source communities 1367surrounding bottom-posting and inline replies. 1368 1369When you're making changes to your code, it is cleanest - that is, the resulting 1370commits are easiest to look at - if you use `git rebase -i` (interactive 1371rebase). Take a look at this 1372https://www.oreilly.com/library/view/git-pocket-guide/9781449327507/ch10.html[overview] 1373from O'Reilly. The general idea is to modify each commit which requires changes; 1374this way, instead of having a patch A with a mistake, a patch B which was fine 1375and required no upstream reviews in v1, and a patch C which fixes patch A for 1376v2, you can just ship a v2 with a correct patch A and correct patch B. This is 1377changing history, but since it's local history which you haven't shared with 1378anyone, that is okay for now! (Later, it may not make sense to do this; take a 1379look at the section below this one for some context.) 1380 1381[[after-approval]] 1382=== After Review Approval 1383 1384The Git project has four integration branches: `seen`, `next`, `master`, and 1385`maint`. Your change will be placed into `seen` fairly early on by the maintainer 1386while it is still in the review process; from there, when it is ready for wider 1387testing, it will be merged into `next`. Plenty of early testers use `next` and 1388may report issues. Eventually, changes in `next` will make it to `master`, 1389which is typically considered stable. Finally, when a new release is cut, 1390`maint` is used to base bugfixes onto. As mentioned at the beginning of this 1391document, you can read `Documents/SubmittingPatches` for some more info about 1392the use of the various integration branches. 1393 1394Back to now: your code has been lauded by the upstream reviewers. It is perfect. 1395It is ready to be accepted. You don't need to do anything else; the maintainer 1396will merge your topic branch to `next` and life is good. 1397 1398However, if you discover it isn't so perfect after this point, you may need to 1399take some special steps depending on where you are in the process. 1400 1401If the maintainer has announced in the "What's cooking in git.git" email that 1402your topic is marked for `next` - that is, that they plan to merge it to `next` 1403but have not yet done so - you should send an email asking the maintainer to 1404wait a little longer: "I've sent v4 of my series and you marked it for `next`, 1405but I need to change this and that - please wait for v5 before you merge it." 1406 1407If the topic has already been merged to `next`, rather than modifying your 1408patches with `git rebase -i`, you should make further changes incrementally - 1409that is, with another commit, based on top of the maintainer's topic branch as 1410detailed in https://github.com/gitster/git. Your work is still in the same topic 1411but is now incremental, rather than a wholesale rewrite of the topic branch. 1412 1413The topic branches in the maintainer's GitHub are mirrored in GitGitGadget, so 1414if you're sending your reviews out that way, you should be sure to open your PR 1415against the appropriate GitGitGadget/Git branch. 1416 1417If you're using `git send-email`, you can use it the same way as before, but you 1418should generate your diffs from `<topic>..<mybranch>` and base your work on 1419`<topic>` instead of `master`.