VCS comparison table
Matthieu Moy
Matthieu.Moy at imag.fr
Thu Oct 19 14:44:34 BST 2006
Petr Baudis <pasky at suse.cz> writes:
> The lack of parents ordering in Git is directly connected with
> fast-forwarding.
[...]
> repo1 repo2
>
> a a
> / \ / \
> c b c b
> \ / \ /
> m m
Yes, bzr has similar thing too. AIUI, the difference is that git does
it automatically, while bzr has two commands in its UI, "merge" and
"pull".
In your case, the "leftmost ancestor" of m is b, because at the time
it was created, it was commited from b.
One problem with that approach is that from revision m and looking
backward in history (say, running "bzr log"), you have two ways to go
backward:
1) Take the history of _your_ commits, and your pull till the point
where you've branched.
2) Follow the history taking the leftmost ancestor at each step.
In bzr, the notion of "branch" corresponds to a succession of
revisions, which are explicitely stored in a file (ls
.bzr/branch/revision-history), which is what commands like "log"
follow, and what is used for revision numbering. And this sucession of
revision must obey (at most) one of the above. In the past, it was 1),
which means that "pull" (i.e. fast-forward) was only adding revisions
to a branch. In your scenario, repo1 would get a revision history of
"a c m" while repo2 would have had "a b m" with the same tip.
Today, the revision history follows leftmost ancestor. One good
property of this is that revision history is unique for a given
revision. But the terrible drawback is that "pull" and "push" do not
/add/ revisions to your revision history, they rewrite the target one
with the source one. That means I can have
$ bzr log --line
1: some upstream stuff
2: started my work
3: continued my work
# upstream merges.
$ bzr pull
$ bzr log --line
1: some upstream stuff
2: some other upstream stuff ...
3: ... commited while I was working
4: merged from Matthieu this terrible feature
--
Matthieu -- definitely curious to give a real try to git ;-)
More information about the bazaar
mailing list