The Elements of Git
cuddly-octo-palm-tree.com
cuddly-octo-palm-tree.com
Now, that I finally feel good enough, that I can rely on what I know and finally in position to mentor others, I made what I feel was missing, a set of sandbox git repository challenges, with only real life examples [1] I met in professional repos.
I hope the dark age of git education passes soon (and is already fading).
There are lots of other programs like that, GDB for example, each with it's own challenge of sythesizing case studies. I hope this kind of learning continues, not only with git, but across other programs as well.
Go for it!
We had better solutions, but the combination of "FREE!" and "network effects" meant that the GitHub virus won and the Git host came along for the ride.
Even Linus hates the way GitHub does things, but he can't do anything about it at this point except complain.
Why does Linus hate "the way GitHub does things"? Are you referring to this [1] (which, I'll note, is ambivalent on the value of GitHub as a whole, and is only negative specifically on the matter of GitHub merges?) Or is there some other argument here that we're all supposed to be familiar with?
What are these "better solutions"? Where are they? Where can I find and use them? Are they, in fact, better thought-out and more usable than GitHub? How can I test your assertions here?
[1] https://lore.kernel.org/lkml/CAHk-=wjbtip559HcMG9VQLGPmkurh5...
They all coexisted and were being developed. Even Github wasn't a big deal in the beginning and was just one of many providers who were all bootstrapped.
However, once GitHub hit the field with $100 million in VC cash it squashed further development cold--bootstrapping and quality doesn't matter much against someone burning VC cash against you.
Distributed source control is now in a path dependent local minimum and we are stuck with git because we are stuck with GitHub--better is no longer sufficient to break the logjam.
Until Microsoft turns the screws enough this will all remain status quo.
[1] https://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.checkout.h...
As for overloading the checkout command, the git man page lists the following
1. checkout a branch
2. checkout and create a new branch (combining git checkout and git branch)
3. checkout a path at a certain commit
In contrast, the svn co/checkout command has the following options
1. Checkout a directory
2. Checkout a file
3. Checkout a directory or file at a certain revision
Which really isn't that different. Given svn's concept of branches really being copies of the repository, one would switch branches by just checking out a different branch by using the switch command. In this case, I think git's interface is better since you don't need a different command to just change between branches.
That's it.
Now, I admit that much of the conceptual complexity with git is to do with it being a decentralized system. svn was not. However, I think it does a tremendously bad job of abstracting and conceptualizing that complexity.
The only extra step that git introduced was pushing the changes up to the remote.
- svn checkout -> git clone
- make changes (same for both)
- see changes (svn diff -> git diff)
> unless there were conflicting changes made in the meantime in which case you had to assert that you'd resolved those conflicts, possibly with help from merge tooling.
Which is what you would have to do with git as well if upstream was updated and you pulled it down to your working copy with git.
> However, I think it does a tremendously bad job of abstracting and conceptualizing that complexity.
I think part of the problem is that people want to make getting changes from the repository and sending changes to the repository a single step, whereas git only did that for getting changes with the git pull command. There's no corresponding git push command that handled committing as well as pushing the changes to the remote.
What should have been done was to never give that option. That is, the git pull command should not have been a thing and people would have to learn that there are two steps. One is the network operation of getting the changes or sending the changes and the other is to apply those changes to the working copy or staging those changes in the working copy before sending them over the network.
I have a git training I developed for work that focuses not on telling everyone what the solutions to their problems are, but walking them into those problems, getting into detached head, getting into branching and rebasing problems, and then explaining how to get back out of them. I've gotten generally positive feedback from this.
If nothing else, at the very least it convinces them that when they see the "detached head" message, they can come get help and I'll be very sympathetic to what is going on, because I told them up front that I expect this sort of thing to happen and it doesn't mean they're bad people for getting into this state, and we can at least have a sane conversation about what they did to get there and what they want to happen.
It's probably particularly hard to try to tell people the solutions to problems they've never had when they also don't even know what's going on around them and what a problem even is.
The quality of the introductory documentation has gotten better over the years, thank goodness. I know a great many developers who are terrified of git, and stick to the couple of commands they get taught by the team lead.
https://medium.com/girl-writes-code/git-is-a-directed-acycli...
While reading the Medium post, it may be helpful to bear in mind that arcs shown in the drawings — called “pointers” in the text — are exactly hashes to git.
Explains nearly everything you need concisely and effectively, in about 20 minutes (the rest of it is primarily demonstration).
For example, where I work (https://graphite.dev) we use some of these plumbing commands to extend git to store additional information about pull requests. My teammate did a writeup of this here: https://dev.to/foster/how-to-use-native-git-as-a-key-value-s...
Is there something like ls, but for possible programs on your PATH? Or is there a way to just get a dump of all executables on the current PATH?
Even still, it seems like you’d have to decide which of those programs to show first in the documentation. And to get a short description of each of them, you’d have to invoke them.
I guess the solution is “use manpages,” but it’s kind of unsatisfying — I’d like to build something like git, but using CLI --help.
EDIT: Seems ... strange.
- https://github.com/git/git/blob/master/help.c#L260-L294
- https://github.com/git/git/blob/master/command-list.txt
- https://github.com/git/git/blob/master/generate-cmdlist.sh
I'm not sure `git help` supports the concept of adding third-party `git` commands as first-class citizens, but I'm still reading.
I was hoping there was a way to attach a short help descriptor to each of the third-party commands. But the help descriptors seem to be hardcoded for the builtin commands, with no support for third party commands. Darn.
Tech Talk: Linus Torvalds on git (2007)
"Linus Torvalds visits Google to share his thoughts on git, the source control management system he created two years ago."
However, this is not the tutorial I would send anyone towards, as a user of git. The programming design logic is not enough to get better at the workflows. Mercifully, branching patterns in team projects are omitted entirely.
enjoyable and glad to read this for a second or third layer to understanding git