Tag Archives: git

Branch by abstraction and trunk based development

Recently I have been trying to figure out the best way to handle parallel development of bug fixes and new functionalities.

As I am using GIT (in front of an SVN repo) I thought about feature, release and hotfix branches as described in the excellent blog post A successful Git branching model by Vincent Driessen. Best used with the gitflow GIT extensions.

The model explains that “feature branches typically exist in developer repos only, not in origin” but this is not feasible for our team. Some feature branches take long to be developed (> 1 week, often > 1 month). You should not keep more than a couple of days work on your developer machine without pushing to the repository. (YMMV of course.)

Peer-reviewing a whole feature branch when development is finished (and merged and pushed back to the repository?) is just too hard. We like to review commit-by-commit — changes are much easier to follow and understand that way. If everyone on the team would use GIT we could push/pull changes to each other but this creates a lot of branch management overhead especially if you have many parallel feature branches. (At one point we had 9 feature branches and 6 release branches, at the same time.)
Read more »

How to show which commits Git-SVN will push or merge

My previous post explains how to show which commits Git will push or merge. This is a follow-up explaining how to achieve the same with Git-SVN.

These are the aliases you need in your Git configuration file (e.g. C:cygwinhome<user>.gitconfig or <project>/.git/config). The explanation is below.

[alias]
    # -M                 Detect and report renames for each commit.
    # --name-status      Show only names and status of changed files.
    # --abbrev-commit    Instead of showing the full 40-byte hexadecimal commit object name, show only a partial prefix.
    l = log -M --name-status --abbrev-commit

    # --oneline          This is a shorthand for &amp;quot;--pretty=oneline --abbrev-commit&amp;quot; used together.
    l1 = log --oneline

    # log commits-to-push
    lctp  = &amp;quot;!REMOTE_BRANCH=$(git svn info --url | gawk -F'/' '{print $NF}'); 
            COMMAND=&amp;quot;git l remotes/$REMOTE_BRANCH..HEAD&amp;quot;; 
            echo $COMMAND; 
            $COMMAND&amp;quot;
    lctp1 = &amp;quot;!REMOTE_BRANCH=$(git svn info --url | gawk -F'/' '{print $NF}'); 
            COMMAND=&amp;quot;git l1 remotes/$REMOTE_BRANCH..HEAD&amp;quot;; 
            echo $COMMAND; 
            $COMMAND&amp;quot;

    # log commits-to-merge
    # do not forget to execute &amp;quot;git svn fetch&amp;quot; first
    lctm  = &amp;quot;!REMOTE_BRANCH=$(git svn info --url | gawk -F'/' '{print $NF}'); 
            COMMAND=&amp;quot;git l HEAD..remotes/$REMOTE_BRANCH&amp;quot;; 
            echo $COMMAND; 
            $COMMAND&amp;quot;
    lctm1 = &amp;quot;!REMOTE_BRANCH=$(git svn info --url | gawk -F'/' '{print $NF}'); 
            COMMAND=&amp;quot;git l1 HEAD..remotes/$REMOTE_BRANCH&amp;quot;; 
            echo $COMMAND; 
            $COMMAND&amp;quot;

Read more »

How to show which commits Git will push or merge

To show which commits Git will push or merge, these are the aliases you need in your Git configuration file (e.g. C:\cygwin\home\<user>\.gitconfig or <project>/.git/config). The explanation is below.

[alias]
    # -M                 Detect and report renames for each commit.
    # --name-status      Show only names and status of changed files.
    # --abbrev-commit    Instead of showing the full 40-byte hexadecimal commit object name, show only a partial prefix.
    l = log -M --name-status --abbrev-commit

    # --oneline          This is a shorthand for "--pretty=oneline --abbrev-commit" used together.
    l1 = log --oneline

    # log commits-to-push
    lctp  = "!LOCAL_BRANCH=$(git branch | grep ^* | gawk -F' ' '{print $NF}'); \
            REMOTE_SERVER=$(git config --get branch.$LOCAL_BRANCH.remote); \
            REMOTE_BRANCH=$(git config --get branch.$LOCAL_BRANCH.merge | gawk -F'/' '{print $NF}'); \
            COMMAND=\"git l $REMOTE_SERVER/$REMOTE_BRANCH..HEAD\"; \
            echo $COMMAND; \
            $COMMAND"
    lctp1 = "!LOCAL_BRANCH=$(git branch | grep ^* | gawk -F' ' '{print $NF}'); \
            REMOTE_SERVER=$(git config --get branch.$LOCAL_BRANCH.remote); \
            REMOTE_BRANCH=$(git config --get branch.$LOCAL_BRANCH.merge | gawk -F'/' '{print $NF}'); \
            COMMAND=\"git l1 $REMOTE_SERVER/$REMOTE_BRANCH..HEAD\"; \
            echo $COMMAND; \
            $COMMAND"

    # log commits-to-merge
    # do not forget to execute "git fetch" first
    lctm  = "!LOCAL_BRANCH=$(git branch | grep ^* | gawk -F' ' '{print $NF}'); \
            REMOTE_SERVER=$(git config --get branch.$LOCAL_BRANCH.remote); \
            REMOTE_BRANCH=$(git config --get branch.$LOCAL_BRANCH.merge | gawk -F'/' '{print $NF}'); \
            COMMAND=\"git l HEAD..$REMOTE_SERVER/$REMOTE_BRANCH\"; \
            echo $COMMAND; \
            $COMMAND"
    lctm1 = "!LOCAL_BRANCH=$(git branch | grep ^* | gawk -F' ' '{print $NF}'); \
            REMOTE_SERVER=$(git config --get branch.$LOCAL_BRANCH.remote); \
            REMOTE_BRANCH=$(git config --get branch.$LOCAL_BRANCH.merge | gawk -F'/' '{print $NF}'); \
            COMMAND=\"git l1 HEAD..$REMOTE_SERVER/$REMOTE_BRANCH\"; \
            echo $COMMAND; \
            $COMMAND"

Read more »

How to configure Git on Windows (under Cygwin) to use Beyond Compare 3

Let’s get to the point.
To configure Git on Windows (under Cygwin) to use Beyond Compare 3, you should have the following in your .gitconfig file (e.g. C:\cygwin\home\<user>\.gitconfig):

[[diff]]
    tool = mybc3
[difftool "mybc3"]
    cmd = \"c:/program files/beyond compare 3/BComp.com\" \"$(cygpath -w \"$LOCAL\")\" \"$(cygpath -w \"$REMOTE\")\" /lefttitle=\"$(cygpath -w \"$LOCAL\")\" /righttitle=\"$(cygpath -w \"$REMOTE\")\" /leftreadonly /rightreadonly
[difftool]
    prompt = false
[merge]
    tool = mybc3
[mergetool "mybc3"]
    cmd = \"c:/program files/beyond compare 3/BComp.com\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\" /lefttitle=\"$LOCAL\" /righttitle=\"$REMOTE\" /centertitle=\"$BASE\" /outputtitle=\"$MERGED\" /leftreadonly /rightreadonly /centerreadonly
    keepBackup = false
    trustExitCode = true
[mergetool]
    prompt = false

Read more »