Improve squashing documentation (#4668)

* Improve squashing documentation

Signed-off-by: Celeste Horgan <celeste@cncf.io>

* Apply suggestions from code review

Co-Authored-By: Bob Killen <killen.bob@gmail.com>

* Update contributors/guide/github-workflow.md

Co-Authored-By: Bob Killen <killen.bob@gmail.com>

Co-authored-by: Bob Killen <killen.bob@gmail.com>
This commit is contained in:
Celeste Horgan 2020-04-06 05:11:46 -07:00 committed by GitHub
parent a4a1d2f561
commit 7b7ba09a57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 95 additions and 18 deletions

View File

@ -356,6 +356,14 @@ phase of a PR revision. If you are unsure if you should squash your commits, it
is better to err on the side of having more and leave it up to the judgement of
the other contributors assigned to review and approve your PR.
Perform an interactive rebase to choose which commits you want to keep and which you want to squash, then force push your branch:
```
git rebase -i HEAD~3
...
git push --force
```
[contributor guide]: /contributors/guide/README.md

View File

@ -137,34 +137,101 @@ fork.
Very small PRs are easy to review. Very large PRs are very difficult to review.
#### Squash and Merge
#### Squash commits
Upon merge (by either you or your reviewer), all commits left on the review
branch should represent meaningful milestones or units of work. Use commits to
add clarity to the development and review process.
After a review, prepare your PR for merging by squashing your commits.
Before merging a PR, squash any _fix review feedback_, _typo_, _merged_, and
_rebased_ sorts of commits.
All commits left on your branch after a review should represent meaningful milestones or units of work. Use commits to add clarity to the development and review process.
It is not imperative that every commit in a PR compile and pass tests
independently, but it is worth striving for.
Before merging a PR, squash the following kinds of commits:
In particular, if you happened to have used `git merge` and have merge
commits, please squash those away: they do not meet the above test.
- Fixes/review feedback
- Typos
- Merges and rebases
- Work in progress
A nifty way to manage the commits in your PR is to do an [interactive
rebase](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History),
which will let you tell git what to do with every commit:
Aim to have every commit in a PR compile and pass tests independently if you can, but it's not a requirement. In particular, `merge` commits must be removed, as they will not pass tests.
```sh
git fetch upstream
git rebase -i upstream/master
```
To squash your commits, perform an [interactive
rebase](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History):
1. Check your git branch:
```
git status
```
Output is similar to:
```
On branch your-contribution
Your branch is up to date with 'origin/your-contribution'.
```
2. Start an interactive rebase using a specific commit hash, or count backwards from your last commit using `HEAD~<n>`, where `<n>` represents the number of commits to include in the rebase.
```
git rebase -i HEAD~3
```
Output is similar to:
```
pick 2ebe926 Original commit
pick 31f33e9 Address feedback
pick b0315fe Second unit of work
# Rebase 7c34fc9..b0315ff onto 7c34fc9 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
...
```
3. Use a command line text editor to change the word `pick` to `fixup` for the commits you want to squash, then save your changes and continue the rebase:
```
pick 2ebe926 Original commit
squash 31f33e9 Address feedback
pick b0315fe Second unit of work
...
```
Output (after saving changes) is similar to:
```
[detached HEAD 61fdded] Second unit of work
Date: Thu Mar 5 19:01:32 2020 +0100
2 files changed, 15 insertions(+), 1 deletion(-)
...
Successfully rebased and updated refs/heads/master.
```
4. Force push your changes to your remote branch:
```
git push --force
```
For mass automated fixups (e.g. automated doc formatting), use one or more
commits for the changes to tooling and a final commit to apply the fixup en
masse. This makes reviews easier.
### Merging a commit
Once you've received review and approval, your commits are squashed, your PR is ready for merging.
Merging happens automatically after both a Reviewer and Approver have approved the PR. If you haven't squashed your commits, they may ask you to do so before approving a PR.
### Reverting a commit
In case you wish to revert a commit, use the following instructions.
@ -204,4 +271,4 @@ will create the PR branch inside the main repository rather than inside your for
git push ${your_remote_name} myrevert
```
- [Create a Pull Request](#7-create-a-pull-request) using this branch.
- [Create a Pull Request](#7-create-a-pull-request) using this branch.

View File

@ -290,6 +290,8 @@ We might still ask you to clean up your commits at the very end for the sake of
Each commit should have a good title line (<70 characters) and include an additional description paragraph describing in more detail the change intended.
For more information, see [squash commits](./github-workflow.md#squash-commits).
**General squashing guidelines:**
* Sausage => squash