[Digikam-devel] thoughts on branches with git
Marcel Wiesweg
marcel.wiesweg at gmx.de
Sat Mar 5 15:17:02 GMT 2011
Hi,
now that we are using git and have merged all branches still coming from SVN,
we can now readjust habits and have a look at what workflows git allows with
branches.
Compared to git, SVN never really had branches; we had code in different
directories, and a very limited merge commoand.
It needs some time to get used to git concepts; in doubt, I always recommend
to use gitk to get a visual feedback about local and remote branch settings.
git offers a lot of flexibility to do things as you want (but also to break
things, also in the remote repo). Therefore the following five workflows are
not exclusive.
1) Simple local changes
You may have noted that "git pull --rebase" does not work as soon as you have
any local changes. The sequence it then
git stash; git pull --rebase; git stash pop
I always found it cumbersome, but it is a clean solution, to avoid
intermingling your local changes with rebase conflicts.
I still did not manage to write a bash script for this sequence (which would
not stash without local changes, and which which would not git-stash-pop when
the pull-rebase has had conflicts)
2) Local branch
I developed the grouping feature last week using this approach. It was only a
few days of work, no need to share before it's finished, but neither ready to
commit the first parts before the rest was finished.
Assuming you have local changes and want to continue your work in a local
branch now:
git checkout -b myBranch
<commit, work, commit>
You have finished and want to commit. Not by a merge: If you have made, say,
10 commits, you want to add these 10 commits on top of master, and discard
your local branch.
In the meantime, master has received new commits. Get latest master and pull:
git checkout master
git pull
Now, rebase your work on top of master. This rewrites your commits.
git checkout myBranch
git rebase master
Then it's time to add all your commits, one by one, to master:
git checkout master
git rebase myBranch
git push
Clean up after you:
git branch -d myBranch
The effect on the remote repository is a linear string of commits, as if
developed directly on master. Your local branch has never been public.
3) Public branch with rebase.
This concept is very similar to (2): In the end, there will be a linear line
of commits on top of master, and no branch remain in the remote repository.
The main difference is that the branch lives in the remote repo, and
development can be shared. At least when development is finished, the commits
are rebased, which rewrites history: Afterwards, the branch cannot be pushed.
Anyone who would have based his work on an intermediate commit will be lost.
The branch can be force-pushed though, if allowed on the remote side. That
means social communication is required when rebasing.
The workflow is described here
http://community.kde.org/20110213_GitWorkflowAgenda/StevesIdea#Use_case:_Someone_wants_to_work_on_a_feature_that_takes_longer_than_half_a_day_and_should_therefore_be_in_an_archived_branch.
Note: I dont know if branches are already force-pushable in KDE repos; I
assume not, and then this does not work!
4) Stable branch
Development continues on master, and a stable branch is branched off.
Backporting of fixed is done using git cherry-pick.
5) Development branch
Development on master is incremental, but large, architectural changes are
done in a branch, possibly breaking everything. Development time is long. The
branch will be preserved in history for all times. Over time, changes from
master are merged intermittently. (This is what we did with the
development/2.0 branch)
Marcel
More information about the Digikam-devel
mailing list