GitHubWorkflow: Difference between revisions

From Mu2eWiki
Jump to navigation Jump to search
No edit summary
Line 80: Line 80:
   git fetch mu2e
   git fetch mu2e
   git merge mu2e/master
   git merge mu2e/master
</ol>
</ol>
==Collaborating on a feature==
Sometimes you may want to collaborate on a feature branch with other developers. In this case since the main Offline repository no longer has all the development branches we need to do a couple extra steps
<ol style="list-style-type:roman">
<li>First make sure you actually need to work on the same branch. Are you actually working on the same feature? Can the problem be split into smaller features that can be developed asynchronously? Just because features are related doesn't mean they need to be developed on the same branch</li>
<li>Determine if a large number of people will be developing on the same branch for a significant amount of time. In this case it should become an official branch in the mu2e/Offline like MDC2018</li>
<li>Decide which users fork will be the primary repo for this feature branch, and which branch on that fork you are going to use. If a new branch is needed, the owner of that fork can do as usual:</li>
  git clone git@github.com:<their user name>/Offline
  git checkout -b <new branch name>
  git push -u origin <new branch name>
<li>There are then a couple options for moving forward: either add all other developers as collaborators on the primary fork, or use pull requests to the primary fork</li>
<li>To add developers as collaborators:</li>
<ol style="list-style-type:lower-alpha">
<li>The owner of the primary fork opens https://github.com/<their user name>/Offline</li>
<li>click settings on the right, then collaborators</li>
<li>In the collaborators box, type the github user name of each other developer and hit "Add collaborator"</li>
<li>The other collaborators can then either create a read/write access clone of the primary fork, or add it as a remote to an existing offline repo</li>
git clone git@github.com:<primary user name>/Offline
or
git remote add primaryfork git@github.com:<primary user name>/Offline
<li>The other collaborators can now push directly to the primary fork as if it was their own:</li>
git push primaryfork <branch name>
</ol>
<li>To use pull requests:</li>
<ol style="list-style-type:lower-alpha">
<li>The owner of the primary fork can just push to it as normal following the normal developer workflow</li>
<li>Other developers clone their own fork, but add the primary fork as a remote</li>
  git remote add primaryfork git@githbub.com:<primary user name>/Offline
<li>Other developers can pull in and merge changes from collaborators by fetching/pulling/merging from this remote</li>
  git fetch primaryfork
  git merge primaryfork/<branch name>
<li>Other developers push to their own fork</li>
  git push origin <branch namee>
