[user] name = laily email = i@laily.net [core] autocrlf = input quotepath = false editor = vim excludesfile = ~/.dotfile/git/.gitignore [init] defaultBranch = main [tag] sort = version:refname [column] ui = auto [color] status = auto diff = auto branch = auto interactive = auto grep = auto ui = auto [push] #default = current default = simple autoSetupRemote = true followTags = true [fetch] prune = true pruneTags = true all = true [pull] rebase = false [diff] algorithm = histogram colorMoved = plain mnemonicPrefix = true renames = true [difftool "nvimdiff"] cmd = nvim -d \"$LOCAL\" \"$REMOTE\" [merge] tool = nvimdiff [mergetool "nvimdiff"] cmd = nvim -d \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\" trustExitCode = true [includeIf "gitdir:~/workrepo/"] path = ~/.workgitconfig [rebase] autoSquash = true autoStash = true updateRefs = true [commit] verbose = true [rerere] enabled = true autoupdate = true [help] autocorrect = prompt [branch] autoSetupMerge = always sort = -committerdate [alias] au = add -u co = checkout cm = "!f() { if [[ -z \"$1\" ]]; then git commit; else git commit -m \"$*\"; fi; }; f" st = status ap = add -p br = branch ba = branch -a bm = branch --merged bn = branch --no-merged pu = "!git pull origin $(git rev-parse --abbrev-ref HEAD)" pt = push origin --tags ph = push origin HEAD merge2 = !sh -c '_CURRENT_BRANCH=$(git symbolic-ref --short HEAD) && git checkout $1 && git merge $_CURRENT_BRANCH && git checkout $_CURRENT_BRANCH' - bg = "!f() { git branch | grep $1; }; f" delbr = "!f(){ git branch -D $(git branch | grep \"\b$1\"); };f" can = commit --amend --no-edit cleanbr = "!git branch --merged master | grep -v '\\*\\|master\\|main' | xargs -n 1 git branch -d" # list files which have changed since REVIEW_BASE # (REVIEW_BASE defaults to 'master' in my zshrc) files = !git diff --name-only $(git merge-base HEAD \"$REVIEW_BASE\") rmsubmodule = "!f(){ git submodule deinit -f \"$1\"; git rm -f \"$1\"; git commit -m \"Removed submodule $1\"; };f" # Same as above, but with a diff stat instead of just names # (better for interactive use) stat = !git diff --stat $(git merge-base HEAD \"$REVIEW_BASE\") # Open all files changed since REVIEW_BASE in Vim tabs # Then, run fugitive's :Gdiff in each tab, and finally # tell vim-gitgutter to show +/- for changes since REVIEW_BASE review = !vim -p $(git files) +\"tabdo Gdiffsplit $REVIEW_BASE\" +\"let g:gitgutter_diff_base = '$REVIEW_BASE'\" # Same as the above, except specify names of files as arguments, # instead of opening all files: # git reviewone foo.js bar.js reviewone = !vim -p +\"tabdo Gdiff $REVIEW_BASE\" +\"let g:gitgutter_diff_base = '$REVIEW_BASE'\" #git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Laily'; GIT_AUTHOR_EMAIL='i@laily.net'; GIT_COMMITTER_NAME='Laily'; GIT_COMMITTER_EMAIL='i@laily.net';" HEAD # worktree # git wt add <路径> <分支名> # git wt add -b <新分支名> <路径> [基分支名] wt="worktree" #wta="worktree add" #wtb="worktree add -b" wtr="worktree remove" wtl="worktree list" wtp="worktree prune" # 基于分支创建新分支+worktree # git wtb <分支名> [<基分支名|当前分支>] wtb = "!f(){ local base_branch=${2:-HEAD}; local clean_name=$(echo \"$1\" | sed \"s/\\//_/g\"); git worktree add -b \"$1\" \"../$clean_name\" $base_branch; }; f" # 基于指定分支+worktree # git wta <分支名> wta = "!f(){ local base_branch=${1:-HEAD}; local clean_name=$(echo \"$1\" | sed \"s/\\//_/g\"); git worktree add \"../$clean_name\" $base_branch; }; f" [protocol "file"] allow = always # https://hyperzsb.io/posts/git-ssl-error/ [filter "lfs"] process = git-lfs filter-process required = true clean = git-lfs clean -- %f smudge = git-lfs smudge -- %f [http] sslVerify = false