James Moger
2014-03-06 bf426b0f7d0c868f9ad97778412cd29228542859
src/site/tickets_using.mkd
@@ -22,23 +22,27 @@
Any authenticated user who can clone your repository.
    git clone https://server/r/repo.git
    cd repo
    git checkout -b mytopic
    ...add a single commit...
    git push origin HEAD:refs/for/new
    git branch --set-upstream-to={remote}/ticket/{id}
    # read ticket id from server output
    git branch --set-upstream-to=origin/ticket/{id}
### Creating the first Patchset for an Existing Ticket
If you have an existing ticket that does **not** yet have a proposed patchset you can push using the magic ref.
If you have an existing ticket that does **not** yet have a proposed patchset you can push using the ticket branch ref.
*Who can create the first patchset for an existing ticket?*
Any authenticated user who can clone your repository.
    git checkout -b mytopic
    git clone https://server/r/repo.git
    cd repo
    git checkout -b ticket/{id}
    ...add one or more commits...
    git push origin HEAD:refs/for/{id}
    git branch --set-upstream-to={remote}/ticket/{id}
    git push --set-upstream origin ticket/{id}
### Safely adding commits to a Patchset for an Existing Ticket
@@ -50,7 +54,8 @@
4. Any user with write (RW) permissions to the repository
    git checkout ticket/{id}
    git fetch && git checkout ticket/{id}
    git pull --ff-only
    ...add one or more commits...
    git push
@@ -60,9 +65,32 @@
See the above rules for who can add commits to a patchset. You do **not** need rewind (RW+) to the repository to push a non-fast-forward patchset.  Gitblit will detect the non-fast-forward update and create a new patchset ref.  This preserves the previous patchset.
    git checkout ticket/{id}
    git fetch && git checkout ticket/{id}
    git pull --ff-only
    ...amend, rebase, squash...
    git push origin HEAD:refs/for/{id}
OR if you have RW+ permissions, then you can push using *-f* flag.
    git push -f
### Updating your copy of a rewritten Patchset
If a patchset has been rewritten you can no longer simply *pull* to update.  Let's assume your checkout *does not* have any unshared commits - i.e. it represents the previous patchset.  The simplest way to update your branch to the current patchset is to reset it.
    git fetch && git checkout ticket/{id}
    git reset --hard origin/ticket/{id}
If you *do* have unshared commits then you'll could make a new temporary branch and then cherry-pick your changes onto the rewritten patchset.
    git branch oldticket ticket/{id}
    git fetch && git checkout ticket/{id}
    git reset --hard origin/ticket/{id}
    git cherry-pick <commitid1> <commitid2>
    git branch -D oldticket
Since Git is a powerful and flexible tool, there are no doubt several other strategies you could use to resolve this situation.
### Ticket RefSpecs
@@ -130,6 +158,7 @@
    git checkout master
    git merge ticket-{id}
    git push origin master
    git branch -d ticket-{id}
### Closing Tickets on Push with a Completely New Patchset