[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)
 
web link (gitless.com)
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)