about summary refs log blame commit diff stats
path: root/dev/git.html
blob: 3e5f4c146475678ff2600bfc8819d2ba4670de5c (plain) (tree)
1
2
3
4
5
6
7
8
9







                          
                                              


























                                                                                    





                                           

                                 
                                                                                         





                                                                
                         



                                                         



                                                 
                           

        
                             
                                                                  






                                                                          

         

                                      
 
                                                              










                                      

                                                                     

         
                                   




                                

                                      




                                             





                                




                        
                          




                        
                             

          



                                                                                          

         



















                                                                   






                                                         













                                                       





                                                             





                                

          
                                
 






                                                                          

         

                                                  

          

                                                                               
         

                                                                 

          



                                             
         



                                                        

          
         







                                       


          





                                    

          
                                            

         




                                

          
         
                    























                                                 

                                              
                      
            





                                                                                        
<!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">Local Workflow</h2>

    <p>Mark all deleted to commit;</p>

    <pre>
    $ git ls-files --deleted -z | xargs -0 git rm
    </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>

    <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>