Re: VCS comparison table
From: Jakub Narebski <hidden>
Date: 2016-06-15 22:42:45
Erik Bågfors wrote:
Jakub Narębski wrote:
quoted
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 [off-list ref]
branch nick: featureA
message:
f4
-----------------------------------------------------------------
committer: Erik Bågfors [off-list ref]
branch nick: featureA
message:
f3
----------------------------------------------------------------
committer: Erik Bågfors [off-list ref]
branch nick: featureA
message:
merge
-----------------------------------------------------------------
committer: Foo Bar [off-list ref]
branch nick: mainline
message:
something done in mainline
-----------------------------------------------------------------
committer: Foo Bar [off-list ref]
branch nick: mainline
message:
something else done in mainlineThe automatic merge message takes care of this, if we enable
merge.summary config option. For example:
commit 2c8a02263c13c6e1891e9e338eb40a4286b613e5
Merge: 2492932... 87b787a...
Author: Jakub Narebski [off-list ref]
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 [off-list ref]
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