Ask HN: Git alternatives that aren't so complicated?

37 points by forgotmypw17 ↗ HN
For the last three years, I've been developing my project strictly on master.

And the reason for this is that every time I try branching, within hours or days, something is screwed up, and I don't know how to fix it, and I end up having to reset and redo a bunch of code, if I didn't back it up.

This just happened again, even though someone else was holding my hand through the process.

At this point, I think I have tried at least 3 times, my minimum for trying something new, and I'm ready to give up on git and try something new, even if it costs me days of learning a new system.

Is there anything you would suggest to someone like me?

88 comments

[ 9.3 ms ] story [ 282 ms ] thread
Try Mercurial: https://www.mercurial-scm.org/ Much saner behavior than git, IMO. Last I heard, it is being actively maintained and Facebook still uses it for their source control.

Something else that might help out is one of the GUI git clients like SourceTree, GitKraken, etc. to help you visualize the state of your git repository.

Mercurial definitely is easier and prevents a lot of dangerous behaviour, but it's also unfortunately not quite supported enough to do much CI (unless you also want to maintain your own Jenkins setup) and isn't supported by some IDEs (looking at you, Xcode). The 2018 StackOverflow survey[0] regarding Version Control also shows how Mercurial fares, even against zip files (!!).

It shouldn't prevent anyone from learning it or using it, but it's important to keep those things in mind when considering any kind of work with existing companies (or on the flip-side, any recruitment of staff when creating a company).

[0] https://insights.stackoverflow.com/survey/2018/#work-_-versi...

Gitflow plus a copy of smartgit will go a long way
Let's be pragmatic about this.

- For single person projects, committing directly to "master" / main branch alone is fine. Releases can be tagged.

- Multiple branches are recommended if you need a complex workflow. But they aren't mandatory for using Git.

If Git works for you the way you use it, go ahead with it.

I'd try go understand how git works better than you do. I have been using git for 10+ years. Maybe my first couple years, I would get git in a confusing state, but that never ever happens any more.

If you stick with the basics (Level 1), never commit to master:

$ git add

$ git commit

$ git checkout -b

$ git pull origin master -r

Then trust your webtool to handle merges (github/gitlab), then its really hard to mess things up.

level 2 would be understanding how to handle merge or rebase conflicts.

Level 3 would be understanding how to use the `git reflog` cmd.

Git is so pervasive in software development that I think you will be at a disadvantage if you give up on it.

This is the sort of situation where I would recommend taking a step back, finding a good book that covers the topic, and read it cover to cover. At least for me, taking time outs like this to learn something in an academic manner has paid big dividends over the years.

I have to agree with this. It's an essential skill. There are great courses on LinkedIn and Coursera for free (even if you don't get the respective subscriptions).
> Git is so pervasive in software development that I think you will be at a disadvantage if you give up on it.

I would call BS on this. Yes, git is pervarsive, but if you learn alternative tool (mercurial, perforce, even svn), you will find that learning git (at least for being productive on team that uses git) is straightforward.

Also, haven't seen a company that actually tried during interviews ti figure out if you know how to use git or not.

Disagree. I learned Git after working with SVN for years. Knowing SVN put me at no advantage whatsoever. If anything, I had to actively get SVN habits out of my brain to make the most out of Git (e.g. SVN trains you to avoid branches because their merging is a hot mess, but in Git, branches are everywhere).
But you were able to be productive on those projects with git, even if you didn't use it optimally, or to full extend, right?
Sure, but that's moving the goalposts so much that you're invalidating your entire premise.
I agree with this first paragraph. But disagree with the second. Depends on what kind of learning style you have but I don't think a book is the best format for learning git (or most programming concepts for that matter). You probably already understand most concepts of git already anyway, but the devil is in the details and it sounds like that's where you're getting stuck. If you're a book person for technical things, though, then go for it.

