diff options
Diffstat (limited to 'dev/git/index.html')
-rw-r--r-- | dev/git/index.html | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/dev/git/index.html b/dev/git/index.html new file mode 100644 index 0000000..40ae49d --- /dev/null +++ b/dev/git/index.html @@ -0,0 +1,343 @@ +<!DOCTYPEhtml> +<htmldir="ltr" lang="en"> +<head> + <meta charset='utf-8'> + <title>Git</title> +</head> +<body> + + <a href="../index.html">Development Index</a> + <h1>Git</h1> + + <p>First configure your global identity, configuration + file resides on ~/.gitconfig ;</p> + + <pre> + $ git config --global user.name "User Name" + $ git config --global user.email user@devbox + </pre> + + <p>Assumptions of this document;</p> + + <ul> + <li>Correct + <a href="../tools/gitolite.html#adminusers">user account</a> + exists on git server or is public readable. + </li> + <li>Repository exists or + <a href="../tools/gitolite.html#adminrep">create one</a> + if you have permissions. This document uses atom as example. + </li> + <li>Correct + <a href="../tools/openssh.html#sshid">ssh identities</a>, + and profile alias have been setup. This document uses devbox as example. + </li> + </ul> + + <pre> + $ git clone devbox:atom + $ git remote -v + </pre> + + <h2 id="teamwork">1. Team WorkFlow</h2> + + <p>This work flow is based on + <a href="http://nvie.com/posts/a-successful-git-branching-model/">Vicent Driessen</a> + development model, it defines rules how branches are forked, + merged and tagged. By having well defined set of branches, + the project structure is used as a communication tool, + allowing to work simultaneously on different stages + of the development.</p> + + <p>Main Branches;</p> + + <dl> + <dt>master</dt> + <dd>Current official stable release history.</dd> + <dt>develop</dt> + <dd>Integration branch for features.</dd> + </dl> + + <p>Add-on Branches;</p> + + <dl> + <dt>feature (f-)</dt> + <dd>New features, improvement proposal, tests, etc...</dd> + <dd>Only fork and merge from/to develop. + <dt>release (r-)</dt> + <dd>Next release, new features not allowed.</dd> + <dd>Fork from develop, merges to master and develop.</dd> + <dt>hotfix (h-)</dt> + <dd>Hotfix only contain isolated bugfixes.</dd> + <dd>Only fork from master, merges back to master and develop.</dd> + </dl> + + <p> + <h3 id="feature">1.1. Feature</h3> + + <p>Create a branch featurex from develop and checkout;</p> + + <pre> + $ git checkout -b featurex develop + </pre> + + <p>Push new branch to server</p> + + <pre> + $ git push -u origin featurex + </pre> + + <p>Rename a branch, if all feature branches start by "f-" is easy + and quick to type and easy to spot;</p> + + <pre> + $ git branch -m featurex f-xpto + </pre> + + <p>Rename remote branch;</p> + + <pre> + $ git push origin :featurex f-xpto + $ git push origin -u f-xpto + </pre> + + <p>Merge branch feature into develop;</p> + + <pre> + $ git checkout develop + Switched to branch 'develop' + $ git merge --no-ff f-xpto + Updating ea1b82a..05e9557 + (Summary of changes) + $ git push origin develop + </pre> + + <p>Delete Local;</p> + + <pre> + $ git branch -D f-xpto + </pre> + + <p>Delete Remote</p> + + <pre> + $ git push origin :f-xpto + </pre> + + <h3 id="release">1.2. Release</h3> + + <p>Software release numbers follow <a href="http://semver.org/">Tom Preston-Werner</a> + description;</p> + + <pre> + software-name-X.Y.Z.tar.xz + </pre> + + <dl> + <dt>X</dt> + <dd>Major version, backwards incompatible API changes.</dd> + <dt>Y</dt> + <dd>Minor version, backwards-compatible changes.</dd> + <dt>Z</dt> + <dd>Patch version, backwards-compatible bug fixes.</dd> + </dl> + + <pre> + $ git checkout -b r-1.2.1 develop + Switched to a new branch "release-1.2.1" + $ ./bump-version.sh 1.2.1 + Files modified successfully, version bumped to 1.2.1. + $ git commit -a -m "Bumped version number to 1.2.1" + [release-1.2 74d9424] Bumped version number to 1.2.1 + 1 files changed, 1 insertions(+), 1 deletions(-) + </pre> + + <p>Only documentation or bugfixes are allowed in this + branch. When release is ready for production merge + and push to master;</p> + + <pre> + $ git checkout master + Switched to branch 'master' + $ git merge --no-ff r-1.2.1 + Merge made by recursive. + </pre> + + <p>Tag new release with software-name-version, this + allows meaningful ports + <a href="../core/ports.html">distfiles</a> when + downloading releases from git archives;</p> + + <pre> + $ git tag -a software-name-1.2.1 + $ git push --follow-tags + </pre> + + <p>Update branch develop with bugfixes from last release, + conflict will happen in next step</p> + + <pre> + $ git checkout develop + Switched to branch 'develop' + $ git merge --no-ff r-1.2.1 + Merge made by recursive. + (Summary of changes) + $ git push + </pre> + + <h3 id="tags">1.3. Tags</h3> + + <p>There are two main types of tags, lightweight and + annotated. Lightweight tag is a pointer to a specific commit, + much like cheap branches. Annotated tags are stored as full objects + and allow to sign with <a href="gnupg.html">gnupg</a>, making it ideal + for distributing releases.</p> + + <p>Delete local and remote last end of life version;</p> + + <pre> + $ git tag -d software-name-0.0.12 + $ git push origin :refs/tags/software-name-0.8 + </pre> + + <p>Checkout master commit you want to start long term support and then;</p> + + <pre> + $ git tag -m "this commit is tagged" -a "software-name-1.1.8" + $ git push --follow-tags + </pre> + + <h3 id="hotfix">1.4. Hotfix</h3> + + <p>This branch should never exist, ;)</p> + + <pre> + $ git checkout -b h-1.2.2 master + $ ./bump-version.sh 1.2.2 + Files modified successfully, version bumped to 1.2.2 + $ git commit -a -m "Bumped version number to 1.2.2" + </pre> + + <pre> + $ git merge --no-ff b-error-xpto + ... + $ git merge --no-ff b-error-xpto + ... + $ git commit -m "Commit severe fix" + ... + $ git commit -m "Commit severe fix" + ... + </pre> + + <pre> + $ git checkout master + Switched to branch 'master' + $ git merge --no-ff h-1.2.2 + Merge made by recursive. + (Summary of changes) + $ git tag -a software-name-1.2.2 + </pre> + + <p>Conflict will happen in next step</p> + + <pre> + $ git checkout develop + Switched to branch 'develop' + $ git merge --no-ff h-1.2.2 + Merge made by recursive. + (Summary of changes) + </pre> + + <pre> + $ git -D h-1.2.2 + </pre> + + <h2 id="local">2. Local Workflow</h2> + + <h3 id="working">2.1. Working area</h3> + + <p>Mark all deleted to commit;</p> + + <pre> + $ git ls-files --deleted -z | xargs -0 git rm + </pre> + + + <p>Mark all deleted to commit;</p> + + <pre> + $ git ls-files --deleted -z | xargs -0 git rm + </pre> + + <h3 id="logdiff">2.2. Logs and commits</h3> + + <p>Create patch files to target branch/tag/ref;</p> + + <pre> + $ git format-patch --no-prefix software-v0.0.1 + </pre> + + <p>Last commit that affected current path</p> + + <pre> + $ git rev-list -n 1 HEAD -- . + $ git show f000 path/to/file + $ git diff --name-status f000 path/to/file + </pre> + + <p>Undo a file to specific commit</p> + + <pre> + $ git checkout f000^ -- path/to/file + </pre> + + <h3 id="remote">2.3. Working with remotes</h3> + + <p>Adding a new remote;</p> + + <pre> + $ git remote add newremotename https://github.com/user/repo.git + </pre> + + <p>Update all branches with remote;</p> + + <pre> + $ git fetch --all + $ git pull --all + </pre> + + <p>If you want to track all remotes run this line + and then the commands mentioned above;</p> + + <pre> + $ for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done + </pre> + + <p>Future updates;</p> + + <pre> + $ git fetch --all + $ git pull --all + </pre> + + <p>Update local branches removed on remote set;</p> + + <pre> + $ git config --global fetch.prune true + </pre> + + + <p>This will prune on fetch or you can keep it manually;</p> + + <pre> + $ git remote prune origin + </pre> + + <a href="../index.html">Development Index</a> + <p>This is part of the c9-doc Manual. + Copyright (C) 2016 + c9 Team. + See the file <a href="../../fdl-1.3-standalone.html">Gnu Free Documentation License</a> + for copying conditions.</p> +</body> +</html> |