On branching
b-list.org
b-list.org
I wouldn't have initially trusted git if it weren't for Linus's Google Talk. And I'm glad I gave it the time it requires to change workflows.
The most unexpected side-effect of using git is a newfound willingness to follow experimental ideas in my projects as fast as I can think/type. I'll guess it comes from confidence in git's ability to safely partition branches in-situ; the relative speed and ease with which branches are created, merged and destroyed; and the existence of the index and stash. Git removes the version control inertia I didn't even know was there.
cd project/loom
cp -pr code ~/version/loom/95.before_zany_idea
# hack away; restore if irredeemably stupid
diff -r code ~/version/loom/93.released
# you get the idea
I'm not trying to denigrate git. I still use it to publish code, e.g. http://github.com/chkoreff/Loom. But my dirty little secret is, I still shamefully use "cp -pr" and "diff -r" anyway, and only git-commit right before pushing to github.git-diff doesn't require you to do gymnastics to compare files from different branches in the same working directory: "git diff branch1 [branch2] path" where omitting branch2 compares the working path instead of branch2's.
And I think your second problem with git, that big hairy branches should somehow be distinct from small simple branches, is also a non-issue. Especially since you already recognized the solution: let big hairy branches live, and small simple branches die.
Since you can reconstruct deleted branches, I don't see the problem with deleting them. Bugfix branches for specific releases can be created as needed by choosing the release commit in master as the starting point for the branch. If you really want to keep dormant branches around you can rename them to keep them distinct from "working" branches.
Sorry for not having specifically addressed these in the original comment, which was actually supposed to be a reply to fexl http://news.ycombinator.com/item?id=1095116
It requires me to use git-diff. How do I do it without involving the VCS tool? How do I get both files side-by-side in Emacs so I can go through them thoroughly (some of us prefer that to reading diffs, you know)?
Since you can reconstruct deleted branches, I don't see the problem with deleting them.
I want the history of my codebase to be easy to get a feel for; that means major work (e.g., a long-lived branch which made significant changes) should be easily accessible. Telling people to hunt down the right merge commit and work back through its ancestry doesn't do that. Inventing ad-hoc schemes of tags or renamed branches to try to make up for the inability to keep a branch but say you're done with it doesn't do that.
It reminded me of why I like git so much.
Meanwhile, it's (one reason) why I don't like git so much.
git show branch:path/to/file > /tmp/file
I want the history of my codebase to be easy to get a feel forSo never delete branches. You'll know if they're "done" if they've been merged into your master branch.
Did you miss the part where I said I'd like to not involve the VCS tool? Without using git, how do I see two different branches' versions of files?
So never delete branches. You'll know if they're "done" if they've been merged into your master branch.
But nobody else will. What everybody and their brother has told me to do is delete the branch and invent an ad-hoc naming scheme to tag the merge commits. Which is... um, no, that's not the same as being able to close a branch.
You could clone the branches to different paths, I guess.
But nobody else will [know that a branch is "done".]
If you've instructed the team to care about merged status, they will. And there's nothing semantically strange about it either.
I get it, git isn't for you. I concede.
http://stackoverflow.com/questions/255202/how-do-i-view-git-...
To say "I'm done with this branch", merge it to master. This is natural; you already do this.
git branch --merged master # list branches that are "done"
git branch --no-merged master # list branches that are "not done"
Now you never need to delete any branches if you don't want to and you can eyeball their status without introducing any misbehaviors or gymnastics.And it annoys me when people use BitBucket over Github. It's like your one friend who insists on not having a Facebook account and sticking to his Livejournal because Livejournal is supposedly better at some random thing, but in reality, you strongly suspect he just wants to prove he's not a follower, an independent breed cut from a better cloth than the rest of us.
These days, whenever I need a new little tool, its official repo is usually on Github. This lets me pull it into my project as a submodule and still contribute back in a very efficient way. As soon as it's mercurial, I can't, simply because I don't know mercurial and I certainly have zero intention of attaining the same mastery of it that I have of git. And, frankly, I don't want to attain any mastery of it.
Moreover, of course, you can't just mix repos willy nilly. Maybe there's a way to use mercurial as a submodule of git repos. But it's gonna be a dastardly hack.
So, please. Just use git. Competition is good, but so is standardization. I get that you have highly nuanced opinions about the various merits of dvcs, and I'm sure you're right and I'm wrong. But it just doesn't matter, because the benefits of mercurial don't outweigh the beneficial network effects of using git, and that's never going to change.
So I'll pose it in different terms: why haven't you given into the network effects of, say, Visual Basic?
Welllll... no. Python has made the decision to move to hg, but the conversion has hit some stumbling blocks and is not yet complete:
http://sayspy.blogspot.com/2010/01/where-hg-transition-stand...
You should switch to Windows again, you'll receive the enormous benefit that everyone you know uses the same OS.
Oh, and Livejournal does both security and commenting better than Facebook, which is why I have both.
If the work is complete then merge it (with no-ff if you want to show the merge explicitly). If it's defunct then delete it. If you want to keep it around but discourage further development then tag it or come up with a naming convention.
That you have the ability to mark branches as closed in mercurial is mainly paper over their odd decision to not allow deletion of branches.
If you have both branches and a way to close them, then you have a much simpler way to get a feel for the history of the code. You know at a quick glance what sort of major work has gone on and what's still ongoing.
If you don't have that you'll end up inventing more complex ad-hoc schemes to get it (merging a branch, deleting it and tagging the merge commit is an example of one such scheme, and it doesn't do the same thing).
And the ability to mark branches as closed in Mercurial is, to me, an indication that the developers put some thought into the different use cases for branching and wanted to cover more of them than git's standard workflow does ;)
In lots of ways git is a superset, branch workflow included.
A superset which doesn't include everything that's in the alleged subset? That must be a new definition of "superset" that I haven't heard of yet...
From the documentation and from the fact that pretty much every git user who's responded has told me the same things. Or am I supposed to take that as a massive coincidence?
http://pragprog.com/titles/tsgit/pragmatic-version-control-u...
The only person who suggested anything else, out of fifty-seven comments so far, was one who suggested merging the branch and then keeping it around rather than deleting and tagging it.
Since that's all I have to go on, and since it seems to be a pretty clear consensus, I'm taking their advice as being a generally-accepted convention amongst git users. Granted, such conventions in git seem to be as ephemeral as branches (e.g., fads such as "rebase everything! rebase after every commit! No, wait, never rebase! Rebasing is evil! Nobody should rebase!"), but if you're trying to suggest that as a result there are no conventions, I'm just going to write you off.
Whenever I make a change, either to a translator or even the core accounting code, I make a copy of the library. I then have to go back and run all funds, including my test funds, as a regression test using the new modified library. I have to do that one fund at a time, testing to make sure no catastrophic differences have arisen. So during this interim period, I have some funds running on the new code and some funds running on the old code. BOTH versions have to be "live" at the same time.
I also have to keep backups of the data as well, both inputs and outputs, so I can "diff" those easily. I'm sure as heck not gonna put that into git.
So I'm not just stick in the mud trying to be contrary -- I have work to do, and it needs to be as reliable as a Swiss watch.
laptop:~/version/loom$ rm -rf 86.12.before_prune
FEEL the adrenaline rush! ;) cd ~/somewhere
mv the_thing_i_want_to_delete ~/tmp/go_away
cd ~/tmp
rm -rf go_away
I'll also use Tab to command-complete the "go_away", and pause slightly before pressing Enter.Sometimes I'll even just let it sit there in ~/tmp for a few months before clobbering it.
I don't know, maybe if you're old-fashioned you won't like the trash metaphor, but I love it. And every so often I just do trash-empty 30 to clean out anything older than a month.