[HN Gopher] Gitless: A simple VCS built on top of Git
       ___________________________________________________________________
        
       Gitless: A simple VCS built on top of Git
        
       Author : hosteur
       Score  : 172 points
       Date   : 2023-06-17 14:01 UTC (8 hours ago)
        
 (HTM) web link (gitless.com)
 (TXT) w3m dump (gitless.com)
        
       | taink wrote:
       | I haven't used Gitless before but usually these types of
       | abstractions fall short for me. It never helped me as much as
       | truly learning git.
       | 
       | I learned so much about the commands that intimidated me by
       | playing "Oh My Git!"[1]. It's an open source game that presents
       | commands as quick-to-understand concepts and lets you experiment
       | with them by using playing cards on the visual rendition of a
       | repository. I was honestly surprised nobody else mentioned it
       | here, maybe it's not that well known.
       | 
       | Of course it's not completely accurate all the time in its
       | descriptions but it sure helps understanding the underlying
       | workings a bit more, and it pushed me into actually reading the
       | manual.
       | 
       | [1] https://ohmygit.org/
        
         | TechBro8615 wrote:
         | Another fun learning resource:
         | https://learngitbranching.js.org/
        
         | tylerhou wrote:
         | I have "truly learned git" (including having written a clone
         | for a school project) and still hate the CLI and conventional
         | Git workflow. Why is checkout overloaded to mean "restore a
         | file from the index" or "move to a different branch" or "move
         | to a different commit?" Why can reset mean both "un-add a file"
         | or "delete a commit?"
         | 
         | I am very happy that there are better frontends for git like
         | Gitless or Facebook's Sapling. I also think their commands are
         | more of a 1:1 mapping to "raw" git operations behind the
         | scenes.
        
           | charrondev wrote:
           | To be fair even if those commands are still overloaded there
           | are new commands that aren't overloaded. (git restore for
           | example now has its own command).
        
         | perdomon wrote:
         | This sounds like a great tool, but I'm not sure anything could
         | push me to read the Git documentation. It's written by someone
         | too brilliant for me. I prefer to find a Stack Overflow answer
         | where someone has dumbed it down a bit.
        
           | dreamcompiler wrote:
           | The Git docs are horrible, but that's not because the author
           | is smarter than you. It's because the author is a lousy
           | communicator.
        
         | Antipode wrote:
         | I'm curious as to why the windows version is 8x the file size
         | of the mac/ linux ones
        
           | Hamuko wrote:
           | Maybe it contains a segment about installing git on Windows.
        
           | lost_tourist wrote:
           | It's likely that they need to include the full std library in
           | the windows version (build with something other than
           | microsoft's c++ compiler, like msys g++ or similar)
        
         | giraj wrote:
         | Oh My Git! looks really cool and useful, thanks for mentioning
         | it! I find it incredible that it's funded by the Prototype Fund
         | (https://prototypefund.de/project/oh-my-git/), and it makes me
         | wonder which other countries have similar funds hackers can
         | apply to.
        
       | lcall wrote:
       | Another git-compatible, simpler VCS is "got" (about which I don't
       | know enough to compare well). It's targeted to OpenBSD devs but
       | ported to various *nix platforms.
       | 
       | https://gameoftrees.org/
        
       | dewey wrote:
       | I always feel like the main issue with tools like that is that
       | you'll then just have to learn a separate syntax that's not
       | portable and will be even harder to find instructions for.
        
         | iudqnolq wrote:
         | That's why I like that lazygit has a pane showing you the
         | underlying git commands as it runs them.
        
           | namtab00 wrote:
           | same with GitExtensions... never used the git CLI, never had
           | to, but if I did, with GitExtensions all git commands are
           | visibile and logged
        
         | doublepg23 wrote:
         | This is why I personally use ed(1), the standard text editor. I
         | never have to worry about portability.
        
       | memefrog wrote:
       | Git is easy to use if you just read the manual.
        
       | timetraveller26 wrote:
       | I don't like this, if you are too lazy to learn git how can you
       | expect to become a competent developer?
       | 
       | /s
        
       | nathants wrote:
       | what threads like these show is not that git is hard, but that
       | collaborative software implementation is still an experimental
       | and challenging approach.
       | 
       | in absence of a tyrannical dictator, it may not even be possible.
        
       | Certhas wrote:
       | I would have loved for gitless to become a mainstream way of
       | using git. Unfortunately it did not... Maybe one could implement
       | the gitless workflow in VSCode to help it take off? I still think
       | their basic analysis and the reduction in state that the
       | resulting system has is spot on (and I believe it is also aligned
       | well with what works in Mercurial/Sappling).
        
       | aeturnum wrote:
       | I think tools like these are fantastic and I do not think that
       | git "is easy" or anything like that. Lots of people do not need
       | to understand the details of the git model and should not have to
       | use git directly.
       | 
       | That said - if you _are_ a senior on a project using git flow or
       | something like it - you should treat understanding git as a
       | concern of the first order. The commands are somewhat obtuse, but
       | the tool is a pretty reasonable attempt to grapple with the
       | underlying challenges of managing disparate work from different
       | people going at different speeds. It is challenging to understand
       | because it is fundamentally quite difficult. Don 't under-rate
       | the importance of this to your overall process! Learning git will
       | help you understand the challenges of distributed development
       | (and visa-versa) - they are real and not simply an artifact of
       | bad UX.
        
         | [deleted]
        
       | mtizim wrote:
       | The gitless vs git section is lacking. I can see the diffrences,
       | but you're not making any claims that it's better. I don't really
       | know why I should use gitless from this page.
        
         | chiefalchemist wrote:
         | This happen a lot (read: too often). That is, speaking to
         | features instead of calling out benefits.
        
         | wussboy wrote:
         | That's not the impression I had. It was immediately clear that
         | switching branches in Gitless did what Git always should have
         | done and that was enough for me
         | 
         | Unfortunately it doesn't work on Windows.
        
       | dang wrote:
       | Related:
       | 
       |  _Gitless: A simple version control system built on top of Git_ -
       | https://news.ycombinator.com/item?id=18512854 - Nov 2018 (138
       | comments)
       | 
       |  _Gitless: a version control system_ -
       | https://news.ycombinator.com/item?id=12621837 - Oct 2016 (372
       | comments)
       | 
       |  _Gitless - An experimental version control system built on top
       | of Git_ - https://news.ycombinator.com/item?id=9144160 - March
       | 2015 (47 comments)
       | 
       |  _Gitless: experimental version control system_ -
       | https://news.ycombinator.com/item?id=9019892 - Feb 2015 (48
       | comments)
       | 
       |  _Gitless: an experimental version control system built on top of
       | Git_ - https://news.ycombinator.com/item?id=6927485 - Dec 2013
       | (46 comments)
        
       | animal_spirits wrote:
       | I'll continue to plug Lazygit
       | https://github.com/jesseduffield/lazygit - I wasn't able to grok
       | git until I started using this tool
        
       | graypegg wrote:
       | Always thought there was a good use case for something like this,
       | but as some embeddable library. If you have some software project
       | that shouldn't require a technical understanding of version
       | control from your users, but should be able to handle version
       | naming and collaboration, you might want something that abstracts
       | away some of the messier parts of the git workflow and touches
       | the file system less. (no merge headers injected in files for
       | example) Bonus points if it just works over git so users could
       | host it wherever.
        
       | wejick wrote:
       | > Simple commit workflow
       | 
       | The first point explanation is not so simple
       | 
       | Though I will love the independent branches, not have to stash
       | everytime moving between branch.
        
         | lozenge wrote:
         | Start using worktrees, eg I have one for development, one for
         | reviewing other people's code, and one for looking at another
         | commit (usually main, using checkout --detach ). You could
         | easily have more.
        
           | recursive wrote:
           | I tried this for a while but find it easier just to maintain
           | multiple working folders.
        
       | adontz wrote:
       | I'm teaching Git in University.
       | 
       | For all those who think that Git is easy, it's not.
       | 
       | It takes a student about 20-30 hours to really understand all
       | usual Git commands. I'm not talking about something bizarre like
       | ls-remote, but really understand merge, rebase, bisect. Not just
       | syntax, but all the consequences. For instance, why rebasing
       | something already pushed to public often leads to false merge
       | conflicts, how does stash really work, etc.
        
         | jayd16 wrote:
         | I think git is fairly easy as far as data structures and such
         | goes but the issue is that you need to understand it to use it
         | well.
         | 
         | In the same way that you don't need to understand the inner
         | workings of Google Docs, Git should be something you don't even
         | have to learn. Sadly we're not there.
        
         | highmastdon wrote:
         | Honestly, "easy" is relative. Understanding software
         | engineering is a study of 4 years, so having someone take a
         | course on fit for 20-40 hours is literally half a week of
         | proper studying and you'd know git. I don't get why there are
         | bootcamps for _only_ JavaScript CSS that take at least 8 weeks
         | of hard work and then half of those to learn git and call it
         | "not easy". It's the depth that we want to commit to
         | understanding something that leads to people saying it's not
         | easy. Invest proper time into it and everyone (in sw eng) can
         | learn git
        
         | hedora wrote:
         | The porcelain parts of git are terribly complex (though
         | improving; especially if you just apply the config changes it
         | suggests during normal operation).
         | 
         | However, the core data model is simple (it is a content
         | addressable store, where each commit contains pointers, forming
         | a directed graph; the pointers are unforgeable, so the graph is
         | acyclic).
        
           | williamdclt wrote:
           | And a monad is just a monoid in the category of endofunctors
        
           | Certhas wrote:
           | This meme needs to die. That is one tiny component of the
           | data git touches when working with it.
           | 
           | There are many sources of interacting states, some internal
           | to git, some not:                 the local tree of commits
           | remote trees of commits       a possible origin relationship
           | between the two       branch labels on each local and remote
           | with possible relationships between them       the HEAD label
           | stash       index/staging area       the actual working
           | directory       .gitignore
           | 
           | A simple question like which files are being tracked is
           | actually a complex result of several different places in the
           | above. Untracking a file is consequently extremely non-
           | obvious.
        
             | nemetroid wrote:
             | Each commit in Git contains a file tree. So a single commit
             | is what's needed to answer the question "what files does
             | this commit track?", which is _the only question about file
             | tracking that makes sense to ask in Git_.
             | 
             | Describing Git's behaviour in terms of other version
             | control systems' semantics (e.g. Subversion or Mercurial)
             | is not necessarily easy, but that's not what's being
             | claimed.
        
               | Certhas wrote:
               | That's incorrect. Git considers files tracked if they are
               | in the last commit or staged. As far as I am aware it
               | considers files untracked if they are not tracked and not
               | ignored (though git clean -x documentation suggests that
               | it considers such files untracked and simply ignores them
               | when listing untracked files, which also makes sense). So
               | un/tracked depends on last commit, staging area and
               | possibly .gitignore.
               | 
               | > Remember that each file in your working directory can
               | be in one of two states: tracked or untracked. Tracked
               | files are files that were in the last snapshot, as well
               | as any newly staged files; they can be unmodified,
               | modified, or staged. In short, tracked files are files
               | that Git knows about.
               | 
               | > Untracked files are everything else -- any files in
               | your working directory that were not in your last
               | snapshot and are not in your staging area.
               | 
               | https://git-scm.com/book/en/v2/Git-Basics-Recording-
               | Changes-...
        
         | ww520 wrote:
         | If it takes students with no background in source version
         | control to really understand the usual Git commands in 20-30
         | hours, that's a huge success.
        
           | adontz wrote:
           | They have background in IT
        
         | prakis wrote:
         | Git is not easy, some concepts are confusing especially for
         | newbies. I wrote a simple intro on how git works https://git-
         | help.com
        
         | kylejrp wrote:
         | I really like using The Git Parable to help people understand
         | the motivations behind Git. Remotes and staging seem really
         | weird at first.
         | 
         | https://tom.preston-werner.com/2009/05/19/the-git-parable.ht...
        
         | achates wrote:
         | The command line is really unintuitive. Like using 'checkout
         | -b' to create a branch but 'branch -D' to delete one.
        
           | adhesive_wombat wrote:
           | > 'checkout -b' to create a branch
           | 
           | Well that's actually "create a branch and then checkout that
           | new branch". And you can use "git switch -c" if you feel the
           | "checkout" verb is confusing.
           | 
           | The command to _just_ create a branch is  "git branch". Git
           | branch won't touch the HEAD pointer, that's what switch does.
           | 
           | And if "git branch -c" were the command for "create branch
           | and switch", it would be criticised in the exact same way:
           | creating a branch and switching to it would be a different
           | subcommand to that used for switching existing branches.
           | Except now the branch command can also do "switchy" things to
           | your HEAD pointer, sometimes (and the fact that checkout also
           | only sometimes changed the HEAD is why switch was
           | introduced).
        
         | [deleted]
        
         | Buttons840 wrote:
         | Since you teach Git, I'm curious if you've tried
         | https://ohmygit.org/ , and what your opinion of it is?
        
         | recursive wrote:
         | I've used 20 or 30 git commands over 8 years or so. Many on a
         | daily basis. I haven't gotten around to to rebase yet. It's
         | definitely not essential.
        
           | throwbadubadu wrote:
           | No, definitely not, but if you start using it you can fall in
           | love with it easy and suddenly find merging overly
           | complicated :) I dread the merge workflow my colleagues do in
           | a strange multi-repo-with-subrepos project - I just rebase
           | all branches in all repos and find it even simpler and be
           | happy and can still see my history at least :D
        
         | kazinator wrote:
         | Students have to understand the concepts first, then the
         | commands.
         | 
         | Many of the commands don't make sense, and many of them are
         | dumb implementations, which wouldn't be done that way in a
         | clean redesign of git, even if it were based on the same
         | storage model and concepts.
         | 
         | Some of the commands are essentially tooling that is external
         | to the Git storage model and emulates delta-based version
         | control on top of the native snapshot model. The commands lead
         | to fundamental misunderstandings such as that commits are
         | changes.
        
         | whatscooking wrote:
         | Pareto principle. 80% of the time all you're doing is git add,
         | git commit and git push.
        
         | xhainingx wrote:
         | When I teach students git I show them init, status, add commit,
         | diff, and log. That's all I focus on for several weeks.
         | 
         | That's enough to track changes to your own projects, see the
         | benefit of tracking what you've changed, and build the habit of
         | commiting frequently. IME, adding anything more about remotes
         | and branches is overwhelming to the point they don't bother
         | with git because they aren't going to distinguish the
         | fundamentals from those more complex features.
         | 
         | Obviously branches and remotes are vital in real development,
         | you just can't expect them to learn it all from the start.
        
         | tgv wrote:
         | I don't get it. Why would you spend so much time on git? You
         | can teach the core ideas in 2 hours, let them do some homework
         | (4 hours?), and the rest they can figure out later. I don't see
         | the value of understanding git in detail.
        
         | tasuki wrote:
         | I've only taught git like two or three people. 20-30 hours is
         | insane. Could it be that starting from the commands is not the
         | best way?
         | 
         | Git is basically just blobs, trees, commits, and refs [0]. Four
         | simple concepts. Yes the interface is confusing and I don't
         | know it either, but things are easy enough to look up.
         | 
         | [0]: I love "fast intro to git internals":
         | https://docs.google.com/document/u/0/d/1X5SnleaX4qpLCc4QMAMW...
        
           | ShamelessC wrote:
           | You taught people with some sort of existing knowledge or
           | advantage. This is one of those classic pitfalls that comes
           | with experience - we forget how hard things were early on
           | and/or fail to realize when something was "easy" because we
           | had natural talent or passion.
           | 
           | It's probably best to consider that something like git is
           | _not_ inherently interesting and is more likely
           | (subjectively) boring and tedious to humans who are
           | comfortable with simple saving and undoing of files.
        
         | jancsika wrote:
         | > For instance, why rebasing something already pushed to public
         | often leads to false merge conflicts
         | 
         | This sounds like obscurantism.
         | 
         | What bad thing happens if students just assume that rebasing
         | something already pushed to public _will_ cause merge
         | conflicts, and just never do that?
        
         | quadrifoliate wrote:
         | I don't think Git is easy at all.
         | 
         | But 20 hours seems a worthwhile investment to me for something
         | they will likely use for at least the next decade of any
         | serious work with software? I'm assuming that this doesn't mean
         | literally 20 hours of _instruction_.
        
           | baby wrote:
           | > But 20 hours seems a worthwhile investment to me for
           | something they will likely use for at least the next decade
           | 
           | Yet most people just want to use VSCode and don't want to
           | invest 20+ hours learning emacs or vim
        
             | cassianoleal wrote:
             | What's your point exactly?
             | 
             | I spent a lot more than 20h learning emacs. It was my main
             | editor for years.
             | 
             | I use VS Code now. It serves me very well.
        
               | qorrect wrote:
               | > I spent a lot more than 20h learning emacs. It was my
               | main editor for years.
               | 
               | Yeah same, are people saying 20h commitment is a lot now
               | ? Not sure if I've gotten old, or if things are easier to
               | learn now - but a 20h commitment seems like very lite.
        
               | HWR_14 wrote:
               | (1) If I can spend 20 hours learning something boring or
               | 20 minutes learning something else boring _but they do
               | the same thing_ I would prefer 20 minutes.
               | 
               | (2) There are more tools to learn. That 20 hours/minutes
               | is being multiplied by an ever growing number.
        
               | cassianoleal wrote:
               | Thing is, git is pretty much everywhere. I don't think
               | I've had a single job in the last 15 years or so where
               | the client or employer wasn't using git. 20h to learn a
               | tool that will be used daily for decades (yes, I expect
               | this trend to go on for at least another 10-30 years),
               | and the choice is not mine to make, is not much.
               | 
               | I should say, if the choice was mine, I'd probably still
               | choose git. It's powerful, it's something I can already
               | make really good use, and I feel comfortable easing new
               | people into it. Regardless, the point is that I don't
               | have that choice as an individual who's part of a team or
               | an organisation.
               | 
               | On the other hand, I can choose my code editor without
               | interfering with my fellow engineers's own choices. Here
               | I chose the one I could learn in 20 minutes and get
               | better the more I used it.
               | 
               | It took me very little time to get productive with VS
               | Code, and then a few more days to get used to most
               | shortcuts I use. Everything else is accessible via the
               | command palette and more shortcuts can be learned as
               | their functions become used more frequently. Until that,
               | the palette is an excellent interface. It also serves as
               | a discovery mechanism for features.
               | 
               | With emacs I _had_ to learn _a lot_ before I started
               | getting productive. I got very good at it. Multiple
               | cursors, window jockeying, buffer wrangling, the works.
               | Any functionality that fell in disuse for some time, I 'd
               | risk forgetting their shortcuts. If I did, the only way
               | to use it would be to somehow remember the shortcuts,
               | probably by interrupting work and googling, or by trying
               | to navigate its archaic menu systems.
               | 
               | With vim it's not very different. I still use it more or
               | less daily but mostly for single file editing over SSH,
               | since even if I need to do more complex editing on a
               | remote server, I can use my local VS Code.
               | 
               | I don't think people _have_ to use VS Code. I work daily
               | with other engineers who use it, but also any of the
               | Intellij editors, vim, emacs, you name it. We can all
               | live in harmony and collaborate just fine. Not so much if
               | each would chose their own VCS.
        
             | tombert wrote:
             | I've been using Vim (well, neovim now) for a long time,
             | it's my primary editor, and I think I'm reasonably good
             | with it, but I really don't think I'm appreciably more
             | productive than the average VS Code user.
        
             | SAI_Peregrinus wrote:
             | "EMACS is not hard, you can learn it in a day... Every
             | day."[1]
             | 
             | [1] https://www.youtube.com/watch?v=urcL86UpqZc&t=325s
        
               | GeorgeTirebiter wrote:
               | The thing I like about Emacs is: there is always another
               | 'prestige level' for you to strive for, because you will
               | never master everything. You get better, and better, and
               | better ... positive feedback, increasing ability to get
               | stuff done.
               | 
               | win win.
        
             | KronisLV wrote:
             | > Yet most people just want to use VSCode and don't want to
             | invest 20+ hours learning emacs or vim
             | 
             | To expand upon this, for version control there are pieces
             | of GUI software that can allow you to handle the typical
             | workflows without touching the CLI. Packages like Git Cola,
             | GitKraken and functionality that's bundled with most IDEs
             | as well.
             | 
             | In addition there are also platforms like GitHub, GitLab
             | and Gitea which will let you easily get changes merged
             | across branches with either a single commit or different
             | strategies, all with the press of a button.
             | 
             | I don't think that there is a reason for everyone to do a
             | deep dive into Git, aside from their own curiosity, or when
             | using complex workflows.
        
             | tikhonj wrote:
             | That doesn't mean that learning Emacs would not be
             | _worthwhile_ , it just means people don't do it.
        
             | tuukkah wrote:
             | Interestingly, the features of Emacs, Vim and VSCode are
             | largely orthogonal (on top of any basic text editor).
             | Further, a lot of people advocate using CLI instead of most
             | VSCode features. Waiting for the holy grail, you can still
             | learn from each:
             | 
             | * Vim key bindings for text edits
             | 
             | * CLI commands for Git
             | 
             | * Emacs modes such as Magit and org-mode
             | 
             | * VSCode for tight Typescript integration, nice block
             | structure visualisation etc.
             | 
             | I hope some editor will combine this all. (I think Emacs
             | will be best placed to achieve this with its extension
             | ecosystem that already includes Magit, org-mode, evil-mode
             | etc.)
        
               | cassianoleal wrote:
               | VS Code already has extensions for all that.
        
               | subsection1h wrote:
               | VS Code doesn't have anything comparable to Org mode. The
               | "VS Code Org Mode" extension[1] has maybe 1% or 2% of the
               | features of Org mode for Emacs. Go read Org mode's
               | manual[2] from start to finish (134,062 words) and then
               | direct us to an extension for VS Code that has comparable
               | features (e.g., plain text spreadsheets).
               | 
               | [1] https://github.com/vscode-org-mode/vscode-org-mode
               | 
               | [2] https://orgmode.org/org.html
        
               | cassianoleal wrote:
               | Fair enough! I don't use it so wouldn't know.
        
               | tuukkah wrote:
               | VSCode has a long list of me-too features and extensions
               | but in my experience, not many are of great quality.
        
             | tredre3 wrote:
             | I used vim for 30 years by now, 15 of those it was my main
             | text editor/IDE-like. I was one of those who would spend
             | hours on achieving the perfect configuration and mix of
             | scripts. I was one of those who thought smugly "I'm so much
             | more productive than those idiots using Eclipse or
             | Sublime".
             | 
             | But you know what? I moved to VS Code a few years ago and
             | my productivity only increased. Everything is more
             | intuitive and discoverable. Everything just works with no
             | tweaking. All the convoluted macros and text manips I
             | painstakingly crafted and memorized in vim are achievable
             | in a few clicks in Code.
             | 
             | Spending 20+ hours learning emacs or vim is quite literally
             | a waste, it's time we all admit it.
             | 
             | (I still think one should learn the basic cursor keys and
             | how to save/quit in vi because sooner or later you'll have
             | to edit something on a remote server with only vi. But
             | learning emacs is still completely useless, though.)
        
               | codr7 wrote:
               | Not at all.
               | 
               | There's nothing out there as configurable and portable as
               | Emacs.
               | 
               | Easier, sure.
        
               | tombert wrote:
               | I don't disagree, but I think a followup question would
               | be "how configurable do you really need your text editor
               | to be?"
               | 
               | Don't get me wrong, I'm all for tinkering with stuff and
               | customizing to oblivion, it's fun and cool, but
               | realistically how much better of a JS engineer are you
               | going to be if you've customized the hell out of Emacs?
               | Maybe a _bit_ more, I 'll concede that, but fundamentally
               | I don't think it's going to be categorical.
        
               | codr7 wrote:
               | I have no idea, I'm a software developer, I write code in
               | whatever language I need to and Emacs is always there to
               | support me.
        
               | subsection1h wrote:
               | > _Spending 20+ hours learning emacs or vim is quite
               | literally a waste, it 's time we all admit it._
               | 
               | For me, with my ability to learn at the rate that I do,
               | Emacs provides the best solutions for Git (Magit), email
               | (mu4e), calendar (Org), to-do lists (Org), note taking
               | (Org) and more.
               | 
               | And I don't use software like mu4e because I already use
               | Emacs; I use it because I have installed and evaluated
               | dozens of email clients over the years and concluded that
               | mu4e is the best for me given my requirements.
               | 
               | For people who aren't as particular about the software
               | they use, Emacs may very well be "quite literally a
               | waste".
        
           | rhaway84773 wrote:
           | The problem is that git alternatives which achieve pretty
           | much the same so not take 20 hours to learn. A lot of those
           | 20 hours are spent because git has a poor UX and a poor
           | execution model which almost requires understanding it's
           | underlying working and data structures to be able to use it
           | effectively.
           | 
           | There's several alternatives where you can be as effective if
           | not more in a fraction of the time. The one that I preferred
           | was mercurial, but unfortunately since GitHub was so
           | successful we are all forced to learn git.
        
             | vladsanchez wrote:
             | I share your sentiment and opinion.
             | 
             | Gitless looks, feels and smells like Mercurial (hg), which
             | is simpler and more effective.
             | 
             | It only took everyone 18yrs to realize it (sarcasm).
        
               | GeorgeTirebiter wrote:
               | What do you mean by 'more effective'?
        
           | Certhas wrote:
           | There are a lot of people who could benefit from git (or who
           | are forced to interact with it sporadically) for whom this is
           | a real problem.
           | 
           | The problem is also, if you don't use it daily git knowledge
           | decays fast.
           | 
           | There is a piece of advise that was making the rounds
           | (unironically) at the research institute where I worked
           | before: "Before you do anything with git, first make a local
           | backup copy."
        
             | bombcar wrote:
             | That's the idea behind https://xkcd.com/1597/ and it's more
             | true than people will admit.
        
               | jeltz wrote:
               | Can't agree. While learning git isn't trivial it is still
               | easier than it was learning Subversion and at all places
               | I have worked at a decent share of the devs understood
               | git. If a dev cannot grasp git I would not trust them
               | with any non-trivial code base.
        
               | Certhas wrote:
               | Nobody claims that git is impossible to use. It clearly
               | isn't or it wouldn't be so successful.
               | 
               | But it could demonstrably be better and easier and we are
               | stuck in a local minimum of a good enough solution
               | because of the network effects.
        
               | bombcar wrote:
               | Many more people use git than just developers. Especially
               | with GitHub in there.
        
               | redeeman wrote:
               | you mean merging branches? because in all other aspects,
               | subversion is significantly simpler and i would say far
               | better UI. Much of this also comes from not being
               | distributed
        
         | stavros wrote:
         | I've been using git for twenty years and I still don't
         | intuitively know what half the operations do. When my local
         | tree fucks up, it might as well need open heart surgery,
         | because I can fix my repo as much as I can perform that.
        
         | digdugdirk wrote:
         | Any tips for someone outside the industry wanting to up their
         | hobby programming game? Basically just trying to avoid the
         | Useful_Script_v2-Final-Final-ReallyFinalThisTime.py syndrome,
         | and realizing the value of a dated change history.
        
           | spondylosaurus wrote:
           | Check out the book _Learn Git in a Month of Lunches_. It 's
           | exactly as advertised--only thing to keep in mind is that it
           | was written before the master > main changeover, so depending
           | on your local config you may need to swap that out when
           | you're following along with its exercises.
        
           | entropie wrote:
           | You only need to understand {init,commit,diff,status,push} to
           | use git. When something goes wrong you can delete your .git
           | and start new. This obviously not what you want when you have
           | a codebase with collaborateurs somewhere public accessible,
           | but its fine to get used to it.
        
             | sorenjan wrote:
             | That's only true if you don't want to undo any changes.
             | What's the easiest way to get back the previous version of
             | function foo() in file bar.py if I already made other
             | commits to the same file, and want to keep those?
             | 
             | Keeping a "bar copy(2) final working.py" file is not about
             | having a nice looking timeline, it makes it very easy to
             | get back to a working state. All you need is copy and
             | paste, or keep the working function as a comment in bar.py.
             | You can see your working code and know you're not messing
             | with it when you're experimenting with bar.py. I'm not
             | saying that's the best way of doing it, but it's a very
             | common use case that's not usually addressed in git guides,
             | where it's all about pushing commit after commit, maybe
             | branching, maybe pushing to a remote with others, but
             | rarely enough focus on undoing mistakes after some
             | experimenting if you didn't branch first.
        
               | dolni wrote:
               | > What's the easiest way to get back the previous version
               | of function foo() in file bar.py if I already made other
               | commits to the same file, and want to keep those?
               | 
               | You are operating under the assumption that foo() changes
               | in a vacuum. That is an invalid assumption for lots of
               | software changes.
               | 
               | Commits are supposed to contain one logical change each.
               | That logical change may or may not cross function
               | boundaries (often it will).
               | 
               | Reverting a commit should revert the logical change. That
               | is how you accomplish what you're after in git.
        
               | sorenjan wrote:
               | I've seen so many people do the "select function body,
               | copy, toggle comment, paste copy of function, try out
               | ideas on this new version" workflow. I've done it plenty
               | too in Matlab and similar during various labs at school.
               | I'm not talking about best practice during software
               | engineering, I'm talking about having the confidence your
               | code can easily get back to a known good state if you
               | want to experiment, like beginners should do a lot of.
               | 
               | And plenty of times functions are self contained enough
               | that you can change the function body without changing
               | other code as well.
        
             | dolni wrote:
             | Telling someone to "delete your .git" is actually TERRIBLE
             | advice. This should never be necessary unless you go
             | screwing around in .git and break internals. It has a high
             | probability of causing irreversible data loss. It's exactly
             | the worst habit to build if you want to start
             | collaborating.
             | 
             | If your repo ends up in a weird state, learn how to fix it.
             | It should not be terribly complicated, especially if there
             | is no rebasing happening.
        
           | aquova wrote:
           | The main complexities of git really come when you start
           | having to work with other people also editing the same files
           | you are. If you're just doing a solo project, you'll likely
           | be mostly on a single branch, maybe a handful of others if
           | you're experimenting a lot. In that case, you largely just
           | need to know add, commit, push, checkout, and can largely
           | ignore the complexities of merging and rebasing.
        
           | thewebcount wrote:
           | My suggestion would be to not learn git. Go with just about
           | any other version control system if you're not using it
           | professionally. I've used cvs, Subversion (svn), Perforce
           | (p4), and others. Honestly, Subversion and Perforce were both
           | significantly easier to setup, learn, and use than git. While
           | they all have their growing pains, it took me about a week to
           | get used to Perforce. It took me more like a month or two to
           | get used to svn. I've been using git for years and still find
           | it very hard to use and strongly dislike interacting with it.
        
             | badsectoracula wrote:
             | I second Subversion - though only because it is the closest
             | to an open source alternative to Perforce. Otherwise it has
             | a bunch of problems, like three separate half-baked
             | implementations for shelving and aside from TortoiseSVN
             | every other GUI front end has been either abandoned or on
             | life support with a bunch of bugs.
             | 
             | But unless you have to work with other people in places
             | like github, etc, it beats having to bother with git -
             | especially for games that have a ton of binary files
             | (which, unlike what some people will tell you, you _want_
             | to have both version controlled _and_ in the same
             | repository).
             | 
             | Hell, if you really want a DVCS go with something like
             | Fossil, it is still much easier than git, simpler to setup
             | (just a single binary) and has more features (wiki, bug
             | tracker, forum, etc) that you will find useful anyway.
             | 
             | Though personally the best experience i had with VCS is
             | with Perforce, at least in gamedev: check out the latest
             | version, merge any local changes, make modifications in a
             | changelist, shelve the changelist in case i want to stop
             | working on something and work on something else, use the
             | shelve to send a WiP version to a coworker to merge with
             | his changes (or see if things work as expected) or for code
             | review, etc.
             | 
             | Sadly Perforce seems to be bound in a company that tries to
             | sqeeze it for all its worth, adding a bunch of stuff of
             | questionable usefulness, etc. It'd be nice if there was an
             | open source alternative to it that allowed for the same or
             | very similar workflows, all the issues i had with P4 over
             | the years (e.g. merges between streams) were due to how P4
             | seems to be implemented, not due to anything inherent in
             | the workflows themselves. There is no reason for an
             | alternative to copy all the bugs.
        
             | tasuki wrote:
             | Hard disagree. Subversion is awfully complex compared to
             | git.
             | 
             | Yes, Subversion is initially easier to learn and use than
             | git. It's not easier to set up as it's client-server while
             | git is fully local. Also Subversion is an incongruous mess.
        
               | COMMENT___ wrote:
               | Subversion's CLI is actually sane and much easier
               | compared to the abomination provided by Git.
               | Additionally, Subversion can be used entirely locally,
               | without the need to deploy and configure any server
               | application.
               | 
               | It seems that you are comparing apples to oranges.
               | Building your own SVN server from the ground up can
               | indeed require some effort. Doing the same for Git
               | demands more or less the same level of effort on your
               | part. So, I believe you are comparing building an SVN
               | server from the ground up to something like installing
               | Gitea or GitLab, or using Git locally.
               | 
               | Again, you don't have to install an SVN server. Just run
               | `svnadmin create REPONAME` and use the `svn` client to
               | import your data into the repository.
        
           | CitrusFruits wrote:
           | I think you can immediately get value out of Git, even if you
           | don't understand almost anything. Also there's a lot less
           | footguns if you're not collaborating with anyone else.
        
         | MikusR wrote:
         | It takes hours to explain to some what variables are.
        
           | redeeman wrote:
           | im gonna go ahead and say, that if it does that, they
           | probably wont be needing something like git
        
         | dv_dt wrote:
         | I'm not sure it would be much shorter with some other version
         | control program. Merges, rebasing and bisect are fundamental to
         | what version control does.
        
         | unmole wrote:
         | I taught myself Git in University. Over the course of a decade,
         | I've taught Git to dozens of people. Sure, some people take
         | more time than others but 20-30 hours sounds absolutely wild to
         | me!
        
         | rmccue wrote:
         | If you're including rebasing, then I can believe this
         | (rewriting history is nuanced and complex), but I'm not sure
         | I'd be teaching that straight away. My recommendation is
         | usually only to start using rebase once you're already very
         | familiar with the rest of git, since it's almost never
         | _necessary_ to achieve what you want.
         | 
         | Also, bisect is definitely not common, and the vast majority of
         | my colleagues wouldn't know it exists; I'd place it into the
         | look-it-up-if-needed category.
        
           | cassianoleal wrote:
           | > bisect is definitely not common
           | 
           | Agree.
           | 
           | > I'd place it into the look-it-up-if-needed category.
           | 
           | Disagree. Bisect is so useful in so many different scenarios
           | that learning about it and the basics of how to use it is a
           | great way to get people into git. Obviously not right at the
           | beginning of their learning curve but as soon as the basics
           | have been covered satisfactorily.
        
             | aaomidi wrote:
             | I wish more people would know about bisect mainly because
             | they'd design the toolchains to actually support testing
             | when you're doing bisect.
        
           | willio58 wrote:
           | I've used git successfully professionally for almost 10 years
           | and I'm not lying when I say I've used rebase about 5 times.
           | We just merge. We squash sometimes. I think it must be
           | because I've always worked in smaller orgs but rebase just
           | seems to always be over complicating something simple (a
           | merge). I get that there's a benefit of a cleaner history but
           | to me the benefit of simplicity merge offers makes it
           | superior
        
             | adontz wrote:
             | It highly depends of culture of specific team. I've seen
             | teams obsessed with "clean" history, rebasing and squashing
             | everything they possibly could. I believe it's a matter of
             | taste, I never understood the argument.
        
             | ahelwer wrote:
             | You have to fix conflicts either way so what's the
             | difference? I suppose when merging you only have to fix the
             | cumulative conflicts, while when rebasing you have to
             | incrementally fix the conflicts introduced by every commit
             | which is annoying. I usually squash a branch (rebase on
             | where it diverged) before rebasing to fix this.
        
               | adontz wrote:
               | After rebasing you basically have two versions of the
               | same commit, and that is the root of the problem.
        
               | unmole wrote:
               | > After rebasing you basically have two versions of the
               | same commit, and that is the root of the problem.
               | 
               | No, you have two commits. Git commits are snapshots, not
               | diffs. Git's data model is simple. The fact that people
               | do not bother trying to understand it is the root of the
               | problem.
        
               | p1esk wrote:
               | Why is this downvoted?
        
               | halostatue wrote:
               | It's worth configuring rerere (reuse recorded
               | resolution): https://git-scm.com/docs/git-rerere for
               | merges and rebases, because repeated rebases or merges of
               | similar code will become substantially easier.
        
               | frutiger wrote:
               | > revere
               | 
               | Innocent typo but for anyone else reading, it's "rerere".
        
               | halostatue wrote:
               | Thanks. I still had time to fix it, so I've corrected it.
               | I had typed rerere, but autocorrect "fixed" it for me
               | whether I wanted it fixed or not.
        
             | gte525u wrote:
             | FWIW - I've worked with both rebase workflows and merge
             | workflows. If you rebase a long lived branch what breaks is
             | /your/ code not the rest of the codebase in a rebase
             | workflow vs the opposite being true with merges.
        
             | bryanlarsen wrote:
             | Rebase got a lot less annoying now that git has gained the
             | update-refs ability. I'm often working on multiple branches
             | simultaneously, and update-refs lets me easily work on them
             | as a stack.
        
               | ptx wrote:
               | How do you use it? It sounds (from the manual page) like
               | it just changes what a branch points to... so how is it
               | different from "git reset --soft"?
        
               | bryanlarsen wrote:
               | Here's how i use it: I call my HEAD "bl-dev". Let's
               | suppose I have 5 commits on bl-dev that aren't on main.
               | Each of those commits is a branch with a functional name.
               | If I type "git rebase --update-refs origin/main" all 6
               | branches get updated, not just bl-dev.
               | 
               | Let's suppose the next thing I do is add something to the
               | bottom of my 5 branches. I dont switch to the branch, I
               | stay on bl-dev and add a commit to bl-dev. Then I type
               | "git rebase --update-refs -i HEAD~7" and move the commit
               | up in the stack to the correct location and again all 6
               | branches update.
               | 
               | "git rebase --update-refs -i" also gains the ability to
               | change which commit any branch points to.
               | 
               | I don't actually type "--update-refs", it's a gitconfig.
        
             | loeg wrote:
             | I use rebase essentially every working day. I use rebase
             | for managing my local tree of patches, regardless of
             | interaction with colleagues. Merge is fine, I guess, but do
             | you never get the order wrong and want to reorder things
             | before you push? Or keep moving around some local debugging
             | patch on the top of your stack, without pushing it to your
             | colleagues?
             | 
             | IMO merge is almost never what you actually want, unless
             | you've been working separately for a long period of time
             | (and generally you should not being doing that because it
             | leads to surprising conflicts / regressions at merge time).
        
               | KnobbleMcKnees wrote:
               | It depends what you mean by separately. Big organisations
               | can have dozens of teams implementing unrelated
               | functionality with asymmetrical overlaps for conflicts.
               | I've never found a situation where rebase was appropriate
               | for this kind of setup.
        
               | loeg wrote:
               | If the functionality is unrelated, I'm not sure why
               | rebase would be inappropriate. It just wouldn't matter
               | much other than keeping history clean (and rebase would
               | make for cleaner history than merges).
        
             | ttfkam wrote:
             | I always rebase from an up-to-date main/master before
             | pushing my feature branches. So much easier to deal with
             | than merging after the fact.
             | 
             | But yeah, after that initial push, it's just merges from
             | there on out.
        
             | dtech wrote:
             | squashing is a form of rebasing, albeit a narrower and
             | simpler case. Indeed I do not understand why rebasing is so
             | popular instead of merging when you're going to squash at
             | the end anyway.
        
             | kazinator wrote:
             | Git merging is completely stupid. It collapses multiple
             | changes into a single commit. The original chain of commits
             | is referenced, but in a useless way that only complicates
             | the git history.
             | 
             | When you merge 17 changes from foo-feature into master,
             | master has only a single commit. You cannot bisect master
             | to determine which of the 17 broke master.
             | 
             | The 17 commits are there, but only in their original form,
             | based on some old commit. Those 17 original commits are not
             | equal to the single merged commit. The single merge could
             | have a bad merge.
             | 
             | If there is going to be a bad merge, it's better to have a
             | bad merge in one of 17 commits being individually rebased,
             | than to have a bad merge in a single merge bomb that
             | conflates 17 commits.
             | 
             | Your little branch of the original 17 commits should be
             | purely a private object; it does not belong in the
             | upstream. It's just a historic accident that your work was
             | originally based on some three-week old random commit that
             | happened to be latest at the time when you started. There
             | is no need for that to be published. Your job is to make
             | sure your code is based on the latest commit and promote it
             | to the branch, as a sequence of individual changes (which
             | all build and pass unit tests, etc).
             | 
             | I've literally not typed "git merge" since 2010, and around
             | that time I learned how not to have Git perpetrate unwanted
             | merges on me by learning never to type "git pull". "git
             | pull" can be configured to be "git pull --rebase", but you
             | will forget. I trained myself to do "git fetch", then "git
             | rebase".
             | 
             | In all my last three jobs, the review tool Gerrit was used.
             | Gerrit is based on cherry picking, which is rebase. Commits
             | are submitted in their original form (not necessarily
             | rebased to the target branch, but indicating which branch
             | they are for). When approved, they are submitted and that
             | means cherry pick. Maybe Gerrit can merge; I've never seen
             | it used that way. Gerit has rebase right in the UI. You can
             | take a commit and rebase it to its logical parent (latest
             | patch set of an apparent parent with which it had been
             | submitted together), or to the current head of the branch.
        
             | throwbadubadu wrote:
             | Done right and understood, it is as simple as merging, if
             | conflicts arise no difference to conflicts via merge?
             | 
             | But you get rid of those ugly merges back and forth and
             | unviewable histories.. Not sure why not more people care, I
             | guess it is a little OCD I do that for my stuff.. however
             | the 20-50+ user projects where everyone, often multiple
             | times merges develop or even other branches in.. really
             | unusable history right away, lets not talk about any point
             | later. Git has derailed to a mere backup system where you
             | can jump back, but understanding changes later becomes
             | impossible :(
             | 
             | What people also rarely know: A linear history is without
             | lies, but one can sneak additional changes into a merge
             | commit that was in neither branch quite easy - I hate that!
        
               | formerly_proven wrote:
               | > Not sure why not more people care
               | 
               | Most people don't care about most stuff, it's pretty
               | normal.
               | 
               | But here specifically: Most developers don't read code,
               | nor documentation, and essentially no one reads commit
               | messages. VCS is a WOLM - write-only linear memory - to
               | most developers. That's probably also why most people
               | don't care to write any kind of reasonable commit message
               | - the software requires them to input something, so
               | something is input - and also do not care about
               | unreadable (and also unusable) VCS histories. They're
               | never looking at it, it's only written. Hence it's
               | meaningless for them if it is extremely difficult to
               | trace changes or hard to bisect, they don't even attempt
               | such things. There's a reason the history browsers in all
               | the online tools and IDEs _effin suck_ , it's because on
               | average nobody uses history.
               | 
               | I know, I know, this gets across very elitistically, but
               | it's just how most people do their jobs. They get bugged
               | to do a thing, so they sort of do the thing in order to
               | not be bugged any more about it. I'm pretty sure that
               | caring for these things is some kind of OCD like you say,
               | i.e. a mental disorder.
        
               | no_wizard wrote:
               | My biggest issue with rebase from a learners perspective
               | is that you get conflicts that simply don't happen with
               | merge.
               | 
               | I've had experiences where I'm trying to rebase a branch
               | and it keeps flagging my most recent changes in the
               | rebase when the intention is that I want all previous
               | changes applied then as a final step show me a conflict
               | if applicable, don't show me one when it's not the
               | "final" step.
               | 
               | Admittedly maybe I'm doing it wrong.
               | 
               | I also don't like how rebasing "main" onto my branch
               | actually seemingly takes my branch and rebases it onto
               | "main"? Maybe that's a fault in my IDE not entirely sure
        
               | galaxyLogic wrote:
               | I think the difficulty with rebase and merge is much
               | about semantics. When you "rebase" what does that word
               | suggest to you? To me it sounds like "Base Again". So I'm
               | changing the base from which I started the current branch
               | to something else?
               | 
               | Not quite. That would mean that my old base is REPLACED
               | by something else, right?
               | 
               | Instead rebase means take some other branch then put all
               | the changes in the current branch on top of it, keeping
               | everything in the current branch but just adding them on
               | top of something else, right?
               | 
               | It grokked with me when in my IDE (WebStorm) I saw the
               | menu-option allowing me to choose another branch and
               | perform "Check Out and Rebase on top of the current
               | branch". So you don't just "rebase a branch", you combine
               | two branches. And when you combine two things here the
               | order matters, and it is easy to confuse the order.
               | 
               | Similarly if you merge two branches, which one overrides?
               | The left or the right operand? It is easy to get
               | confused. Maybe I am. It is not my fault.
        
               | jfengel wrote:
               | It does not help that git really is checkpoints rather
               | than deltas. The semantic difference is usually
               | ignorable, but it can matter when you're trying to
               | rewrite history. It's coming up with deltas on the fly,
               | and if it gets confused it can get very very lost.
               | 
               | Every rebase really is at least three branches: what
               | you're merging into, where you started, and where you are
               | now. And God help you if somebody rewrote history on any
               | of those.
               | 
               | The fact that all of these have terrible names makes it
               | so much worse.
        
               | charrondev wrote:
               | In my org we require all important data to be listed on a
               | pull request, then enforce squash merge. If you have
               | multiple distinct changes you want reflected in the
               | history then you make multiple PRs.
               | 
               | This makes bisecting a lot easier too.
        
               | kazinator wrote:
               | "enforce squash merge" == "pretend Git is Visual Source
               | Safe or CVS"
        
               | jfengel wrote:
               | I really wish git bisect understood merges better, so
               | that you didn't have to fake it with squash.
        
           | adontz wrote:
           | I see bisect as a git superpower. Also grep (with rev-list).
           | It's like knowing regular expressions. Not that one writes
           | regexps every day, but this knowledge/skill definitely
           | uplifts one to the next level.
        
             | lost_tourist wrote:
             | I basically have to relearn regex's almost everytime, yeah
             | it's a bit easier each time, but I still have to go back
             | through some basic examples to get those old neurons
             | stirring.
        
           | jupp0r wrote:
           | Rebase is used for many things in a lot of workflows. I use
           | it probably 30 times per day in my job.
        
           | ranaexmachina wrote:
           | If you teach all the concepts of Git (e.g. commits point to
           | parents but not to children or branches are labels that point
           | to a commit) properly it takes some time but then you get a
           | lot of the more advanced things such as rebase kind of for
           | free. In my experience, people often struggle with those
           | because they have no clue how Git internally works. I had the
           | same problem but when I looked into that it clicked and
           | suddenly all the commands made a lot more sense.
        
           | Jenk wrote:
           | I don't know how successful of a metaphor this would be for
           | students, but for developers who haven't had any familiarity
           | with DVCS that I have worked with, I use a coat-rail analogy
           | with some success:
           | 
           | You start with a "main" rail of coats. Each coat is given a
           | number, indicating what order it is in.
           | 
           | You start adding coats to a new, empty, rail, using the next
           | number. When you are done collecting coats on this new rail,
           | you want to move your coats onto the original rail.
           | 
           | In the time it has taken you to collect the coats onto your
           | rail, someone else has already added coats from their new
           | rail to the end of the "main" rail, and they used the same
           | base number that you have - which means you cannot just add
           | the coats from your rail onto the main rail, else the
           | numbering would be broken - we call this a conflict. (NB:
           | There is a magic guardian of the rails that means this just
           | cannot happen, which is a plot device that is just to make
           | this metaphor work so don't question it, it's just a
           | metaphor.)
           | 
           | To resolve the conflict you have the following "rebase"
           | options:
           | 
           | - Slide all of the coats on the main rail up to make room for
           | yours, and update all of the numbers on your coats, using the
           | new number from the last coat as the base number for your
           | rail's sequence. This ensures that everything on the main
           | rail is "before" your rail. This is the equivalent of a
           | rebase. After this, you can then put your coats on the end of
           | the main rail without conflict.
           | 
           | - Then there is the option to take a copy of the main rail
           | onto the front of your rail, and organising the coats one-by-
           | one (much like in the above), placing your coat(s) in between
           | some of the new coats on the main rail, then forcibly
           | replacing the main rail with your updated rail. This last one
           | is just as drastic in reality as it sounds in this metaphor.
           | We call this the "interactive rebase" and it is rewriting
           | history for anyone who has used the main rail before.
           | 
           | - Finally we have a merge which means adding one big magic
           | coat at the end that takes the coats from both rails and
           | combines them in a singularity, with the new base number
           | being Hawking's radiation or something, I dunno. The metaphor
           | is no good for merges.
           | 
           | (Truth be told: the entire metaphor started in my head some
           | years ago with just the visualisation of that distinct coat
           | rail sweep noise to squish the garments on the rail to onside
           | to fit what our main protagonist is holding onto the rail,
           | the rest I just back-filled over time)
        
           | jedberg wrote:
           | > I'd place it into the look-it-up-if-needed category.
           | 
           | Knowing how to use git bisect is what elevates a programmer
           | to the next level. Just understanding how it works gives you
           | a new way to reason about bug finding and fixing (or feature
           | development using old and new), and then actually using it
           | can make you a bug fixing master.
        
             | pydry wrote:
             | It feels like a weird and magical superpower but
             | realistically I find use for it about once every 6 years
             | and even then I'm fairly sure I could have done without it.
             | 
             | This was not my impression when I first learned about it. I
             | thought I'd be using it all the time.
        
               | jedberg wrote:
               | > and even then I'm fairly sure I could have done without
               | it.
               | 
               | Just understating how git bisect works is the real
               | superpower. The tool is a nice add on, but often you're
               | right, is easier to bisect by hand by going to a known
               | working commit and then doing a smart bisect based on the
               | code you think might be offending.
               | 
               | But at least knowing the concept of bisection is a huge
               | game changer.
        
               | pixelpoet wrote:
               | I'm pretty sure every programmer learns about binary
               | search near the beginning, and even without that has
               | searched through some alphabetical listing without
               | starting at aardvark (if not, I'd argue they have zero
               | hope at much of anything abstract).
               | 
               | Really feels like a stretch to credit git, of all things,
               | with that fundamental understanding. It's like saying you
               | need to operate a nuclear power plant to understand the
               | benefits of locking doors.
        
               | xenomachina wrote:
               | When people search through alphabetical listings, they
               | usually don't use plain old binary search, but instead
               | use something like interpolation search. For example, if
               | you want to find the word "xylostroma" in the dictionary,
               | you aren't going to start in the middle. Instead, you'll
               | start about 90% of the way through, and then make
               | adjustments based on how far off you were.
        
               | lost_tourist wrote:
               | Yeah but that is only optimal if you know the general
               | location. Often when you have a bug you don't know where
               | it snuck in, especially if it's something like a race
               | condition.
        
             | rmccue wrote:
             | I don't disagree, and I personally use it, but it's a
             | decent distance from teaching students the basics of git.
             | I'd bundle it into a group of tools that are useful to know
             | the existence of, and look up the docs when needed.
        
           | kazinator wrote:
           | Using rebase is crucially important to anyone who is ready to
           | start using git to track a remote repository and produce new
           | changes to be pushed must learn about rebase. You have to use
           | rebase to rewrite your unpublished commits over the latest
           | upstream in order to be able to push a fast-forward change.
           | 
           | Many new users of git don't have the luxury of learning how
           | to use local-only git with no remote.
           | 
           | Now rebase is a farm implement: a mechanized cherry picker.
           | Cherry picking should be taught first, and then rebase
           | explained in terms of being a multi-cherry-pick operation.
           | 
           | Before teaching cherry picking, you have to teach that Git is
           | based on snapshots and not deltas. Git cherry-pick is part of
           | tooling that is inside Git, but external to its snapshot-
           | based storage model. When you cherry pick some commit into
           | your current branch, the tool finds the common ancestor
           | between your branch and that commit. It then does a three-way
           | diff using the files in the cherry-picked snasphot, your own
           | branch snapshot and the common ancestor-snapshot. The three-
           | way diff operations produce a merged version that becomes a
           | new commit: another snapshot.
           | 
           | If I ran a class on Git, we would spend part of a lecture
           | doing manual merges with the diff3 utility: I would have the
           | students take some ancestor file and make a "my" and "yours"
           | with different changes, and merge these with diff3. We would
           | go through conflict markers and all that.
           | 
           | Old time hackers who used other version control systems
           | before Git knew all this stuff already. The first time I
           | encountered conflicts, I already knew how to resolve them.
           | Just a few git concepts were new like having to add resolved
           | files to the index.
           | 
           | Imagine you know nothing about version control. Words like
           | "unified diff" ring no bell. You've never seen conflict
           | markers. You've never applied a patch or produced one.
        
         | Topgamer7 wrote:
         | I often ask the difference between a merge and a rebase is in
         | my interview questions. It is exceptional common that they
         | cannot even describe it.
         | 
         | I typically use it as a barometer for how in depth the
         | candidate tries to understand underlying mechanisms of tools
         | they use.
        
           | pydry wrote:
           | It's also exceptionally common that the difference doesn't
           | matter in the slightest.
           | 
           | I'd file this question under "trivia the interviewer believes
           | correlates with performance".
        
           | rcme wrote:
           | This is the type of interview question I hate. You're
           | basically selecting for candidates who care about the same
           | problems you do.
        
             | rizzaxc wrote:
             | if the interviewee would be a direct report of the
             | interviewer, I dont see the issue
        
               | rcme wrote:
               | Not an issue per se, but there are plenty of candidates
               | who might not care about merging vs. rebasing but have an
               | interest in other things. So many interviews consist of
               | interviewers hoping you parrot their own worldview back
               | to them. It's not a good way to build a team.
        
               | tasuki wrote:
               | I prefer rebasing (for the usual reasons). I have
               | successfully worked with people who prefer merging (for
               | the usual reasons).
               | 
               | I don't think I'd work successfully with people who don't
               | care.
        
               | rcme wrote:
               | I don't care. Why? Because it's largely a meaningless
               | distinction that has nothing to do with the goal at hand.
               | It's like eMacs vs. vim or tabs vs. spaces.
               | 
               | Another way of thinking about interviewing is this: you
               | say you don't want to work with people who don't care
               | about this problem you care about. That's fine, I guess.
               | But if you changed your viewpoint to "I want to work with
               | candidates who care about interesting things" then you
               | might find you ask more about what they care about and
               | less about what you care about.
        
             | yxhuvud wrote:
             | Yes, if I want to find someone to work with I certainly
             | want someone that do care about not making a total mess in
             | the VC history. Selecting for that seems like a very good
             | thing, regardless of whatever else they contribute.
        
             | heyoni wrote:
             | Exactly. Dig into what they know!
        
       | 2h wrote:
       | no updates in two years:
       | 
       | https://github.com/gitless-vcs/gitless
       | 
       | and no Windows support. no thank you.
        
         | ayhanfuat wrote:
         | Yes, looks like mostly abandoned https://github.com/gitless-
         | vcs/gitless/issues/248
        
         | kseistrup wrote:
         | https://github.com/goldstar611/gitless claims to be a
         | "maintained fork of the simple git interface". Latest commit
         | was in November 2022, though.
        
       | tomas789 wrote:
       | For quite some time now I believe there should be a better
       | alternative to git. I have never thought of building it on top of
       | git. Neat.
       | 
       | What I think should be there is a daemon doing autocommity and
       | automatic sync with server. Even if you work from multiple
       | machines.
        
       | Aerbil313 wrote:
       | I don't know git besides pull and push (never needed it, not an
       | employed SWE). Should I learn it or should I learn shinier and
       | supposedly easier alternatives like jujutsu? I only code for
       | myself.
        
       | Jacky4Chan wrote:
       | BIG PROBLEM with git is that it works in terms of editor lines
       | and not in language constructs. It should instead track changes
       | in terms of language constructs. For example, tracking the
       | history of a class individually, an interface, etc... changes
       | could be logged automatically. For this to work it would, of
       | course, require to be adapted for each language.
       | 
       | Furthermore, it could work in architecture terms, such as an MVC
       | files that could be tracked as an individual unit. The
       | architecture for a file system could be defined and enforced in a
       | git file, it could spot missing pieces.
       | 
       | Also, it needs dependency management for these units.
        
         | CapsAdmin wrote:
         | It could be something that just sits outside of git and uses
         | the raw git history to figure out what changed in a semantic
         | way. It doesn't have to be part of git.
         | 
         | This sounds like something C# programmers would dream of having
         | or making.
        
         | G3rn0ti wrote:
         | > It should instead track changes in terms of language
         | constructs.
         | 
         | This does not generalize very well. On top of GIT's core data
         | structures and file management facilities you would also need
         | parser plugins for all languages now and additional commands to
         | manage language constructs. This would make it even more
         | difficult to grasp.
         | 
         | I would say version control of text files in general is not an
         | easy problem. GIT's complexity arises from the complexity of
         | the problem it solves. Perhaps the user interfaces of
         | subversion or mercurial are easier but I don't think they lift
         | the burden of understanding version control and why it is
         | necessary from beginners ...
        
         | lolinder wrote:
         | I can see two ways to implement something like this:
         | 
         | 1. Completely alter the paradigm for editing software: from
         | editing text to editing the AST (or a projection of it). See
         | Unison [0]. This gives you fine-grained understanding of every
         | aspect of the development flow, but requires rewriting most of
         | the tooling that developers are already using.
         | 
         | 2. Layer the smart features on top of the existing text
         | streams. This gives you less control and is more resource
         | intensive, but you don't throw away the entire developer
         | ecosystem.
         | 
         | If we choose #1, we waste millions of man-hours building these
         | tools for every new language.
         | 
         | If we choose to layer our language-specific features on top of
         | text, then why does this need to happen at the Git level
         | instead of at a higher level of abstraction? IntelliJ, for
         | example, can already use the git history to tell you who wrote
         | a given method and when. This kind of functionality could, in
         | principle, be extended to following the history of a method
         | when it's moved or renamed.
         | 
         | Is there any benefit gained by having the VCS itself do the
         | language-aware processing instead of having language-aware
         | tooling layered on top of the VCS?
         | 
         | [0] https://www.unison-lang.org/
        
         | namtab00 wrote:
         | this existed, at least for diffs of C#, as semanticmerge
         | (bundled with GMaster and PlasticSCM), from Codice Software, a
         | Spanish company.
         | 
         | since it got bought by Unity, they've discontinued it... so my
         | license of it evaporated. I've missed it a lot, having to diff
         | with kdiff3
        
         | erik_seaberg wrote:
         | We should be creating more domain-specific languages, but this
         | would be an impediment.
        
         | Espressosaurus wrote:
         | That is A problem, but the biggest problem IMO is that it
         | doesn't make it easy to perform the tree operations. Everything
         | has a special syntax, the reflog isn't ergonomic to use if you
         | screw up, the staging area is a bit of unnecessary cruft for
         | most workflows, and the branches-as-pointers model doesn't
         | match how most businesses use a VCS.
         | 
         | Once you understand a DAG and the concept of a hunk, it's easy
         | to say what I want to do, but using the command line tool makes
         | it a pain in the ass.
         | 
         | It also doesn't help that the rest of the user interface is a
         | bunch of complicated behaviors tacked onto marginally related
         | commands.
         | 
         | The underlying model is also _weird_. You would expect it to be
         | diffs, but instead it 's full files. Fortunately you can ignore
         | that.
         | 
         | Git: unnecessarily difficult since it was invented.
        
       | g4zj wrote:
       | Does this somehow eliminate the need to learn the basics of git?
       | 
       | If so, is learning the basics of this abstraction easier enough
       | to justify _not_ learning git -- an immensely widely-adopted
       | tool?
       | 
       | If not, how is this preferable to a series command line aliases
       | that the user in question finds more convenient and/or intuitive?
        
         | hedora wrote:
         | I don't think so. This is just cleaning up the cli commands.
         | Their branch fuse is the same thing as a rebase.
         | 
         | Once you understand merge vs rebase, you understand how git is
         | implemented under the hood, and the rest is dealing with wonky
         | cli syntax.
        
       | woudsma wrote:
       | I used to be opposed to git GUI's, but after a few years and
       | working in larger codebases, I love the way they visualize
       | everything. Especially when dealing with hundreds of branches.
       | Sure I'll use the git CLI from time to time but GitKraken works
       | really well for me. I feel pretty safe seeing my stashes in front
       | of me, etc.
        
         | kelahcim wrote:
         | I tried GitKraken once. Then, I switched to Sublime Merge and
         | stopped worrying about all these fancy branches in my projects
         | :)
        
       | softwaredoug wrote:
       | 90% of my git problems I've solved with two aliases: "git
       | publish" and "git synced"
       | 
       | Publish pushes to the remote (doing the right thing to safety
       | update it, force push with lease).
       | 
       | Synced updates the local branch with the trunkiest-trunk
       | (upstream preferred over origin, using whichever one of main or
       | master exists). It rebases against that remote branch.
       | 
       | https://github.com/softwaredoug/idiot-proof-git
       | 
       | (With handy shortcuts to create a PR and go to the repos URL)
        
         | jmholla wrote:
         | I believe your synced alias can also largely be solved by
         | adding this to your `.gitconfig`:                   [pull]
         | rebase = true
        
       | whatscooking wrote:
       | Why does git need to be any more simplified? Makes no sense
        
       | [deleted]
        
       | habosa wrote:
       | Wow this is a timely post. Literally two days ago I thought
       | "there should be an easier way to use git" and I went out and
       | bought gitless.io ... I didn't even check what was on the .com!
       | 
       | To the author: I think I'll need a new name for my tool (I was
       | imagining something fairly different and UI based) so if you want
       | the .io just let me know.
        
         | avgcorrection wrote:
         | There's also git-branchless so watch out for that "less" as
         | well.
        
           | ChadNauseam wrote:
           | git branchless is awesome, I use it every day at work to
           | quickly move commits around or rebase on top of master
        
       | [deleted]
        
       | mihaic wrote:
       | Every single time I see one of these attempts at simplifying Git,
       | I'm reminded of how bad source control is when forced to use in a
       | terminal.
       | 
       | Entering commands in a terminal means you always have have a
       | mental view of the state you're operating in, and having better
       | affordances that are equally as powerful would have made a world
       | of a difference to beginners.
       | 
       | No wonder Git is like C++, where many argue a subset of it would
       | be best to use, but nobody agrees on the exact subset.
        
         | thunderbong wrote:
         | Have you tried fossil?
         | 
         | https://fossil-scm.org/
        
       | lopkeny12ko wrote:
       | This entire project seems to be a workaround for the fact that
       | junior developers are not willing to learn Git.
        
         | jedberg wrote:
         | It does admittedly have some nice syntactic sugar for things
         | that are annoying in git but come up often, like the easy
         | include/exclude of files and being able to switch branches
         | without having to stash or resolve merge conflicts.
        
       | IshKebab wrote:
       | There's also Jujitsu that looks a bit more interesting IMO:
       | 
       | https://github.com/martinvonz/jj
       | 
       | Or Pijul if you want to give up on Git compatibility.
        
         | ziml77 wrote:
         | This seems to be the one to try. Gitless appears to be
         | abandoned.
         | 
         | And I like this idea of having an alternate model of
         | interaction with git. It seems to fit well within the git
         | design of having common plumbing and being able to swap out the
         | porcelain.
        
       | locusofself wrote:
       | After this many years (and previously using cvs, svn etc) .. I
       | really don't want to switch again.. git is great IMO. There is no
       | way that learning to use git is more difficult than say, calculus
       | or basic algorithms.
        
         | Kinrany wrote:
         | Calculus is older and better designed than git, so I don't find
         | it surprising!
        
         | spencerchubb wrote:
         | Most CS professors at my school do not know how to use git. The
         | department insists that professors use git in the classroom,
         | which is probably a good idea given the ubiquity of git. My
         | professors are forced to try and teach it to students without
         | really understanding it themselves, so it's a struggle for
         | everyone.
         | 
         | Perhaps my professors don't know git because they got their PhD
         | before git was invented (2005), and they never needed to learn
         | it.
        
       | julien040 wrote:
       | Shameless plug: I've tried to build an alternative CLI for Git
       | [1].
       | 
       | I think it's just too hard to create a new abstraction. Git seems
       | too widespread and many people won't switch if they already have
       | muscle memory of the commands. Perhaps we haven't found the
       | correct abstraction yet.
       | 
       | [1] https://github.com/julien040/gut
        
       | gigatexal wrote:
       | I'm the git guy on the team and even I get a bit nervous when
       | having to resolve conflicts or figure stuff out in out branching
       | strategy. 95% of the time I am fine and so is the team but it's
       | when things involve many teams and many commits on the same
       | subset of files that things get hairy.
       | 
       | I will say this: I find git much better than Microsoft's Team
       | Foundation Server (I know it can be setup to use git now) but I
       | like git overall a lot more.
       | 
       | Does anyone think any of the competitors to Git will take off? I
       | hesitate to move to something else because inertia is a thing:
       | all my stuff is on github, the team and all my colleagues at work
       | know it, guides exist for it online, but then again ... if I
       | could master a better tool I could teach everyone... hmm.
        
       | nathants wrote:
       | ff-only is the real git superpower.
       | 
       | a linear, immutable, series of commits in the only branch that is
       | suffered to exist.
       | 
       | git, the good parts.
       | 
       | it also pairs well with a simplified remote[1].
       | 
       | 1. https://github.com/nathants/git-remote-aws
        
       | cupofjoakim wrote:
       | I support this fully. Juniors and intermediate engineers I work
       | with still struggle with git quite often and I personally know
       | how that feels firsthand.
       | 
       | Not sure if this solves the issue. I personally recommend using
       | git, but keeping it simple by limiting the allowed operations.
       | 
       | - git switch - git checkout - git add - git commit - git pull -
       | git push - git rebase - git reset
       | 
       | Note the absence of merge and and cherry pick. Most often when a
       | junior has messed something up it seems to be because of merging
       | in a weird order or cherry picking the wrong thing before merging
       | or rebasing.
       | 
       | Either my juniors have stopped asking me for advice (totally
       | possible) or this recommendation helps. As I find myself very
       | seldom needing those commands I hope and believe it's the latter
       | :)
        
         | quesera wrote:
         | I use git merge a lot (others might too, perhaps only via the
         | Git(Hu|La)b interface though?).
         | 
         | I use git cherry-pick _very_ occasionally. I agree it 's
         | probably a mistake in most cases, but there are valid heavily
         | constrained circumstances where it's fine.
         | 
         | I had never heard of git switch. It looks like just another git
         | checkout?
        
           | bombcar wrote:
           | checkout is an older command and does more
           | 
           | switch just does what people think checkout does.
           | 
           | https://linuxhandbook.com/git-switch-checkout/amp/
        
         | kingdomforgit wrote:
         | I agree mostly but recommend avoiding rebase at all costs at
         | all times always and always prefer merge. Rebase is pure evil
         | plain and simple.
        
           | okeuro49 wrote:
           | I use rebase to roll up all my commits before submitting a
           | PR.
           | 
           | Don't see what the big deal is.
        
             | quesera wrote:
             | That's the simple and safe use of rebase. Rolling up your
             | local wip commits into a coherent story of one or a few
             | clearer commits.
             | 
             | The more-complicated but still safe use is to rebase your
             | local branch on top of an advanced upstream before pushing.
             | Some people prefer merge for this case, but it is somewhat
             | impure.
             | 
             | The problematic use of rebase is on pushed branches.
             | Especially if you have collaborators.
        
               | SAI_Peregrinus wrote:
               | > The problematic use of rebase is on pushed branches.
               | Especially if you have collaborators.
               | 
               | Yep. As soon as you have a PR out, and have to address
               | comments, you have a public branch and can't safely
               | rebase it. So you can't roll those new changes in to the
               | "clean" history, If upstream also has changes before your
               | PR gets merged, you'll also have to add a merge commit
               | anyway.
        
               | morelisp wrote:
               | This is a problem of GitHub, not Git. E.g. GitLab
               | preserves comments as well across rebases as any commit
               | changes.
               | 
               | "Don't rebase public branches" is an easy way to say "if
               | someone has built something on top your branch, don't
               | rebase unless you expect them to also rebase." 90% of the
               | time this is not actually harder than merging, though,
               | and still produces a better history and more atomic
               | commits.
               | 
               | At this point I'm even only 99% firm on "never rebase
               | master", as long as release tags are truly immutable.
        
             | l72 wrote:
             | The rebase crowd seems to be obsessed with it due to
             | wanting linear history.
             | 
             | In my opinion, the reason for all of this is due to how
             | `git log` shows history. If you merge a branch, then every
             | commit in the branch is now scattered among your mainline
             | history, making it confusing to see what is going on.
             | 
             | So, instead of fixing `git log`, you end up rebaseing (and
             | possibly squashing) on top of the main branch, then doing a
             | fast forward commit so you get a "clean, linear history".
             | 
             | But, if git just change the default of `git log` to `git
             | log --first-parent`, then so much of this would go away.
             | 
             | Only top level commits (directly to the branch, fast-
             | forward merged, or a merge commit) show up in the history.
             | 
             | Now, let's say I have a branch that I've been working on
             | for 2 weeks. I have 20+ commits. During that time, I've
             | already needed to merge the main branch into my branch to
             | keep it up to date several times.
             | 
             | I can either rebase the whole thing, to clean up history,
             | remove the merge commits from main, squash unnecessary
             | changes, and so on, just so I can get a "clean" history in
             | main, or, we can just do a merge commit bringing in my
             | whole branch with a good commit message.
             | 
             | I prefer the merge commit because it is then very easy to
             | track _all_ of the changes made in my branch by a single
             | commit. I can do a diff on the merge commit and see all
             | changes. I can cherry-pick just the merge commit and bring
             | in all the changes. If I need to break down what the
             | original developer of the branch was doing, I can walk
             | through all the sub-commits.
             | 
             | There is no need for them to rewrite history and hide their
             | workflow or their process.
             | 
             | But again, the problem is, by default, `git log` shows this
             | as a huge mess, whereas `git log --first-parent` would
             | _only_ show the merge commit, and would hide all the child
             | commits that happened in the branch. After all, the top
             | level merge commit is what is important, we only care about
             | the subcommits when we need to dig in.
        
               | jrmg wrote:
               | I don't think 'linear history' captures everything.
               | 
               | In the orgs I've worked in, it was important that
               | mainline always (bugs notwithstanding) always be
               | 'runnable'. Many people (myself included) will happily
               | commit in-progress changes to branches they're working
               | on. If these in-progress changes get into the mainline
               | branch - even as a result of a merge - they become part
               | of its history and break the 'always runnable' property.
        
               | Nullabillity wrote:
               | That's still not a problem, as long as you consider the
               | first parent the canonical parent you can still make
               | assumptions like this along the canonical history,
               | without sabotaging the true history.
        
               | avgcorrection wrote:
               | The "run on every commit" stance is an argument against
               | rebasing. Without it you have even more freedom to rebase
               | your branches. And there's less reason to care about the
               | "true history" (bogus concept).
        
               | avgcorrection wrote:
               | > But, if git just change the default of `git log` to
               | `git log --first-parent`, then so much of this would go
               | away.
               | 
               | Not really.
               | 
               | If you don't care about the individual commits that lead
               | to a merge (you only care about the final merge) then you
               | could just do `git commit --amend` through the whole
               | process. The end result would be the same.
               | 
               | But presumably these people (who aren't narrowly focused
               | on a linear history) do care. And (as you seem to be
               | saying) sometimes you want to go down into the second
               | parent of the merge commit.
               | 
               | And in that history (with just merges) there's a bunch of
               | random "synch. points" where they merged the original
               | branch into theirs. Why? Maybe because it had been three
               | hours, maybe it was the start or end of the day, or
               | something else?
               | 
               | Can you look at the three-way diff and see why?
               | 
               | And then there are all sorts of half thought out commits
               | and missteps that could have been edited out if they used
               | rebase.
               | 
               | Using rebase does have drawbacks. But you can get back
               | value proportional to the time you invest in it. So it's
               | not a simple matter of discovering that `--first-parent`
               | is a thing and then setting an alias for that (really,
               | you thought that would be it?).
               | 
               | And using merges only (including synch. merges) _also_
               | has its advantages. But no, using rebase is not just
               | about hiding pull request branches.
        
           | computerfriend wrote:
           | I rebase constantly and I love it. To each their own, I
           | guess.
        
             | tylerscott wrote:
             | I do as well and I also cherry pick a lot specifically with
             | --no-commit to pull together disparate ideas from various
             | sources. I am always fascinated when git usage comes up in
             | threads because there are so many ways people use it that
             | differ from my own and we all seem to find value in it!
        
           | hedora wrote:
           | Merge breaks your history. Most people start where you are,
           | then eventually realize that merge is actually non-
           | understandable, and switch to rebase.
           | 
           | Hint: "git rebase -i HEAD~3" is your friend. So is "git
           | bisect".
        
             | rizzaxc wrote:
             | can you explain? to me SOP is feature branch, work there,
             | commit occasionally, then when it's good review, squash and
             | merge (99% of the times done on remote). the history is
             | clean with the ticket ID attached to the final merge commit
             | (as the feature branch is treated as atomic)
        
             | kingdomforgit wrote:
             | > Most people start where you are
             | 
             | I've used almost every source control system known to
             | humans the past several decades and git for over a decade.
             | 
             | I've heard the git rebase preachers. I tried to get onboard
             | with rebase.
             | 
             | All who read, avoid rebase at all costs at all times,
             | always.
        
               | mixmastamyk wrote:
               | A bit overstated but yes. Merge squash works _every_
               | time.
               | 
               | Rebase in my experience at work led to inexplicable
               | conflicts several times I tried. When that happens the
               | rebase preachers will be nowhere to be found, and you're
               | on your own.
        
               | avgcorrection wrote:
               | > Merge squash works every time.
               | 
               | Which is a particular kind of rebase except the final
               | commit gets cherry-picked to the target branch (instead
               | of rewriting the original branch).
        
               | turtles3 wrote:
               | > Merge squash works every time.
               | 
               | Unless you've already started a follow-up branch before
               | the first gets merged (eg. Waiting for QA, PO review
               | etc.)
               | 
               | Then you at minimum will need to rebase your second
               | branch after the first is merged. Not a disaster but it
               | adds overhead.
        
               | mixmastamyk wrote:
               | Never did that exactly. Think I've either, started a new
               | branch from the waiting one or, started a new branch from
               | the main and then pulled from the older feature branch.
               | Have no recollection of any problems, but it is rare
               | enough to not have tried it recently.
        
               | avgcorrection wrote:
               | Merge can always be used and rebase is a good tool for
               | certain circumstances. And some people argue for using
               | only one over the other.
               | 
               | Your preaching is contentless.
        
         | letmeinhere wrote:
         | should use `git restore` alongside `git switch`, right?
        
         | golergka wrote:
         | Rewriting history with rebase is a destructive operation and I
         | would never advocate for it to juniors. Merges are much more
         | straightforward because they follow the git mental model of
         | acyclical directed graph.
        
           | darekkay wrote:
           | > Rewriting history with rebase is a destructive operation.
           | 
           | It's not, because Git history is immutable [0], you can't
           | change it. But I understand that from the user perspective it
           | appears to change, and the consequences for public history
           | "changes" have to be known to prevent any troubles.
           | 
           | [0] https://darekkay.com/blog/git-rewriting-history/
        
         | metaltyphoon wrote:
         | And git add --p
        
         | devjab wrote:
         | I support it, but I also wonder why other teams seem to spend
         | so much time on git than we do. Our setup is fairly basic, you
         | have a main branch, you can only push things too it by squash
         | merge pull request that are linked to a work item, and you can
         | only do so after whatever you've build has gone through the
         | release pipeline, which among other things involve spinning up
         | an instance of it for POs or whatever to test. When a dev wants
         | to change something, they pick a work item on our "mostly
         | kanban" board, and create a branch from there with a dev/name.
         | Behind the scenes this spins up a build and a deployment to a
         | dev/name deployment slot whenever something is pushed to it.
         | They do their things, other devs do theirs, similarly on
         | dev/othername branches and then when whatever is complete it
         | gets squash merged into the main branch with a direct link to
         | the kanban work item.
         | 
         | You're mostly free to do what you want on your dev/name branch.
         | The only thing you really need to teach "juniors" is that they
         | will hate themselves unless they merge main into their dev
         | branches regularly. But if you're heading home and want to
         | commit something, or you simply commit as often as you click
         | cmd+s, you can do it with no useful comment because it'll get
         | squashed anyway. Most people where I work use GitKraken, mostly
         | out of habit, but I think more and more are switching to VSC
         | extensions and some might even use the cli.
         | 
         | The result is that we spend almost 0 time on "git" in our
         | organisation. I wonder if we do things wrong somehow since git
         | seems to cause issues for so many people.
        
           | mixmastamyk wrote:
           | Same, devs overthink it.
           | 
           | Others obsess over history, but personally didn't find it
           | worth the effort. We look back maybe twice a year, typically
           | fixing issues moving forward.
        
             | devjab wrote:
             | I guess it does depend on the size of your commits. Ours
             | being relatively small (one work item) we still have the
             | history, while devs getting the freedom to not have to make
             | every commit meaningful.
        
         | ozim wrote:
         | For me most people should not cherry pick-revert-merge-rebase.
         | 
         | They should create branch of development/trunk do commits with
         | their work and create PR. Then PR merge in GitHub interface or
         | something.
         | 
         | 98% done other 2% get some git specialists.
        
       | [deleted]
        
       | harha_ wrote:
       | There is nothing wrong with Git.
        
         | totallywrong wrote:
         | There's plenty wrong with git from a usability standpoint.
         | We've all grokked it over time but it's far from having a good
         | UX.
        
           | harha_ wrote:
           | I've used git for the last 7 years and I've had no problems
           | with it. If a developer is not willing to invest their time
           | into learning simple basic git commands and concepts then I
           | think they're in the wrong business.
        
             | ptx wrote:
             | Have you tried Mercurial? The Git user interface is a mess
             | in comparison, since it evolved from a collection of
             | loosely related scripts rather than being cohesively
             | designed. Git does the same things and works fine once you
             | learn it, but there's a lot of unnecessary inconsistencies
             | to learn.
        
             | waboremo wrote:
             | I'm sorry but someone who is unable to determine problems
             | with a tool they've used for 7 years is a huge red flag.
             | That sort of blindness to frustrations is legitimately a
             | massive problem in this field.
        
       | gregmac wrote:
       | Is this more than a different client interface to git?
       | 
       | "fuse" looks like rebase.
       | 
       | "switch" with automatic stash is handy (is there more to it?).
       | It's a feature that several popular GUI clients have had for
       | years.
        
       | lozenge wrote:
       | This is cool because Git is almost too popular, there are too
       | many poorly written tutorials, and I have seen so many people get
       | in trouble and Stack Overflow just gives them more commands that
       | get them into an even stickier situation. Yeah, if you learn all
       | its ins and outs then you will understand it, but that shouldn't
       | be needed for a tool which is now so widely used.
       | 
       | Git has improved a lot like erroring out if you try certain
       | operations with unsaved changes, but even this has issues e.g. if
       | you have a file which is untracked in one branch and committed or
       | gitignored in another.
        
       | wseqyrku wrote:
       | Unfortunately, copilot for cli will make git easy.
        
       | sesuximo wrote:
       | Is git really so bad if you spend ~1 hour trying to understand it
       | and have access to stack overflow?
        
         | fulafel wrote:
         | Yes.
        
         | visarga wrote:
         | Today we can also ask GPT-4 for targeted advice
        
       ___________________________________________________________________
       (page generated 2023-06-17 23:00 UTC)