<li>Like in the normal developer workflow, they open a pull request. But then in the compare window before creating the request, change the "base repository" from mu2e/Offline to <primary user name>/Offline (see [https://help.github.com/en/articles/creating-a-pull-request#changing-the-branch-range-and-destination-repository here])</li>
<li>the owner of the primary fork will need to accept and merge it in</li>
<li>everything else goes like the normal workflow</li>
</ol>
</ol>
</ol>
</ol>

Revision as of 21:56, 16 August 2019

Introduction

This page describes a recommended git workflow for use with the Mu2e Offline code once we have switched to GitHub.

Downloading Offline as a user and NOT a developer

Option 1: you want the default primary version of the code (most people):

  1. clone the repo:
  2. git clone https://github.com/mu2e/Offline
  3. Done!

Option 2: A particular collaborator has a version or branch you want to use:

  1. Find their github user name
  2. Determine what the name of the branch they are working on is (Note: this can be master!)
  3. Clone their fork:
  4. git clone https://github.com/<user name>/Offline cd Offline git checkout origin/<branch name>
  5. Done!

Option 3: You want to use pgit to avoid a long compilation time (EXPERIMENTAL)

  1. Create new directory to put your Offline repo in and move to that directory
  2. mkdir Offline cd Offline
  3. As in Option 2, determine fork and branch name you wish to use
  4. Create a partial checkout clone
  5. pgit2 setup https://github.com/<user name (or mu2e)>/Offline <branch name>
  6. You can now use as normal:
  7. source setup.sh scons -j 4

Developer Workflow

  • To start, you will want to make sure you understand what a remote is, and the difference between a branch and a fork
  • You will also need a GitHub account, and to make sure you are added to the Mu2e github organization (https://github.com/orgs/Mu2e/people)
  1. Before we do any developing, we will create our own fork of the official Mu2e Offline repo using the GitHub web interface (instructions here). This fork will be your personal sandbox on GitHub; you can do anything you want to it and it will have no effect on anyone else!
  2. Create a local clone of your Offline fork. This will be identical to cloning the official mu2e repo (if your fork is up to date), except that the default remote (called "origin") where you will push to by default will point to your fork instead of the official mu2e version.
  3. git clone git@github.com:<your user name>/Offline
  4. (Not required) To be more descriptive about the change you are working on, you can create a new branch to develop your feature on. Again since we will be pushing to your fork, this has no impact on the main Offline, and the only time the branch name will actually show up otherwise is if you are pointing other people to your changes or in the comment of the final merge commit back into the master branch (or if you are working on several things at once and want to keep them separate).
  5. git checkout -b <new branch name>
  6. Do your work and commit it locally
  7. git commit -m "this is my normal commit onto my local branch"
  8. If there are changes in the official master branch, you can grab them and merge them in
    1. First you need to add the mu2e/Offline repo as a new "remote"
    2. git remote add mu2e https://github.com/mu2e/Offline
    3. now you can pull/fetch/merge from that repo (or from any other fork by the same procedure)
    4. git fetch mu2e git merge mu2e/master
  9. Push your work to your fork
    1. If you are working on the master branch of your fork:
    2. git push origin master
    3. If you are working on a different branch, then the first time you push add the "-u" option to tell git that these branches "track" each other (see https://lornajane.net/posts/2014/understanding-tracking-branches-in-git)
    4. git push -u origin <branch name>
  10. When you are ready to have your changes propagated back into the main mu2e Offline repo, open a pull request.
    1. In a web browser, open https://github.com/<your user name>/Offline
    2. If you just pushed, there should automatically be a message about your new changes and a link to automatically open a pull request
    3. Otherwise follow the github instructions
  11. On the next software call, be prepared to discuss your changes
  12. If issues are found with your changes, just commit and push again, the pull request will automatically be updated
  13. After a code review, the admins will merge in your branch, and you are done!
  14. Cleanup before continuing:
    1. if you created a new branch and you are done with this feature completely, go ahead and delete the branch (remember no history is lost as this whole branch is now part of master, including all provenance)
    2. git branch -d <my branch name> git push origin --delete <my branch name> (this deletes the branch from your github fork as well)
    3. if you used the master branch on your fork, or you are planning to continue to develop this feature, just make sure to update it to include the merge commit created by the pull request
    4. git fetch mu2e git merge mu2e/master

Collaborating on a feature

Sometimes you may want to collaborate on a feature branch with other developers. In this case since the main Offline repository no longer has all the development branches we need to do a couple extra steps

  1. First make sure you actually need to work on the same branch. Are you actually working on the same feature? Can the problem be split into smaller features that can be developed asynchronously? Just because features are related doesn't mean they need to be developed on the same branch
  2. Determine if a large number of people will be developing on the same branch for a significant amount of time. In this case it should become an official branch in the mu2e/Offline like MDC2018
  3. Decide which users fork will be the primary repo for this feature branch, and which branch on that fork you are going to use. If a new branch is needed, the owner of that fork can do as usual:
  4. git clone git@github.com:<their user name>/Offline git checkout -b <new branch name> git push -u origin <new branch name>
  5. There are then a couple options for moving forward: either add all other developers as collaborators on the primary fork, or use pull requests to the primary fork
  6. To add developers as collaborators:
    1. The owner of the primary fork opens https://github.com/<their user name>/Offline
    2. click settings on the right, then collaborators
    3. In the collaborators box, type the github user name of each other developer and hit "Add collaborator"
    4. The other collaborators can then either create a read/write access clone of the primary fork, or add it as a remote to an existing offline repo
    5. git clone git@github.com:<primary user name>/Offline or git remote add primaryfork git@github.com:<primary user name>/Offline
    6. The other collaborators can now push directly to the primary fork as if it was their own:
    7. git push primaryfork <branch name>
  7. To use pull requests:
    1. The owner of the primary fork can just push to it as normal following the normal developer workflow
    2. Other developers clone their own fork, but add the primary fork as a remote
    3. git remote add primaryfork git@githbub.com:<primary user name>/Offline
    4. Other developers can pull in and merge changes from collaborators by fetching/pulling/merging from this remote
    5. git fetch primaryfork git merge primaryfork/<branch name>
    6. Other developers push to their own fork
    7. git push origin <branch namee>
    8. Like in the normal developer workflow, they open a pull request. But then in the compare window before creating the request, change the "base repository" from mu2e/Offline to <primary user name>/Offline (see here)
    9. the owner of the primary fork will need to accept and merge it in
    10. everything else goes like the normal workflow