I'd suggest that anytime you go into a situation where you're not sure if you'll mess something up, just make a full copy of your project on your local file system. Then try stuff out on the copy. Then you can try branching and such without the fear of messing anything up. Once you get it, you can repeat the process over and over to make sure you know it. You have to be able to fail without fear of wasting days of your time.

Mercurial is supposed to be more ergonomic to use, but it's not less powerful than Git, so you can probably get yourself into a screwed up situation with Mercurial, too.
I'd suggest that you block out some time to really learn how Git works. There are many resources available but the Git Pro book is arguably the best. Tutorials are very useful, too.
This interactive tutorial should be very useful: https://learngitbranching.js.org/
I agree. It wasn't until I went through this visualization that I actually 'got' git. I liken it to trying to navigate a filesystem without first understanding the metaphor of a hierarchical folder structure. Without understanding the fs in almost spatial terms (up and down the tree, adjacent directories, etc), the output of ls and friends would be nonsensical.

Likewise with git. Until you understand that you are crafting, navigating and reconciling immutable nodes in a structured history of directory contents, no amount of git man pages will help you.

If the git CLI is difficult, there are some good GUI git clients like Sourcetree and Git Tower that I would recommend. I still use Sourcetree pretty regularly if I'm working on a larger project and want to get a better picture of everything.

However, as others have said, I would recommend giving git a fourth try. It really is the standard tool in source control.

Somewhat related idea: I feel similarly about vim/emacs. Most senior developers in my company work in vim/emacs, and while I can definitely use either, I am MUCH more productive in something like VSCode. Will this hurt me in the long run? Is it worth the temporary reduction in productivity to make vim my primary editor?

TortoiseGit can make your life much easier if you haven’t yet found it.
I'll second that, TortoiseGit has been a lifesaver, especially its git log display, which is very details and lots of actions can be done directly using it by right clicking on commits.

I'm a visual person, with a horrible short term memory, and I never got along with the git command line, or with any other command line tool. When I need something slightly more complicated I google it.

Just a note that TortoiseGit is Windows only.
Learn git properly instead. It can be done. Sit down and start reading all the `git help` pages. As you read, clone a repo and try things out until you understand them. Experiment, read, experiment some more. Set a goal, like "I will make a branch, commit some changes, then merge them back". Try to predict what will happen before you run a command. Try to get back to where you were before. Try to achieve something in more than one way. Write an explanation for what just happened, then verify by repetition and more experiments that your explanation holds up. Find somebody to ask when you really can't figure out what is going on. But don't just get a solution in the form of strange commands, keep at it until you can reproduce the problem and the solution yourself.

Git isn't magical. Everything you will need to learn it is already at your fingertips.

As another commenter said, Git is so pervasive that learning something else would put you at a big disadvantage.

That doesn't excuse Git having an unintuitive UI that makes it very difficult to learn. It has that in common Vim, Emacs, the command line itself... and programming in general. What they also have in common is that once you get used to them they're wonderful tools.

If you don't practice using branches, resetting, rebasing, etc., you're not going to get good with them. Create a dummy repo and practice. There's no "easy button."

I was terrified of Git when I started using it. All the time, I would call in senior colleagues to resolve Git issues that went over my head.

Nowadays, I use Git for coding as well as writing, vector graphics, datasets, and anything else that isn't stored in binary. The time it took to get here was well worth it.

> That doesn't excuse Git having an unintuitive UI that makes it very difficult to learn. It has that in common Vim, Emacs, the command line itself... and programming in general. What they also have in common is that once you get used to them they're wonderful tools

I can't agree with that. Emacs, UNIX CLI etc are indeed powerful tools with a steep learning curve but they are wonderful once learned.

Git? Not so much. Git is not any better than mercurial (to OP: I recommend mercurial) but git is extremely user hostile to an extreme I can't think of any other popular tool ever.

Over the decades I've probably used every well-known source control system (and a handful less famous ones) and git is the only one where if I need to do anything out of the ordinary I will always backup the whole tree first because it's 50/50 odds git will go into some inexplicable and unrecoverable state and the code is lost. I've never had that happen with any other source control tool. Kinda defeats the point of source control.

