Git is by far the most popular software version control system today, and every software developer surely knows the basics of how to make a git commit. Given the popularity, it is surprising how many people don’t actually know the advanced commands. Mastering them might help you unlock a new level o...
As aliases
alias g-log="git log --graph --format='format:%C(yellow)%h%C(reset) %s %C(magenta)%cr%C(reset)%C(auto)%d%C(reset)'"
alias g-history='gitk --all &'
alias g-checkout='git checkout $(git branch --sort=-committerdate --no-merged | fzf)'
alias g-commit='git citool &'
alias g-amend='git citool --amend &'
alias g-rebase='git rebase --interactive --autosquash'
alias g-pull='git pull --verbose --rebase'
alias g-pushf='git push --verbose --force-with-lease'
alias g-status='git status --ignored'
alias g-clean='git clean -fdx && git reset --hard && git submodule foreach --recursive git clean -fdx && git submodule foreach --recursive git reset --hard'
I think they are pretty funny. They don't matter, it's just a nice little colorful image that has to be there. There is no information transported or displayed incorrectly, because there is none 😄
What annoys me the most is that AI image generators make it so easy to make images and yet despite that they're still too lazy to spend 2 seconds to look at the image and check if it's crap or not. It would literally take them only a couple of minutes to tweak the prompt and regenerate some more images.
Agreed. I also see them all over youtube videos and stuff and I just can't keep reading/watching. Its not like an ideological thing, i don't hate generated art. I just find it so distracting.
If you need anything more complex than cherrypick, you already screwed up big time.
I think this is a clueless comment. You can use Git to greatly improve your development workflow if you dare going beyond the naive pull/commit/push workflow.
Take for example interactive rebase. It let's you do very powerful stuff such as changing the order of commits in a local branch and merge/squash contiguous commits. This unlocks workflows such as peeling off bugfix and cleanup commits from your local feature branch without having to switch branches. I'm talking about doing something like:
a) - you're working on your task,
b) - you notice a bug that needs fixing,
c) - you fix the bug and commit your fix,
e) - you continue to work on your task,
f) - you notice a typo in your bugfix code, so you post a fixup commit.
g) - you post a few commits to finish your task,
h) - you noticed your bugfix commit didn't had the right formatting, so you post a couple of commits to lint your code both in your bugfix commits and task.
When you feel you're done, you use interactive rebase to put everything together.
a) you reorder your commits to move your bugfix commit to the top of your local branch, followed by the typo fixup commit and the linter commit.
b) you mark both the typo and linter commits as fixup commits to merge them with the bugfix one,
c) you post a PR with the single bugfix commit,
d) you finally post a PR for your task.
Notice that thanks go git interactive rebase you did not had to break out of your workflow or do any sort of context switch to push multiple PRs. You just worked on things you had to work, and in the end you just reorganize the commit history in your local branch to push your work.
Yes, why are you wasting time with all that. No one uses the commit history to the level that any of that matters. If it does, you ci flow is the problem.
I disagree wholeheartedly with this. I consider the commit history as documentation for pull requests and for future history, and as such I make liberal use of interactive rebasing to curate my commits.
Rebasing in general is one of those things that I picked up fairly late, but now it's essential to my git workflow.
What's ironic is that rebases aren't as hard as many consider it to be. Once you've done it a couple of times, you just do it everyday as easily as you commit changes.
If you're doing more complex stuff all the time then yes that's an indication of a problem, but despite your best efforts, complex situations or screw ups do happen and it's good to know how to fix them, especially if you're a senior dev that needs to help the rest of the team and resolve conflicts between feature branches. The whole team can't be perfect all the time.
Also most of the tips in the article aren't even about branch management and more about optimizations for huge projects or introspection into the history of large projects.
I'm gonna be completely honest. I don't truly get all the inner working of git. I'm a senior DevOps Engineer and been using git for a decade, but is git is simular to sed or awk for me. I know how to do what I want really well but when shit goes wrong, I'm flying by the seat of my pants.
A lot of times, I just know what to do to fix things because it's rote memory with substitutions. But if you needed me to explain upstreams and rebases in actual detail, I'd be in trouble. But it rarely becomes an actual problem to the level where I'll dedicate time to learning all the advanced stuff.
That said, I've learnt that most senior people also just pretend they get it all but instead are just relying on rote memorization and basic concepts. Anyone else here in the same camp of being a fraud with git?
The fact that you have to kind of understand how git works under the hood to really unlock its full potential is a definite design flaw of the tool, but given its ubiquitous use in our industry, I encourage you to check out how git works under the hood. Once you learn the underlying concepts, you reach a whole new level of proficiency with git, no longer having to just get by, and instead you get to thrive.
I had the same feeling until I started using gitk. I always have a gitk window open and press F5 to reload, so it shows me the state of everything after I've run git commands. Now I grasp everything much better.
this article suggests shell allowed, but git also has a built-in feature for aliases itself. I prefer these as it allows you to keep using the git command normally (more consistent when you tend to use history search/auto-suggestions heavily).
running git config --global alias.st status, for example, will allow you to run git st as an alias for typing out the full git status (you can also manually add aliases to your ~/.gitconfig).
You need bisect only as a last resort. Effective use of git blame, git log -p -S etc has always been enough for me. Also, the projects I work with take 10+ minutes to compile even when cached, so doing tens of builds to bisect is much slower than just hunting for strings in git commits and code.