Terminal game to test Git skills
github.com
github.com
It does everything any enterprise developer needs source control for.
'Git skills' take people away from writing. Or, put another way, 'git skills' increase cognitive load on programmers and is just another area where mistakes can be made.
That just means your group chose to limit the potential quality of the work (by not allowing people to improve on other's parts) or expand the timespan of the project (by disallowing concurrent editing) on behalf of simplifying the process.
They're valid tradeoffs, but too limiting for most software projects, in my opinion.
No branch, no merge, only a central repo and intelligent check-in/check-out. They are way more efficient than the agile-y teams working with Git/Mercurial.
SVN and CVS make this notoriously difficult. So I need a DVCS. But those are all super complex. I think Git/Hg/etc are great innovation and obviously the step forward compared to SVN and friends, but I'm not convinced were there yet.
There has to be a way to get the major tangible advantages of Git with the ease of use of SVN.
[And to be fair: others don't have that problem only because their merging doesn't take into account the history.]
Now that I'm picking your brain anyway, do you know if there's any (workable) way at all to combine a site like GitHub or Bitbucket with Darcs?
http://paulhammant.com/2013/04/05/what-is-trunk-based-develo...
svn branch is a "free" operation (branching doesn't use space), svn switch means you can hop between branches easily.
I can see how a dvcs is nicer to work with locally but I'd like to hear your struggles with svn.
To accomplish what? Note, I'm not trying to diss you, I really want to understand why you want to do that.
I mean, I never woke up in the morning and said "woa, I really want to perform complex operations on an acyclic graph today". Maybe you and me are just different, but I usually want to make software, together with my team.
I want to hack on the same software as them at the same time, so we need a way to deal with all the technicalities that make emailing ZIP files around unpractical. I want to keep track of history so that I can see why we did what when, and so that I can undo stupid mistakes. That's really all I want.
I don't completely understand why I consciously need to perform complex operations on a directed acyclic graph to accomplish these things, but somehow that what I end up doing, and that makes me sad. I find it to be a horrible distraction. For me, the "D" in DVCS is an implementation detail, and I bet this holds for 90% of GitHub's paying customers.
1. Small-scale history: Developers make mistakes. When things go wrong, a clean history of small, incremental changes is priceless. Git helps you craft such a history. It's not about what actually happened. It's about helping you solve future problems.
2. Large-scale history: large projects branch. Especially commercial ones, where you need to support old versions, or maybe have custom versions for laaarge customers. Git handles this well. And it's good at helping you get identical changes into multiple branches without loosing track.
> and I bet this holds for 90% of GitHub's paying customers.
90% of everything is crap ;)
I guess the point I was trying to make is that a huge portion of Git users don't actually need Git; they would probably get everything they need from a conceptually simpler VCS like Mercurial or SVN.
Regarding the DAG thing, this is just because that's essentially how Git actually represents the objects which it stores, which represent your repository and its history. A lot of the time I'm in the mindset of "committing some code to a branch" but sometimes it's useful for me to get into DAG-mode so that I can more easily think about how I want my repository to be structured.
An example is how I work with my master branch, which I consider to be the absolute source of truth for a repository's history. This means that it should be full of complete, atomic commits which are ordered in a way that enables me to do things like git-bisect (for finding bugs), generate meaningful release logs, and just generally understand the history at a glance. So rather than just blindly merge my branches into master, I spend a lot of time using git-rebase to squash, re-order, and edit my commits. I find it easier to do this when I'm thinking in terms of a DAG, rather than some abstract concept of a "commit" (whatever that is).
Developers suck at documentation ( or lack the will to do it ). History gives you clues on what was done to fix what, a glimpse of the requirement and 'Git skills' helps to keep this history clean.
Seriously... some commands (like reset and show) do wildly different things based on a single flag or whether they're given an argument or not; the interpretation of arguments is by default context-sensitive (files vs. branch names); the "simple" way to do some things (revert local changes) is via a seemingly unrelated command (checkout); informational commands tend to show no useful info by default; etc.
The infuriating thing is that git's internal model is very simple. It's often easier to resort to working with the files under .git/ directly than figuring out what incantation I need to do simple thing X.
The only redeeming quality of the CLI is the existence of git rebase --interactive. It's one of the few commands that directly maps a user goal (editing the DAG) to a simple action (moving lines in a text file).
(Yes, I know there probably are replacement CLIs. That doesn't help when I need to help co-workers do something.)
Darcs is an example of a great DVCS CLI. Its commands each do exactly one thing; are well-named; only need options for the uncommon cases; and there's exactly one command for each basic operation on the repository.
Also, I didn't use git to do any of it, but maybe that's because I'm a terrible person.
The next clue is: YtrydjKsYqebDoI3h bTINUeV6 pTVY8jnK2re HRwwNy25Ps6 u0YChCo5Jtw N3xkH3G nx aGo6yQTW RVZMsf3xk tBL0sG9GAR HQbyGYdqs i6dx1fyIPGJVciz8Z1NzdrvGE CKgkFauXqfKJmas cDLerWvBTRzUikmP2 0sqk2Xhie2DcIv KtCyYTlNx7WxJp6A2yox3r aJX4r7FpUhgsyGIwc prCCNx46GKVgzaerab3gXS7ieoOf1 Jp
By the way, let's say I don't "remember" which other branch contains a file at a certain path - what's the easiest way to find all other branches which contain a file at that path?
May I suggest a part 2? It can include rebasing, cherry-picking, stashing and resetting, among other things.
What if I didn't know how to git clone? :)