Erik Bågfors wrote: > Jakub Narębski wrote: >> For example git encourages using many short and longer-lived feature >> branches; I don't see bzr encouraging this workflow. > > Why not? I think it really does. And due to the fact that merges are > merges and will show up as such, I think it's very suitable for > feature branches. I think I haven't properly explained what "feature branch" means. "Feature branch" is short (or medium) lived branch, created for development of one isolated feature. When feature is in stable stage, we merge feature branch and forget about it. We are not interested in the fact that given feature was developed on given branch. BTW. for example in published git.git repository are only available in the form of "digest" 'pu' (proposed updates) branch. I guess what you are talking about are long lived "development branches" (like git.git 'maint', 'master', 'next' and 'pu' branches), or perhaps long lived another user's clone of given git repository. Git considers having clones of given repository totally equivalent, and having fast-forward property more important than remembering "which branch (which clone) has this commit came from" or at least "this commit is from this (current) branch-clone". You have graphical history viewers (bzr has it's own: bzr-gtk), committer and author info, and reflog if enabled if you really, really need this kind of information. > In fact, in the bzr development of bzr itself. All commits are done > in feature branches and then merged into bzr.dev (the main "trunk" of > bzr) when they are considered stable. > > Consider the following > bzr branch mainline featureA Which if I remember correctly (at least by default) needs and generates new working tree. > cd featureA > hack hack; bzr commit -m 'f1'; hack hack bzr commit -m f2; etc > No I want to merge in mainline again > bzr merge ../mainline; bzr commit -m merge > hack hack; bzr commit -m f3; hack hack bzr commit -m f4; etc As it clarified during this long discussion, bzr "branches" are something between git branches and one-branch [local] clones. Can you for example create branch starting from an arbitrary revision, not only tip of branch? The above sequence of operations can be done in (at least) two different ways in git. Less used: $ cd /somewhere/else $ git clone -l -s <mainrepo>/.git featureA $ cd featureA $ hack; hack; git commit -a -m "f1"; hack; hack; git commit -a -m "f2"; etc $ cd <mainrepo> $ git pull /somewhere/else/featureA/.git (this does commit and merge) But more common used is: $ git branch featureA mainline $ git checkout featureA $ hack; hack; git commit -a -m "f1"; hack; hack; git commit -a -m "f2"; etc $ git checkout mainline $ git pull . featureA (although this would fast-forward in this example) > right now, I would have something line this in the branch log > ----------------------------------------------------------------- > committer: Erik Bågfors <erik@xxxxxxxxxx> > branch nick: featureA > message: > f4 > ----------------------------------------------------------------- > committer: Erik Bågfors <erik@xxxxxxxxxx> > branch nick: featureA > message: > f3 > ---------------------------------------------------------------- > committer: Erik Bågfors <erik@xxxxxxxxxx> > branch nick: featureA > message: > merge > ----------------------------------------------------------------- > committer: Foo Bar <foo@xxxxxxx> > branch nick: mainline > message: > something done in mainline > ----------------------------------------------------------------- > committer: Foo Bar <foo@xxxxxxx> > branch nick: mainline > message: > something else done in mainline The automatic merge message takes care of this, if we enable merge.summary config option. For example: commit 2c8a02263c13c6e1891e9e338eb40a4286b613e5 Merge: 2492932... 87b787a... Author: Jakub Narebski <jnareb@xxxxxxxxx> Date: Sat Oct 21 13:23:19 2006 +0200 Merge branch 'master' of git://git.kernel.org/pub/scm/git/git * 'master' of git://git.kernel.org/pub/scm/git/git: git-clone: define die() and use it. Fix typo in show-index.c pager: default to LESS=FRS Another example, this time of "octopus" merge. commit ff49fae6a547e5c70117970e01c53b64d983cd10 Merge: 7ad4ee7... 75f9007... 14eab2b... 0b35995... eee4609... Author: Junio C Hamano <junkio@xxxxxxx> Date: Fri Oct 20 18:56:14 2006 -0700 Merge branches 'jc/diff', 'jc/diff-apply-patch', 'jc/read-tree' and 'pb/web' into pu * jc/diff: para walk wip para-walk: walk n trees, index and working tree in parallel * jc/diff-apply-patch: git-diff/git-apply: make diff output a bit friendlier to GNU patch (part 2) * jc/read-tree: merge: loosen overcautious "working file will be lost" check. * pb/web: gitweb: Show project README if available That said we couldn't do that in abovementioned example as it is simple case of fast-forward. We have above messages for "true merges" of two _diverging_ lines of development, and we could use similar format for "git log". In practice we rather use history viewers: gitk, qgit, tig, git-show-branch. For example: $ git show-branch origin next ! [origin] git-clone: define die() and use it. ! [next] Merge branch 'master' into next -- - [next] Merge branch 'master' into next ++ [origin] git-clone: define die() and use it. > If I understand it correctly, in git, you don't really know what has > been committed as part of this branch/repo, and what has been > committed in another branch/repo (this is my understanding from > reading this thread, I might be wrong, feel free to correct me again > :) ) You can browse reflog to get to know which changes were commited as part of this repo, and which came from other repo (other clone of this repo). -- Jakub Narebski Poland - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html