Junio C Hamano | 215a7ad | 2005-09-07 17:26:23 -0700 | [diff] [blame] | 1 | git-rebase(1) |
| 2 | ============= |
Junio C Hamano | 7fc9d69 | 2005-08-23 01:49:47 -0700 | [diff] [blame] | 3 | |
| 4 | NAME |
| 5 | ---- |
Junio C Hamano | c3f0baa | 2007-01-18 15:53:37 -0800 | [diff] [blame] | 6 | git-rebase - Forward-port local commits to the updated upstream head |
Junio C Hamano | 7fc9d69 | 2005-08-23 01:49:47 -0700 | [diff] [blame] | 7 | |
| 8 | SYNOPSIS |
| 9 | -------- |
Matthias Kestenholz | e448ff8 | 2007-05-18 15:39:33 +0200 | [diff] [blame] | 10 | [verse] |
J. Bruce Fields | 059f446 | 2007-09-07 10:20:50 -0400 | [diff] [blame] | 11 | 'git-rebase' [-i | --interactive] [-v | --verbose] [-m | --merge] |
Mike Hommey | f32086b | 2008-03-01 12:39:52 +0100 | [diff] [blame] | 12 | [-s <strategy> | --strategy=<strategy>] |
J. Bruce Fields | 059f446 | 2007-09-07 10:20:50 -0400 | [diff] [blame] | 13 | [-C<n>] [ --whitespace=<option>] [-p | --preserve-merges] |
| 14 | [--onto <newbase>] <upstream> [<branch>] |
Sean | cc12005 | 2006-05-13 23:34:08 -0400 | [diff] [blame] | 15 | 'git-rebase' --continue | --skip | --abort |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 16 | |
Junio C Hamano | 7fc9d69 | 2005-08-23 01:49:47 -0700 | [diff] [blame] | 17 | DESCRIPTION |
| 18 | ----------- |
Shawn O. Pearce | 5ca2db5 | 2007-02-17 04:31:50 -0500 | [diff] [blame] | 19 | If <branch> is specified, git-rebase will perform an automatic |
| 20 | `git checkout <branch>` before doing anything else. Otherwise |
| 21 | it remains on the current branch. |
| 22 | |
| 23 | All changes made by commits in the current branch but that are not |
| 24 | in <upstream> are saved to a temporary area. This is the same set |
| 25 | of commits that would be shown by `git log <upstream>..HEAD`. |
| 26 | |
| 27 | The current branch is reset to <upstream>, or <newbase> if the |
| 28 | --onto option was supplied. This has the exact same effect as |
| 29 | `git reset --hard <upstream>` (or <newbase>). |
| 30 | |
| 31 | The commits that were previously saved into the temporary area are |
Jeff King | ff90546 | 2007-10-15 00:47:30 -0400 | [diff] [blame] | 32 | then reapplied to the current branch, one by one, in order. Note that |
| 33 | any commits in HEAD which introduce the same textual changes as a commit |
| 34 | in HEAD..<upstream> are omitted (i.e., a patch already accepted upstream |
| 35 | with a different commit message or timestamp will be skipped). |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 36 | |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 37 | It is possible that a merge failure will prevent this process from being |
| 38 | completely automatic. You will have to resolve any such merge failure |
Sean | cc12005 | 2006-05-13 23:34:08 -0400 | [diff] [blame] | 39 | and run `git rebase --continue`. Another option is to bypass the commit |
| 40 | that caused the merge failure with `git rebase --skip`. To restore the |
| 41 | original <branch> and remove the .dotest working files, use the command |
| 42 | `git rebase --abort` instead. |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 43 | |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 44 | Assume the following history exists and the current branch is "topic": |
| 45 | |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 46 | ------------ |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 47 | A---B---C topic |
| 48 | / |
| 49 | D---E---F---G master |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 50 | ------------ |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 51 | |
Jon Loeliger | 228382a | 2006-03-17 18:25:30 -0600 | [diff] [blame] | 52 | From this point, the result of either of the following commands: |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 53 | |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 54 | |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 55 | git-rebase master |
| 56 | git-rebase master topic |
| 57 | |
| 58 | would be: |
| 59 | |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 60 | ------------ |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 61 | A'--B'--C' topic |
| 62 | / |
| 63 | D---E---F---G master |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 64 | ------------ |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 65 | |
Jakub Narebski | e52775f | 2006-11-06 19:12:45 +0100 | [diff] [blame] | 66 | The latter form is just a short-hand of `git checkout topic` |
| 67 | followed by `git rebase master`. |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 68 | |
Jeff King | ff90546 | 2007-10-15 00:47:30 -0400 | [diff] [blame] | 69 | If the upstream branch already contains a change you have made (e.g., |
| 70 | because you mailed a patch which was applied upstream), then that commit |
| 71 | will be skipped. For example, running `git-rebase master` on the |
| 72 | following history (in which A' and A introduce the same set of changes, |
| 73 | but have different committer information): |
| 74 | |
| 75 | ------------ |
| 76 | A---B---C topic |
| 77 | / |
| 78 | D---E---A'---F master |
| 79 | ------------ |
| 80 | |
| 81 | will result in: |
| 82 | |
| 83 | ------------ |
| 84 | B'---C' topic |
| 85 | / |
| 86 | D---E---A'---F master |
| 87 | ------------ |
| 88 | |
Jakub Narebski | e52775f | 2006-11-06 19:12:45 +0100 | [diff] [blame] | 89 | Here is how you would transplant a topic branch based on one |
| 90 | branch to another, to pretend that you forked the topic branch |
| 91 | from the latter branch, using `rebase --onto`. |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 92 | |
Jakub Narebski | e52775f | 2006-11-06 19:12:45 +0100 | [diff] [blame] | 93 | First let's assume your 'topic' is based on branch 'next'. |
| 94 | For example feature developed in 'topic' depends on some |
| 95 | functionality which is found in 'next'. |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 96 | |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 97 | ------------ |
Jakub Narebski | e52775f | 2006-11-06 19:12:45 +0100 | [diff] [blame] | 98 | o---o---o---o---o master |
| 99 | \ |
| 100 | o---o---o---o---o next |
| 101 | \ |
| 102 | o---o---o topic |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 103 | ------------ |
Junio C Hamano | 7fc9d69 | 2005-08-23 01:49:47 -0700 | [diff] [blame] | 104 | |
Jakub Narebski | e52775f | 2006-11-06 19:12:45 +0100 | [diff] [blame] | 105 | We would want to make 'topic' forked from branch 'master', |
| 106 | for example because the functionality 'topic' branch depend on |
| 107 | got merged into more stable 'master' branch, like this: |
| 108 | |
| 109 | ------------ |
| 110 | o---o---o---o---o master |
| 111 | | \ |
| 112 | | o'--o'--o' topic |
| 113 | \ |
| 114 | o---o---o---o---o next |
| 115 | ------------ |
| 116 | |
| 117 | We can get this using the following command: |
| 118 | |
| 119 | git-rebase --onto master next topic |
| 120 | |
| 121 | |
| 122 | Another example of --onto option is to rebase part of a |
| 123 | branch. If we have the following situation: |
| 124 | |
| 125 | ------------ |
| 126 | H---I---J topicB |
| 127 | / |
| 128 | E---F---G topicA |
| 129 | / |
| 130 | A---B---C---D master |
| 131 | ------------ |
| 132 | |
| 133 | then the command |
| 134 | |
| 135 | git-rebase --onto master topicA topicB |
| 136 | |
| 137 | would result in: |
| 138 | |
| 139 | ------------ |
| 140 | H'--I'--J' topicB |
| 141 | / |
| 142 | | E---F---G topicA |
| 143 | |/ |
| 144 | A---B---C---D master |
| 145 | ------------ |
| 146 | |
| 147 | This is useful when topicB does not depend on topicA. |
| 148 | |
Shawn O. Pearce | ea81fcc | 2007-02-05 15:21:06 -0500 | [diff] [blame] | 149 | A range of commits could also be removed with rebase. If we have |
| 150 | the following situation: |
| 151 | |
| 152 | ------------ |
| 153 | E---F---G---H---I---J topicA |
| 154 | ------------ |
| 155 | |
| 156 | then the command |
| 157 | |
Junio C Hamano | 13cc4c8 | 2007-08-16 12:20:25 -0700 | [diff] [blame] | 158 | git-rebase --onto topicA~5 topicA~3 topicA |
Shawn O. Pearce | ea81fcc | 2007-02-05 15:21:06 -0500 | [diff] [blame] | 159 | |
| 160 | would result in the removal of commits F and G: |
| 161 | |
| 162 | ------------ |
| 163 | E---H'---I'---J' topicA |
| 164 | ------------ |
| 165 | |
| 166 | This is useful if F and G were flawed in some way, or should not be |
| 167 | part of topicA. Note that the argument to --onto and the <upstream> |
| 168 | parameter can be any valid commit-ish. |
| 169 | |
J. Bruce Fields | 8978d04 | 2006-03-26 15:29:28 -0500 | [diff] [blame] | 170 | In case of conflict, git-rebase will stop at the first problematic commit |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 171 | and leave conflict markers in the tree. You can use git diff to locate |
| 172 | the markers (<<<<<<) and make edits to resolve the conflict. For each |
| 173 | file you edit, you need to tell git that the conflict has been resolved, |
| 174 | typically this would be done with |
J. Bruce Fields | 8978d04 | 2006-03-26 15:29:28 -0500 | [diff] [blame] | 175 | |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 176 | |
Shawn O. Pearce | d7f078b | 2007-02-17 04:43:42 -0500 | [diff] [blame] | 177 | git add <filename> |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 178 | |
| 179 | |
| 180 | After resolving the conflict manually and updating the index with the |
| 181 | desired resolution, you can continue the rebasing process with |
| 182 | |
| 183 | |
| 184 | git rebase --continue |
| 185 | |
J. Bruce Fields | 8978d04 | 2006-03-26 15:29:28 -0500 | [diff] [blame] | 186 | |
| 187 | Alternatively, you can undo the git-rebase with |
| 188 | |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 189 | |
| 190 | git rebase --abort |
J. Bruce Fields | 8978d04 | 2006-03-26 15:29:28 -0500 | [diff] [blame] | 191 | |
Junio C Hamano | 7fc9d69 | 2005-08-23 01:49:47 -0700 | [diff] [blame] | 192 | OPTIONS |
| 193 | ------- |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 194 | <newbase>:: |
| 195 | Starting point at which to create the new commits. If the |
| 196 | --onto option is not specified, the starting point is |
Shawn O. Pearce | ea81fcc | 2007-02-05 15:21:06 -0500 | [diff] [blame] | 197 | <upstream>. May be any valid commit, and not just an |
| 198 | existing branch name. |
Carl Worth | 69a60af | 2006-02-21 17:10:12 -0800 | [diff] [blame] | 199 | |
A Large Angry SCM | 52a22d1 | 2005-08-26 18:18:48 -0700 | [diff] [blame] | 200 | <upstream>:: |
Shawn O. Pearce | ea81fcc | 2007-02-05 15:21:06 -0500 | [diff] [blame] | 201 | Upstream branch to compare against. May be any valid commit, |
| 202 | not just an existing branch name. |
Junio C Hamano | 7fc9d69 | 2005-08-23 01:49:47 -0700 | [diff] [blame] | 203 | |
Jon Loeliger | 228382a | 2006-03-17 18:25:30 -0600 | [diff] [blame] | 204 | <branch>:: |
A Large Angry SCM | 52a22d1 | 2005-08-26 18:18:48 -0700 | [diff] [blame] | 205 | Working branch; defaults to HEAD. |
Junio C Hamano | 7fc9d69 | 2005-08-23 01:49:47 -0700 | [diff] [blame] | 206 | |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 207 | --continue:: |
| 208 | Restart the rebasing process after having resolved a merge conflict. |
| 209 | |
| 210 | --abort:: |
| 211 | Restore the original branch and abort the rebase operation. |
| 212 | |
Eric Wong | 58634db | 2006-06-21 03:04:41 -0700 | [diff] [blame] | 213 | --skip:: |
| 214 | Restart the rebasing process by skipping the current patch. |
Eric Wong | 58634db | 2006-06-21 03:04:41 -0700 | [diff] [blame] | 215 | |
Robin Rosenberg | a94eda6 | 2007-09-01 14:11:10 +0200 | [diff] [blame] | 216 | -m, \--merge:: |
Eric Wong | 58634db | 2006-06-21 03:04:41 -0700 | [diff] [blame] | 217 | Use merging strategies to rebase. When the recursive (default) merge |
| 218 | strategy is used, this allows rebase to be aware of renames on the |
| 219 | upstream side. |
| 220 | |
| 221 | -s <strategy>, \--strategy=<strategy>:: |
| 222 | Use the given merge strategy; can be supplied more than |
| 223 | once to specify them in the order they should be tried. |
| 224 | If there is no `-s` option, a built-in list of strategies |
| 225 | is used instead (`git-merge-recursive` when merging a single |
| 226 | head, `git-merge-octopus` otherwise). This implies --merge. |
| 227 | |
Robert Shearman | b758789 | 2006-10-03 17:29:31 +0100 | [diff] [blame] | 228 | -v, \--verbose:: |
| 229 | Display a diffstat of what changed upstream since the last rebase. |
| 230 | |
Michael S. Tsirkin | 67dad68 | 2007-02-08 15:57:08 +0200 | [diff] [blame] | 231 | -C<n>:: |
| 232 | Ensure at least <n> lines of surrounding context match before |
| 233 | and after each change. When fewer lines of surrounding |
| 234 | context exist they all must match. By default no context is |
| 235 | ever ignored. |
| 236 | |
J. Bruce Fields | 059f446 | 2007-09-07 10:20:50 -0400 | [diff] [blame] | 237 | --whitespace=<nowarn|warn|error|error-all|strip>:: |
| 238 | This flag is passed to the `git-apply` program |
Dan McGee | 5162e69 | 2007-12-29 00:20:38 -0600 | [diff] [blame] | 239 | (see linkgit:git-apply[1]) that applies the patch. |
J. Bruce Fields | 059f446 | 2007-09-07 10:20:50 -0400 | [diff] [blame] | 240 | |
Johannes Schindelin | 1b1dce4 | 2007-06-25 01:11:14 +0100 | [diff] [blame] | 241 | -i, \--interactive:: |
| 242 | Make a list of the commits which are about to be rebased. Let the |
Johannes Schindelin | f0fd889 | 2007-08-31 18:10:21 +0100 | [diff] [blame] | 243 | user edit that list before rebasing. This mode can also be used to |
| 244 | split commits (see SPLITTING COMMITS below). |
Johannes Schindelin | 1b1dce4 | 2007-06-25 01:11:14 +0100 | [diff] [blame] | 245 | |
Johannes Schindelin | f09c9b8 | 2007-06-25 18:59:43 +0100 | [diff] [blame] | 246 | -p, \--preserve-merges:: |
| 247 | Instead of ignoring merges, try to recreate them. This option |
| 248 | only works in interactive mode. |
| 249 | |
Eric Wong | 58634db | 2006-06-21 03:04:41 -0700 | [diff] [blame] | 250 | include::merge-strategies.txt[] |
| 251 | |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 252 | NOTES |
| 253 | ----- |
| 254 | When you rebase a branch, you are changing its history in a way that |
| 255 | will cause problems for anyone who already has a copy of the branch |
| 256 | in their repository and tries to pull updates from you. You should |
| 257 | understand the implications of using 'git rebase' on a repository that |
| 258 | you share. |
| 259 | |
| 260 | When the git rebase command is run, it will first execute a "pre-rebase" |
| 261 | hook if one exists. You can use this hook to do sanity checks and |
| 262 | reject the rebase if it isn't appropriate. Please see the template |
| 263 | pre-rebase hook script for an example. |
| 264 | |
SZEDER Gábor | 702088a | 2008-03-10 15:38:33 +0100 | [diff] [blame] | 265 | Upon completion, <branch> will be the current branch. |
sean | 031321c | 2006-04-26 10:49:38 -0400 | [diff] [blame] | 266 | |
Johannes Schindelin | 1b1dce4 | 2007-06-25 01:11:14 +0100 | [diff] [blame] | 267 | INTERACTIVE MODE |
| 268 | ---------------- |
| 269 | |
| 270 | Rebasing interactively means that you have a chance to edit the commits |
| 271 | which are rebased. You can reorder the commits, and you can |
| 272 | remove them (weeding out bad or otherwise unwanted patches). |
| 273 | |
| 274 | The interactive mode is meant for this type of workflow: |
| 275 | |
| 276 | 1. have a wonderful idea |
| 277 | 2. hack on the code |
| 278 | 3. prepare a series for submission |
| 279 | 4. submit |
| 280 | |
| 281 | where point 2. consists of several instances of |
| 282 | |
| 283 | a. regular use |
| 284 | 1. finish something worthy of a commit |
| 285 | 2. commit |
| 286 | b. independent fixup |
| 287 | 1. realize that something does not work |
| 288 | 2. fix that |
| 289 | 3. commit it |
| 290 | |
| 291 | Sometimes the thing fixed in b.2. cannot be amended to the not-quite |
| 292 | perfect commit it fixes, because that commit is buried deeply in a |
| 293 | patch series. That is exactly what interactive rebase is for: use it |
| 294 | after plenty of "a"s and "b"s, by rearranging and editing |
| 295 | commits, and squashing multiple commits into one. |
| 296 | |
| 297 | Start it with the last commit you want to retain as-is: |
| 298 | |
| 299 | git rebase -i <after-this-commit> |
| 300 | |
| 301 | An editor will be fired up with all the commits in your current branch |
| 302 | (ignoring merge commits), which come after the given commit. You can |
| 303 | reorder the commits in this list to your heart's content, and you can |
| 304 | remove them. The list looks more or less like this: |
| 305 | |
| 306 | ------------------------------------------- |
| 307 | pick deadbee The oneline of this commit |
| 308 | pick fa1afe1 The oneline of the next commit |
| 309 | ... |
| 310 | ------------------------------------------- |
| 311 | |
| 312 | The oneline descriptions are purely for your pleasure; `git-rebase` will |
| 313 | not look at them but at the commit names ("deadbee" and "fa1afe1" in this |
| 314 | example), so do not delete or edit the names. |
| 315 | |
| 316 | By replacing the command "pick" with the command "edit", you can tell |
| 317 | `git-rebase` to stop after applying that commit, so that you can edit |
| 318 | the files and/or the commit message, amend the commit, and continue |
| 319 | rebasing. |
| 320 | |
| 321 | If you want to fold two or more commits into one, replace the command |
| 322 | "pick" with "squash" for the second and subsequent commit. If the |
| 323 | commits had different authors, it will attribute the squashed commit to |
Johannes Schindelin | 81ab1cb | 2007-09-30 00:34:23 +0100 | [diff] [blame] | 324 | the author of the first commit. |
Johannes Schindelin | 1b1dce4 | 2007-06-25 01:11:14 +0100 | [diff] [blame] | 325 | |
| 326 | In both cases, or when a "pick" does not succeed (because of merge |
| 327 | errors), the loop will stop to let you fix things, and you can continue |
| 328 | the loop with `git rebase --continue`. |
| 329 | |
| 330 | For example, if you want to reorder the last 5 commits, such that what |
| 331 | was HEAD~4 becomes the new HEAD. To achieve that, you would call |
| 332 | `git-rebase` like this: |
| 333 | |
| 334 | ---------------------- |
| 335 | $ git rebase -i HEAD~5 |
| 336 | ---------------------- |
| 337 | |
| 338 | And move the first patch to the end of the list. |
| 339 | |
Johannes Schindelin | f09c9b8 | 2007-06-25 18:59:43 +0100 | [diff] [blame] | 340 | You might want to preserve merges, if you have a history like this: |
| 341 | |
| 342 | ------------------ |
| 343 | X |
| 344 | \ |
| 345 | A---M---B |
| 346 | / |
| 347 | ---o---O---P---Q |
| 348 | ------------------ |
| 349 | |
| 350 | Suppose you want to rebase the side branch starting at "A" to "Q". Make |
| 351 | sure that the current HEAD is "B", and call |
| 352 | |
| 353 | ----------------------------- |
| 354 | $ git rebase -i -p --onto Q O |
| 355 | ----------------------------- |
| 356 | |
Johannes Schindelin | f0fd889 | 2007-08-31 18:10:21 +0100 | [diff] [blame] | 357 | |
| 358 | SPLITTING COMMITS |
| 359 | ----------------- |
| 360 | |
| 361 | In interactive mode, you can mark commits with the action "edit". However, |
| 362 | this does not necessarily mean that 'git rebase' expects the result of this |
| 363 | edit to be exactly one commit. Indeed, you can undo the commit, or you can |
| 364 | add other commits. This can be used to split a commit into two: |
| 365 | |
| 366 | - Start an interactive rebase with 'git rebase -i <commit>^', where |
| 367 | <commit> is the commit you want to split. In fact, any commit range |
| 368 | will do, as long as it contains that commit. |
| 369 | |
| 370 | - Mark the commit you want to split with the action "edit". |
| 371 | |
| 372 | - When it comes to editing that commit, execute 'git reset HEAD^'. The |
| 373 | effect is that the HEAD is rewound by one, and the index follows suit. |
| 374 | However, the working tree stays the same. |
| 375 | |
| 376 | - Now add the changes to the index that you want to have in the first |
Dan McGee | 5162e69 | 2007-12-29 00:20:38 -0600 | [diff] [blame] | 377 | commit. You can use linkgit:git-add[1] (possibly interactively) and/or |
| 378 | linkgit:git-gui[1] to do that. |
Johannes Schindelin | f0fd889 | 2007-08-31 18:10:21 +0100 | [diff] [blame] | 379 | |
| 380 | - Commit the now-current index with whatever commit message is appropriate |
| 381 | now. |
| 382 | |
| 383 | - Repeat the last two steps until your working tree is clean. |
| 384 | |
| 385 | - Continue the rebase with 'git rebase --continue'. |
| 386 | |
| 387 | If you are not absolutely sure that the intermediate revisions are |
| 388 | consistent (they compile, pass the testsuite, etc.) you should use |
Dan McGee | 5162e69 | 2007-12-29 00:20:38 -0600 | [diff] [blame] | 389 | linkgit:git-stash[1] to stash away the not-yet-committed changes |
Johannes Schindelin | f0fd889 | 2007-08-31 18:10:21 +0100 | [diff] [blame] | 390 | after each commit, test, and amend the commit if fixes are necessary. |
| 391 | |
| 392 | |
Johannes Schindelin | 1b1dce4 | 2007-06-25 01:11:14 +0100 | [diff] [blame] | 393 | Authors |
Junio C Hamano | 7fc9d69 | 2005-08-23 01:49:47 -0700 | [diff] [blame] | 394 | ------ |
Johannes Schindelin | 1b1dce4 | 2007-06-25 01:11:14 +0100 | [diff] [blame] | 395 | Written by Junio C Hamano <junkio@cox.net> and |
| 396 | Johannes E. Schindelin <johannes.schindelin@gmx.de> |
Junio C Hamano | 7fc9d69 | 2005-08-23 01:49:47 -0700 | [diff] [blame] | 397 | |
| 398 | Documentation |
| 399 | -------------- |
| 400 | Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. |
| 401 | |
| 402 | GIT |
| 403 | --- |
Dan McGee | 5162e69 | 2007-12-29 00:20:38 -0600 | [diff] [blame] | 404 | Part of the linkgit:git[7] suite |