We all have been there… For the beginner it’s easy to mess things up. What are your horror stories with Git?
Those first couple months learning git… yeah, it is weird, but once it clicks… you’ll be surprised how truly simple it is.
The programming world would be awful without it
Learning git was like every other cool tech thing for me (including the fediverse). People explain it in such a convoluted way. It’s like they think you want to understand the deep theory of it before you get up and running!
Yes, git is more than just a “save box”, but really, new users should absolutely just think about it as a save box. Learn the fancy shit later.
Honestly this is me. At this point I really should know better but I dont, and every tuorial seems to be speaking a whole new language. Any tips for where to learn this?
Joined on a project and the unsupervised junior devs had branches for each developer, even if they were working on the same features. They were copying and pasting each others code into their personal branches to stay up to date.
Spaghetti commits took a while to unwind.
-
On a college project, a friend was working on some changes on a branch which I proceeded to merge into my working branch. Visual Studio asked to stash, I said yes, his changes replaced mine, I panicked, raged, then redid the whole thing because I had no idea what a f***ing stash is.
-
On our final project, my friend and I had separate branches we were working on and since we both thought git was magic, we figured we’d just merge our changes the day we were supposed to submit. So naturally we had a merge conflict on a single file that he had since been restored (by re-commiting the old version, not git restore) which meant we had to spend that morning frantically recommitting? rebasing? (still not sure) the next 92 commits (I just checked the repo) and hoping we didn’t break anything in the process.
-
There was that time at my job when I accidentally pushed some stuff I REALLY shouldn’t have only to realize I had no force push permissions on a gitlab repo I created because it was under a group owned by the org. That one was there for months before I finally asked someone with the permissions to sort out (and they didn’t forget to do it).
-
As an old programmer who has used git since Linus whipped it up over one frenzied weekend after his spat with the evil BitKeeper and who has studied its mysteries since before most of you were born … yeah just delete the damn project and download a new version.
Whelp, that’s all the permission I need
I’ve often ended up guessing what things do and messing things up.
One example is when I couldn’t remember the difference between
git checkout -b
andgit checkout -B
, so in my infinite wisdom I decided to use-B
because surely capital letters are better! Tried using it to switch back to a branch, and… Yeah, that was annoying.I would say capital letters tend to be more destructive. So I would not blindly useful them without knowing what they do first.
the f (and r) in rm -rf: am I a joke to you
What I said was not absolute nor complete. It only includes one set of things to be careful with. The
f
flag is another that you should be wary of using without understanding what it does.Lessons from this thread:
- be wary of all letters
- numbers also somewhat sus
If I’m gonna merge some shit that’ll probably have a bunch of conflicts, I’ll create a throwaway “test-merge” branch because I’ll inevitably fuck up the merge and even though I’ve used git for years I have no idea how to revert a merge andatthispointimafraidtoask.jpg
Not really a horror story because I fixed it with reflog, but it was a bit of a shock when we all suddenly couldn’t push to the dev branch. Turns out one of the devs, who insists Git is just like SVN, decided to delete dev and push, and ignore the warnings. Apparently that’s OK in SVN.
The first place I worked, when I joined they were using git for their developers. That is - a bare git repo on a server that everyone has a key on so they can pull over ssh. No web UI at all.
The product was originally evolved from a 3rd party code base that was a all in one thing - backend and frontend together in the repo. But the company wanted their own UI so they created a new git repo for it to keep it isolated and decoupled. You know, so development and deployments were easier. But when I joined the two code bases were so intertwined the UI would not work if you did not have the backend checked out into the same location as the UI. No submodules, no dependencies coded anywhere - you just had to checkout both repos side by side to get it to work.
There was also this critical bit of software we had - developed by one guy in C (a language no one else really know). Now this was not a very complex application, but every billable event that we had went through it - so critical for us to be able to do anything. Its development process was, the guy would login to one of the production servers, change the code, rebuilt it and test it live on that server. Then when he was happy he would get a sysadmin to copy the code and rebuild it to all other nodes (this could be to over 2500 servers mind you). Ok, so this one was more horrifying due to the lack of any version control at all - though at least the code was backed up to a lot of servers…
Eventually I was tasked with getting that codebase in git and making it so we could rebuild it outside of production. This was a nightmare - had to learn how autotools worked in far more detail then I ever wanted only to find out the original developer had manually hand crafted some auto generated files.
Years later (after the company had good git practices and we had fixed all the issues above), this developer was working on a new project. Once I found out about it I took a look. He was using git this time. But the development process was, ssh to a prod server, edit the code live. Then wait for a cron job to run that dumped a bunch of store procedures from the database to the project, add all files, commit and push the code. I honestly don’t know how anyone could get a standard workflow completely backwards…
On a nicer note, I have one about this one time git actually saved me weeks of work by accident. In uni I was working on some coursework - this was back when I was learning git and still trying to figure-out how best to use it. I was not using it correctly yet - for one I was not pushing code up to a remote yet, just working locally on my system. Well, one day I was doing some development and needed to clear out my build directory as I was seeing some weird behaviour. I switched over to the terminal that I keep inside that build dir and do a
rm -rf *
. Something I had done many times before to clear it out. But this time, I was in the wrong location, I was in the project root. And that was it, all my code was gone, weeks worth of work down the drain.But then I noticed a .git folder still there. Turns out
*
does not expand hidden files. So agit checkout .
and I managed to restore all files from my last commit - which was only a couple of hours ago. I don’t think I had ever been so relieved before. I quickly pushed up that code to a remote repo.Alright, currently dealing with a CRLF issue from hell. The .gitattributes file says bat files should have CRLF endings but some template we use with backstage and cookiecutter makes the gradlew.bat file end up with CRLF line endings in the repository. Quick aside, whenever git is handling line ending conversions it sotres LF line endings inside the blobs then makes them CRLF on checkout. In the template repository everything is correct. But for some reason when you run the template the batch file has CRLF line endings in the repository.
Why does this matter? Because you’ll have a totally fresh untouched repo and git will report a change in a file. You’llook at the doff and not see what is going on. Because you made no change. But git is trying to fix the problem of CRLF being in the repo when the attributes file says it needs to control the line endings.
You have to use the git cat-file command to see what is in the blob.
Yesterday I thought I narrowed it down to the Node project isomorphic-git but it actually seems to handle it correctly but I’m still suspicious.
Any advice is appreciated lol
I’ve had a similar issue before and the problem was that I had made the repo on linux, worked on it a bunch, copied it over to a different PC running windows, then copied it back. Found this on stackoverflow and it fixed it for me, but I’ve only tested it on linux (probably won’t work on windows because grep). Hopefully it helps:
git diff -p -R --no-ext-diff --no-color | grep -E \"^(diff|(old|new) mode)\" --color=never | git apply
That’s the weird thing, everyone here uses Mac and the server running the template is Linux so this isn’t a case of a Windows user forgetting to set autocrlf and even then it is in the git attributes file.
Apparently git let’s you push two completely independent histories into one repo if you force push and will happily let you go about your business until you try to merge.
I found this out when an intern copied the code, initiated a new repo, worked off that repo, force pushed into remote, kept working on his branches. Absolutely not his fault, he should have had help. But I had to edit history and rewrite the parent of a commit to unite the family lines!
Fun to learn that you can create that problem and also there’s a “way” to fix it.
I believe I remember reading that in the official git repository a totally orphaned branch got merged. So if it can accidentally happen to the official team then I totally buy this.