Git Recipes
2025-05-29, Thu
Everybody seems to to have their own Git recipes. This post is yet another one that record solution to common problems I have encountered while using Git.
1. Git on Windows
The reason why I even bother Windows is because my current employer demands it, along with following problems when neither WSL nor Cygwin is available.
First, to store credential so that we don't need to input username and
password every time git pull
is called1:
git config --global credential.helper store
Second, in order to accommodate long file paths, we need to adjust the
value of core.longpaths
as well2:
git config --system core.longpaths true
Then comes this file mode problem I have encountered the other day:
some files with permission of 755 have been changed to 644, which
results into git status
reporting them without actual content
difference. To ignore mere permission udpate, run3:
git config core.fileMode false
Another common warning that shows up is this "LF will be replaced by
CRLF"
message, which could be dealt with4 through:
git config core.autocrlf true
2. Large File Storage
Git LFS5 introduces .gitattribute
and stores files that
are not text into dedicated large file storage, such as JAR
, ZIP
,
PDF
, PNG
, MP4
files, etc. The problem is when we download source
from remote repository as ZIP
file (instead of git clone
the whole
repository), those files are all empty. In this case, use git lfs
to
manually retrieve the actual files' content6:
git lfs fetch --all git lfs checkout
Other recipes will be added when new problems are encountered.
3. Rewrite Branch History
When the time comes to re-write the commit history of a branch, it's often caused by the necessity to select, correct or remove some commit. In either case, the steps typically boil down to
- Create a new base branch, i.e.
git branch base-branch-name <commit-hash>
, and - Rebase current branch to this new base, i.e.
git rebase <base-branch-name>
A typical example looks like this7, 8:
git checkout branch-that-needs-clean-up git branch base-to-start-anew HEAD^5 git rebase --interactive base-to-start-anew # followed by the detailed instructions on how to handle each commit