11My First Contribution to the Git Project
22========================================
3+ :sectanchors:
34
5+ [[summary]]
46== Summary
57
68This is a tutorial demonstrating the end-to-end workflow of creating a change to
79the Git tree, sending it for review, and making changes based on comments.
810
11+ [[prerequisites]]
912=== Prerequisites
1013
1114This tutorial assumes you're already fairly familiar with using Git to manage
1215source code. The Git workflow steps will largely remain unexplained.
1316
17+ [[related-reading]]
1418=== Related Reading
1519
1620This tutorial aims to summarize the following documents, but the reader may find
@@ -19,8 +23,10 @@ useful additional context:
1923- `Documentation/SubmittingPatches`
2024- `Documentation/howto/new-command.txt`
2125
26+ [[getting-started]]
2227== Getting Started
2328
29+ [[cloning]]
2430=== Clone the Git Repository
2531
2632Git is mirrored in a number of locations. Clone the repository from one of them;
@@ -31,6 +37,7 @@ the mirror on GitHub.
3137$ git clone https://github.com/git/git git
3238----
3339
40+ [[identify-problem]]
3441=== Identify Problem to Solve
3542
3643////
@@ -44,6 +51,7 @@ of invocation during users' typical daily workflow.
4451(We've seen some other effort in this space with the implementation of popular
4552commands such as `sl`.)
4653
54+ [[setup-workspace]]
4755=== Set Up Your Workspace
4856
4957Let's start by making a development branch to work on our changes. Per
@@ -62,11 +70,13 @@ $ git checkout -b psuh origin/master
6270We'll make a number of commits here in order to demonstrate how to send a topic
6371with multiple patches up for review simultaneously.
6472
73+ [[code-it-up]]
6574== Code It Up!
6675
6776NOTE: A reference implementation can be found at
6877https://github.com/nasamuffin/git/tree/psuh.
6978
79+ [[add-new-command]]
7080=== Adding a New Command
7181
7282Lots of the subcommands are written as builtins, which means they are
@@ -195,6 +205,7 @@ For the remainder of the tutorial, the subject line only will be listed for the
195205sake of brevity. However, fully-fleshed example commit messages are available
196206on the reference implementation linked at the top of this document.
197207
208+ [[implementation]]
198209=== Implementation
199210
200211It's probably useful to do at least something besides printing out a string.
@@ -358,6 +369,7 @@ about. Neat! Let's commit that as well.
358369$ git commit -sm "psuh: display the top of origin/master"
359370----
360371
372+ [[add-documentation]]
361373=== Adding Documentation
362374
363375Awesome! You've got a fantastic new command that you're ready to share with the
@@ -445,6 +457,7 @@ sees that your command has been implemented as well as documented) by running
445457
446458Go ahead and commit your new documentation change.
447459
460+ [[add-usage]]
448461=== Adding Usage Text
449462
450463Try and run `./bin-wrappers/git psuh -h`. Your command should crash at the end.
@@ -501,6 +514,7 @@ your command terminated before anything else interesting happens. Great!
501514
502515Go ahead and commit this one, too.
503516
517+ [[testing]]
504518== Testing
505519
506520It's important to test your code - even for a little toy command like this one.
@@ -515,11 +529,13 @@ So let's write some tests.
515529
516530Related reading: `t/README`
517531
532+ [[overview-test-structure]]
518533=== Overview of Testing Structure
519534
520535The tests in Git live in `t/` and are named with a 4-digit decimal number using
521536the schema shown in the Naming Tests section of `t/README`.
522537
538+ [[write-new-test]]
523539=== Writing Your Test
524540
525541Since this a toy command, let's go ahead and name the test with t9999. However,
@@ -568,6 +584,7 @@ You can get an idea of whether you created your new test script successfully
568584by running `make -C t test-lint`, which will check for things like test number
569585uniqueness, executable bit, and so on.
570586
587+ [[local-test]]
571588=== Running Locally
572589
573590Let's try and run locally:
@@ -591,6 +608,7 @@ dependencies. `prove` also makes the output nicer.
591608
592609Go ahead and commit this change, as well.
593610
611+ [[ready-to-share]]
594612== Getting Ready to Share
595613
596614You may have noticed already that the Git project performs its code reviews via
@@ -613,6 +631,7 @@ Regardless of which method you choose, your engagement with reviewers will be
613631the same; the review process will be covered after the sections on GitGitGadget
614632and `git send-email`.
615633
634+ [[howto-ggg]]
616635== Sending Patches via GitGitGadget
617636
618637One option for sending patches is to follow a typical pull request workflow and
@@ -623,6 +642,7 @@ mirror of the Git project, and does some magic to turn the PR into a set of
623642emails and send them out for you. It also runs the Git continuous integration
624643suite for you. It's documented at http://gitgitgadget.github.io.
625644
645+ [[create-fork]]
626646=== Forking `git/git` on GitHub
627647
628648Before you can send your patch off to be reviewed using GitGitGadget, you will
@@ -632,6 +652,7 @@ you have a GitHub account.
632652Head to the https://github.com/git/git[GitHub mirror] and look for the Fork
633653button. Place your fork wherever you deem appropriate and create it.
634654
655+ [[upload-to-fork]]
635656=== Uploading to Your Own Fork
636657
637658To upload your branch to your own fork, you'll need to add the new fork as a
@@ -677,6 +698,7 @@ $ git push remotename psuh
677698
678699Now you should be able to go and check out your newly created branch on GitHub.
679700
701+ [[send-pr-ggg]]
680702=== Sending a PR to GitGitGadget
681703
682704In order to have your code tested and formatted for review, you need to start by
@@ -688,6 +710,7 @@ appear with the name of your newly pushed branch.
688710Review the PR's title and description, as it's used by GitGitGadget as the cover
689711letter for your change. When you're happy, submit your pull request.
690712
713+ [[run-ci-ggg]]
691714=== Running CI and Getting Ready to Send
692715
693716If it's your first time using GitGitGadget (which is likely, as you're using
@@ -712,15 +735,18 @@ your patch is accepted into `next`.
712735TODO https://github.com/gitgitgadget/gitgitgadget/issues/83
713736It'd be nice to be able to verify that the patch looks good before sending it
714737to everyone on Git mailing list.
738+ [[check-work-ggg]]
715739=== Check Your Work
716740////
717741
742+ [[send-mail-ggg]]
718743=== Sending Your Patches
719744
720745Now that your CI is passing and someone has granted you permission to use
721746GitGitGadget with the `/allow` command, sending out for review is as simple as
722747commenting on your PR with `/submit`.
723748
749+ [[responding-ggg]]
724750=== Updating With Comments
725751
726752Skip ahead to <<reviewing,Responding to Reviews>> for information on how to
@@ -742,6 +768,7 @@ of what they're looking at. When the CI is done running, you can comment once
742768more with `/submit` - GitGitGadget will automatically add a v2 mark to your
743769changes.
744770
771+ [[howto-git-send-email]]
745772== Sending Patches with `git send-email`
746773
747774If you don't want to use GitGitGadget, you can also use Git itself to mail your
@@ -750,6 +777,7 @@ subject line (for example, being able to use the tag [RFC PATCH] in the subject)
750777and being able to send a ``dry run'' mail to yourself to ensure it all looks
751778good before going out to the list.
752779
780+ [[setup-git-send-email]]
753781=== Prerequisite: Setting Up `git send-email`
754782
755783Configuration for `send-email` can vary based on your operating system and email
@@ -761,6 +789,7 @@ determine the right way to configure it to use your SMTP server; again, as this
761789configuration can change significantly based on your system and email setup, it
762790is out of scope for the context of this tutorial.
763791
792+ [[format-patch]]
764793=== Preparing Initial Patchset
765794
766795Sending emails with Git is a two-part process; before you can prepare the emails
@@ -799,6 +828,7 @@ but want reviewers to look at what they have so far. You can add this flag with
799828Check and make sure that your patches and cover letter template exist in the
800829directory you specified - you're nearly ready to send out your review!
801830
831+ [[cover-letter]]
802832=== Preparing Email
803833
804834In addition to an email per patch, the Git community also expects your patches
@@ -862,6 +892,7 @@ The one generated for `psuh` from the sample implementation looks like this:
862892Finally, the letter will include the version of Git used to generate the
863893patches. You can leave that string alone.
864894
895+ [[sending-git-send-email]]
865896=== Sending Email
866897
867898At this point you should have a directory `psuh/` which is filled with your
@@ -886,6 +917,7 @@ press `y` or `a` at these prompts your emails will be sent! Congratulations!
886917Awesome, now the community will drop everything and review your changes. (Just
887918kidding - be patient!)
888919
920+ [[v2-git-send-email]]
889921=== Sending v2
890922
891923Skip ahead to <<reviewing,Responding to Reviews>> for information on how to
@@ -944,6 +976,7 @@ $ git send-email --to=target@example.com
944976 psuh/v2*
945977----
946978
979+ [[single-patch]]
947980=== Bonus Chapter: One-Patch Changes
948981
949982In some cases, your very small change may consist of only one patch. When that
@@ -991,6 +1024,7 @@ index 88f126184c..38da593a60 100644
99110242.21.0.392.gf8f6787159e-goog
9921025----
9931026
1027+ [[now-what]]
9941028== My Patch Got Emailed - Now What?
9951029
9961030[[reviewing]]
@@ -1034,6 +1068,7 @@ changing history, but since it's local history which you haven't shared with
10341068anyone, that is okay for now! (Later, it may not make sense to do this; take a
10351069look at the section below this one for some context.)
10361070
1071+ [[after-approval]]
10371072=== After Review Approval
10381073
10391074The Git project has four integration branches: `pu`, `next`, `master`, and
0 commit comments