I do agree with everyone saying git is a plague we must face so do learn it. I suggest doing so at work where they pay you to do unfun things, that's why they call it a job.

For personal/pleasure project I want to enjoy quality tools that are well designed, pleasant to use and don't fight against me - so I use mercurial.

Personally, I don't ever really find myself needing to back up a tree, or find myself encountering something unexpected (outside of the code itself). In my experience Git is extremely reliable... but only if you enter its weird commands with no typos whatsoever. Hence: this enormous dotfile I maintain that is half Git shortcuts: https://github.com/RobertAKARobin/dotfiles/blob/master/.bash...

It makes me think of an old car that only the owner can drive, because it'll break down for anyone who hasn't memorized all its quirks (e.g. my own bumper-sticker-covered, manual-transmission 1996 Toyota Corolla, fondly named Sharon).

Again, though, I have the same relationship with virtually all frameworks, tools, and languages (looking at you, Bash).

I have no idea what you are doing, I have only ever seen git lose data when I did an interactive rebase, and those are easy enough to backup, as all you need to do is do them on a new branch.

If git is confusing, I suggest reading up on merkle trees and directed graphs - I found git understandable once I grokked its mental model. Still sometimes have to lookup the actual commands, but it is very rarely the case that I am confused by anything.

use github/gitlab (you mentioned not having backups? git is your backup). there really is no substitute to git, but there are supporting tools that can make life easier: a good ide like intellij, github desktop, to name a couple. dedicate some time to learning it well (hopefully there are some good learning resources posted in the thread) and once you get over the hump it will start to pay dividends
I've worked on 10+ person teams over the past 5 years, on 10+ year old codebases with hundreds of thousands of lines. About 8-10 total years of software engineering experience in general. The best flow I've found, and the one my team uses now is:

1. Make a branch from master called `yourName/featureName` 2. Work on the feature for a day or two max 3. Merge it right to master

CI/CD runs all the tests, builds it, deploys it to stage. All the other engineers and product people can see exactly what master looks like at any given time. On our newer projects we skip the stage step entirely and just deploy straight to prod. Yes, no stage, right to prod. These are sites that get millions of hits a day.

This makes it so:

1. Engineers stop making big scary PRs REAL QUICK. Engineers always feature flag everything, de-risking changes drastically. There's something about the psychology of knowing your code is going straight to stage or prod that instantly causes people to make smaller changes. It's great.

2. I'm the best person at git on the team (probably because I set up all the CI/CD stuff), and I feel like I pretty much know nothing. I've watched like, half of an advance git tutorial on Frontend Masters and I'm light years ahead of my 2nd most knowledge coworker. I've realized 99% of people only have a surface knowledge of git, so the simpler you can make things for everyone the better. Everyone understands how to branch from master and merge it back in. And if they don't (which is OK! Engineers I've trained with < 1 year experience sometimes struggle) I can teach them within an hour.

I've been on teams with release branches. Nobody in my experience ever really gets it right, I might have been unlucky though. Usually it ends up a a merge conflict mess merging to master and a show stopping bug when it's deployed.

I recommend watching a couple of videos on git on a Sunday afternoon to make yourself feel a bit more confident, but honestly don't sweat it too much. The KISS rule (Keep It Simple Stupid) really shines with version control on git here.

That works but:

- pushes code into a master before it is ready

- makes next to impossible to work on several tasks at a time: current state of incomplete tasks is spread all over in the master. Even working on a single multi-day task with multiple commits, it's harder to see the task changes and any slight feature refactoring during prototyping or development now involves master.

An easy modification to this flow is:

1. Make a branch from master called `yourName/featureName`

2. While feature is not ready:

2.1. Work on the feature for a day or two max

2.2. Pull master, rebase your branch from master

3. Merge it right to master when your branch is ready

