You might prefer working with rebases + fast-forward-only merges, if you want merge commits to be squashed…
(As in, there won’t be any merge commits. Your PR will look as if you forked, then coded real fast, and then opened the PR before anyone else pushed anything.)
Ah yes, the vegetables and sports git merging strategies. I personally prefer rebase myself, but that’s okay.
Would that be stealing in baseball??
As long as it merges it’s fiiiine!
Nobody’s gonna notice
Can you get squash (juice concentrate) in the US? I took a shine to it in the UK, but all I can think that we have here is the frozen concentrate and maybe like some lemonade concentrate in a carton.
You forgot read-only filesystems
But all intersections are squash.
Pickleball?
And I guess there’s cherry-pick, but that’s considered a fruit.
I think the other intersections should exclude the non-overlapping circle.
+Veggie +Git -Sport: Prune
+Veggie -Git +Sport: Pickle
-Veggie +Git +Sport: I dunno… Does fetch count?
I dunno, I love eating a nice fresh-grown water polo
If you were gonna replace something you should’ve replaced “vegetables” because squash is a fruit.
The term “vegetable” is a culinary term, and squash is prepared like a vegetable. For another example, tomatoes are fruits but are prepared like vegetables. Squash and tomatoes can be both fruits AND vegetables. This is my position on the “is X a fruit or vegetable?” issue.
I mean, the idea of a “vegetable” isn’t a well defined group of plant parts like fruits are. Vegetables are a mix of seeds, roots, leaves, stems, etc. all of which are quite different. It’s just “parts of a plant that can be cooked as part of a meal”:
“a usually herbaceous plant (such as the cabbage, bean, or potato) grown for an edible part that is usually eaten as part of a meal also : such an edible part” according to the Merriam-Webster dictionary https://www.merriam-webster.com/dictionary/vegetable (similar definitions exist for other dictionaries, some highlight that vegetables are usually used to make non-sweet dishes)
The TLDR is that vegetables are loosely defined as “plant parts that are used to prepare meals, usually non-sweet dishes” and is a culinary term rather than a botanical one like fruits can be. So an item (like tomatoes or squash) can be both a vegetable and a fruit, the former culinary and the latter botanically. They aren’t mutually exclusive.
Depends on which classification system you use. Botaically it is a fruit. But culinarily it is a vegetable.

Replicating git history for a file takes 1 merge commit and 3 commits, and this is propably one of the most complex workflows I have encountered:
(might not be correct...) git checkout -b work git mv file file.tmp git commit git checkout -b copy HEAD^ git mv file file2 git commit git checkout work # can be skipped if you merge "work" instead. git merge copy # "work" and "copy" must conflict, stage file.tmp and file2 and commit the result. git mv file.tmp file git commit <git blame is identical for file and file2>I would love to squash this into a single commit, but git doesn’t have a copy operation or detection. :(
Huh. I have never in my 19 year career using git, ever wanted to copy a file and pretend all of the history of that file is also the history of the new file. I mean, I don’t think I’ve ever even wanted to copy a file? Why are you copying a file?
Like, maybe I’m just too familiar with git to see the forest for the trees, but what the heck are you doing over there? 😅
And just in case it’s useful, a tip is that you can use
git blame -Cto have the blame algorithm use a heuristic to try and find a “source” line if it was moved, including from another file, during a commit, and then continue following the history of that line, to try and get the real commit where this was written, not just the last time it was moved around.Why are you copying a file?
I’m splitting a several thousand LOC file, which I don’t have previous history in.
Like, maybe I’m just too familiar with git to see the forest for the trees, but what the heck are you doing over there?
Normally copying a file and committing transfers the authorship to you, because the copy just appears from nothing as a brand new file, never known to git. This would prevent browsing the per-line “who changed this last” history past the copy and obfuscate who wrote what and when.
(why the downvote?)
Interesting. Yeah, sounds like what
git blame -Cis for, so I’ve never made copies when splitting files, I’ve just moved lines between files naively. But I guess if one’s tools are limited and doesn’t have the ability to-C, then I guess I could respect the hack that is that solution?I mean, I’m 99% sure git doesn’t store blame or authorship info in the pack files, even as a convenience cache, and just guesses by traversing the patch log with heuristics live when you run blame anyway, so the history mostly doesn’t matter there, but the way you’ve done it does seem to have tricked the heuristics into doing what you want without relying on an option, so that’s neat! It’s an interesting hack, and I like interesting hacks 😛
By the way, if there are down votes, they’re not from me!
I’m not a copyright-lawyer, but I think there are implications on who has authored the code, so preserving this detail can be important. The fancy copy reduced my blame by +90% on the final result.
git blame output can be affected by e.g. ignoring white-space changes.
Right, but what I’m saying is that git doesn’t store authorship information or line-by-line history, no matter how it’s done. Figuring out which line came from where is an algorithm the git blame command does every time you request it, and that algorithm can give different results depending on which options you give the blame command. And so what you’ve found here is a collection of commits that produces a situation the default blame algorithm can follow, without any optional flags, which is neat! Maybe not great for git history, but neat!
I can come up with some contrived examples. Maybe someone screwed up the history and they’re trying to repair it such that no one needs to worry about a rebase on their next pull? “compliance”/legal/cya reasons? I also wish to know!
You seem to be making this very complex. But it really isn’t. Yes, git doesn’t track renames. So you are working around it by splitting your operation into 2 commits.
- A pure rename.
- A file change.
This way 1 is always considered a rename and 2 is just a regular file change with the same path. You may also consider tweaking the default rename detection threshold with flags like
--find-renamesor options likediff.renameLimit.Would it be nice if Git tracked renames? Probably. But that isn’t how the data model works so it is unlikely to happen soon. But maybe they could add some metadata.