May be if you can give some examples of screw up you had, we can understand the exact problem and provide some help. My advice would be to understand how git works under the hood, after that you will be easily able to visualize git commands in you head and execute them with confidence.
Here's the screwup I experienced, as I understand it:

I started a new branch and developed on it.

I realized that my installs were no longer updating when I did a git pull, because I was no longer committing to master.

So I did a git checkout on the installs, and all was good.

Then, I wanted to merge the branch into master, so I did.

Then I did a "git push".

This is where things got screwed up, I think, because I did not know that, apparently, git does not push the whole tree in this case, only the currently selected branch. (wtf?)

After this, I looked at my local code, and some of my recent changes were gone, because it had either reverted to ... some older fucking version.

And that's when I posted this thread.

Git pull is just git fetch+merge

If you are confused at all use them in two steps, that also gives you more options such as (what I think you need in this case) merge remote master into your local branch (git merge origin/master).

Also I don't think you actually lost any code, if you do a checkout of the branch you did your work on, I think it should still be there based on your description.

Also git only pushes the current branch because it is designed to be used more decentralized than it often is: git does not assume you are ready (or want to) share all your branches right now.

Some options:

- Read a book or tutorials about reimplementing git. That will make clear its data model and how it works.

- Use libgit2 to extract some data from a git repository. As a side effect, you will become a git expert.

- Think what would you like as your source control flow. Use libgit2 or its binding in your favorite language to implement it.

- Adapt git flow or a similar predefined control flow.

- Try Fossil SCM (by the author of SQLite). Not recommended - you will need git in your career.

Just another POV being pretty good with Git, not bringing anything new compared to other answers but adding weight:

You're absolutely right that Git is terrible in terms of UX, and there's zero shame in messing stuff up like you did, it's standard. I think it's because Git contributors are such good Git users that they're blind to how bad it is for newcomers/intermediate users, and also they're not particularly interested in UX. But it's all free and open-source, let's be thankful it even exists.

> Is there anything you would suggest to someone like me?

No. I'm afraid that despite its bad UX it's the best out there (subjective, I don't even actually know other VCS very well). In addition, Git is so prevalent that not knowing it will be massive problem for you, career-wise or in your interaction with the open-source communities

Honestly, it hurts me to tell you that but I think your best option is to suck it up and learn it. Use GUIs (git tower, sourcetree, gitkraken...) if that helps

It's honestly hilarious how obsessed this industry is with Git. It verges on a fetish. Like writing code is an evil you need to endure so you can experience the high of using version control.
Before Git, branching and merging was a nightmare. People are using git to do much more complicated things than in the days of CVS/SVN.
I think a lot of the pain in git boils down to code structure and how merge conflicts conflate any bad decisions made there. If your codebase is well-structured, I.e. each logical unit of business functionality is in an independent source file or method, then disparate work branches should not create much trouble, even if they are wildly out of sync relative to current master. Git will transparently create merge commits if you do not explicitly rebase (and there are no conflicts).

Many times you have to explicitly sit down and spend a few days/weeks determining if you need higher-order abstractions which enable granularity in the code. For instance, we've developed abstractions such as View/Workflow/Context/Step which contain logical groupings/subsets of business logic and which are easily reasoned with in isolation (i.e. allowing many concurrent work branches). These were explicitly developed so that the software engineering process could function effectively.

Another potential pain point would be trying to do too much work on 1 branch or letting it become perpetual. Ideally, your work branches are a daily/weekly lifecycle before being merged back down to master. You should probably not try to maintain more than 1 permanent master branch unless you can confidently justify reasons for having another.

One good thing to practice would be to rebase any outstanding work branches against master after merging any work. (git checkout master && git pull && git checkout <work branch> && git rebase master). The more frequently you do this, the less likely you will wind up with a nasty merge conflict situation. This also allows you to re-test your work in terms of what would actually happen after a merge to master prior to making the merge. This makes it possible to develop effective check build safeguards in products like GitHub Actions.