-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgit.fish
454 lines (408 loc) · 14.7 KB
/
git.fish
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
# Git version checking
set -g git_version (git version 2>/dev/null | string split " ")[3]
#
# Functions Current
# (sorted alphabetically by function name)
# (order should follow README)
#
# The name of the current branch
# Back-compatibility wrapper for when this function was defined here in
# the plugin, before being pulled in to core lib/git.zsh as git_current_branch()
# to fix the core -> git plugin dependency.
function current_branch
git_current_branch
end
# Check for develop and similarly named branches
function git_develop_branch
command git rev-parse --git-dir > /dev/null; and return
set -l branch
for branch in dev devel develop development
if command git show-ref -q --verify refs/heads/$branch
echo $branch
return 0
end
end
echo develop
return 1
end
# Check if main exists and use instead of master
function git_main_branch
command git rev-parse --git-dir > /dev/null; and return
set -l ref
for ref in refs/(heads remotes/{origin upstream})/(main trunk mainline default master)
if command git show-ref -q --verify $ref
echo (basename $ref)
return 0
end
end
# If no main branch was found, fall back to master but return error
echo master
return 1
end
function grename
if test -z "$argv[1]" -o -z "$argv[2]"
echo "Usage: $argv[0] old_branch new_branch"
return 1
end
# Rename branch locally
git branch -m "$argv[1]" "$argv[2]"
# Rename branch in origin remote
if git push origin :"$argv[1]"
git push --set-upstream origin "$argv[2]"
end
end
#
# Functions Work in Progress (WIP)
# (sorted alphabetically by function name)
# (order should follow README)
#
# Similar to `gunwip` but recursive "Unwips" all recent `--wip--` commits not just the last one
function gunwipall
set _commit (git log --grep='--wip--' --invert-grep --max-count=1 --format=format:%H)
# Check if a commit without "--wip--" was found and it's not the same as HEAD
if test "$_commit" != (git rev-parse HEAD)
git reset $_commit; or return 1
end
end
# Warn if the current branch is a WIP
function work_in_progress
command git -c log.showSignature=false log -n 1 ^/dev/null | grep -q -- "--wip--"; and echo "WIP!!"
end
# Aliases
alias grt='cd (git rev-parse --show-toplevel ^/dev/null || echo .)'
function ggpnp
if test (count $argv) = 0
ggl; and ggp
else
ggl $argv; and ggp $argv
end
end
complete -c ggpnp -f -a 'git-checkout'
alias ggpur='ggu'
alias g='git'
alias ga='git add'
alias gaa='git add --all'
alias gapa='git add --patch'
alias gau='git add --update'
alias gav='git add --verbose'
alias gwip='git add -A; git rm (git ls-files --deleted) ^/dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]"'
alias gam='git am'
alias gama='git am --abort'
alias gamc='git am --continue'
alias gamscp='git am --show-current-patch'
alias gams='git am --skip'
alias gap='git apply'
alias gapt='git apply --3way'
alias gbs='git bisect'
alias gbsb='git bisect bad'
alias gbsg='git bisect good'
alias gbsn='git bisect new'
alias gbso='git bisect old'
alias gbsr='git bisect reset'
alias gbss='git bisect start'
alias gbl='git blame -w'
alias gb='git branch'
alias gba='git branch --all'
alias gbd='git branch --delete'
alias gbD='git branch --delete --force'
function gbda
set -l main_branch (git symbolic-ref --short HEAD)
set -l develop_branch "develop" # Assuming "develop" is your develop branch name
git branch --no-color --merged | grep -vE '^([+*]|\s*($main_branch|$develop_branch)\s*$)' | xargs -I {} git branch -d {} ^/dev/null
end
# Copied and modified from James Roeder (jmaroeder) under MIT License
# https://github.com/jmaroeder/plugin-git/blob/216723ef4f9e8dde399661c39c80bdf73f4076c4/functions/gbda.fish
function gbds
set default_branch (git_main_branch)
if test $status -ne 0
set default_branch (git_develop_branch)
end
git for-each-ref refs/heads/ "--format=%(refname:short)" | \
while read -l branch
set merge_base (git merge-base $default_branch $branch)
if test (git cherry $default_branch (git commit-tree (git rev-parse $branch\^{tree}) -p $merge_base -m _)) = -*
git branch -D $branch
end
end
end
alias gbgd='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d'
alias gbgD='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D'
alias gbm='git branch --move'
alias gbnm='git branch --no-merged'
alias gbr='git branch --remote'
alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)'
alias gbg='LANG=C git branch -vv | grep ": gone\]"'
alias gco='git checkout'
alias gcor='git checkout --recurse-submodules'
alias gcb='git checkout -b'
alias gcd='git checkout $(git_develop_branch)'
alias gcm='git checkout $(git_main_branch)'
alias gcp='git cherry-pick'
alias gcpa='git cherry-pick --abort'
alias gcpc='git cherry-pick --continue'
alias gclean='git clean --interactive -d'
alias gcl='git clone --recurse-submodules'
function gccd
set -l repo
set -l opts (commandline -p)
for opt in $opts
switch $opt
case --recurse-submodules
set repo $argv[1..-2]
case -*
# Skip options
case *
set repo $argv[1..-1]
end
end
set -l clone_result (git clone --recurse-submodules $repo)
if test $status -ne 0
return $status
end
if test -d $_
cd $_
else
set repo (string split .git $_)
set repo (basename $repo[1])
cd $repo
end
end
complete -c gccd -f -n '__fish_use_subcommand' -a 'git-clone'
alias gcam='git commit --all --message'
alias gcas='git commit --all --signoff'
alias gcasm='git commit --all --signoff --message'
alias gcs='git commit --gpg-sign'
alias gcss='git commit --gpg-sign --signoff'
alias gcssm='git commit --gpg-sign --signoff --message'
alias gcmsg='git commit --message'
alias gcsm='git commit --signoff --message'
alias gc='git commit --verbose'
alias gca='git commit --verbose --all'
alias gca!='git commit --verbose --all --amend'
alias gcan!='git commit --verbose --all --no-edit --amend'
alias gcans!='git commit --verbose --all --signoff --no-edit --amend'
alias gc!='git commit --verbose --amend'
alias gcn!='git commit --verbose --no-edit --amend'
alias gcf='git config --list'
alias gdct='git describe --tags $(git rev-list --tags --max-count=1)'
alias gd='git diff'
alias gdca='git diff --cached'
alias gdcw='git diff --cached --word-diff'
alias gds='git diff --staged'
alias gdw='git diff --word-diff'
function is-at-least -a expected_version
# If no actual version is provided, default to the current Fish version
if test -z "$argv[2]"
set actual_version $FISH_VERSION
else
set actual_version $argv[2]
end
# Compare versions using sort -CV
begin
echo $expected_version
echo $actual_version
end | sort --check=silent --version-sort
# Return the status of the sort command
return $status
end
function gdv
git diff -w $argv | view -
end
complete -c gdv -f -n '__fish_use_subcommand' -a 'git-diff'
alias gdup='git diff @{upstream}'
function gdnolock
git diff $argv ":(exclude)package-lock.json" ":(exclude)*.lock"
end
complete -c gdnolock -f -n '__fish_use_subcommand' -a 'git-diff'
alias gdt='git diff-tree --no-commit-id --name-only -r'
alias gf='git fetch'
# --jobs=<n> was added in git 2.8
is-at-least 2.8 "$git_version" \
&& alias gfa='git fetch --all --prune --jobs=10' \
|| alias gfa='git fetch --all --prune'
alias gfo='git fetch origin'
alias gg='git gui citool'
alias gga='git gui citool --amend'
alias ghh='git help'
alias glgg='git log --graph'
alias glgga='git log --graph --decorate --all'
alias glgm='git log --graph --max-count=10'
alias glods='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset" --date=short'
alias glod='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset"'
alias glola='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --all'
alias glols='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --stat'
alias glol='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset"'
alias glo='git log --oneline --decorate'
alias glog='git log --oneline --decorate --graph'
alias gloga='git log --oneline --decorate --graph --all'
# Pretty log messages
function _git_log_prettily
if test -n "$argv[1]"
git log --pretty=$argv[1]
end
end
# compdef _git _git_log_prettily=git-log
alias glp='_git_log_prettily'
alias glg='git log --stat'
alias glgp='git log --stat --patch'
alias gignored='git ls-files -v | grep "^[[:lower:]]"'
alias gfg='git ls-files | grep'
alias gm='git merge'
alias gma='git merge --abort'
alias gms="git merge --squash"
alias gmom='git merge origin/$(git_main_branch)'
alias gmum='git merge upstream/$(git_main_branch)'
alias gmtl='git mergetool --no-prompt'
alias gmtlvim='git mergetool --no-prompt --tool=vimdiff'
alias gl='git pull'
alias gpr='git pull --rebase'
alias gprv='git pull --rebase -v'
alias gpra='git pull --rebase --autostash'
alias gprav='git pull --rebase --autostash -v'
function ggu
if test (count $argv) != 1
set b (git_current_branch)
end
git pull --rebase origin (set -q b $argv[1]; and echo $b)
end
complete -c ggu -f -n '__fish_use_subcommand' -a 'git-checkout'
alias gprom='git pull --rebase origin $(git_main_branch)'
alias gpromi='git pull --rebase=interactive origin $(git_main_branch)'
alias ggpull='git pull origin "$(git_current_branch)"'
function ggl
if test (count $argv) -ne 0 -a (count $argv) -ne 1
git pull origin $argv
else
if test (count $argv) -eq 0
set b (git_current_branch)
end
git pull origin (set -q b $argv[1]; and echo $b)
end
end
complete -c ggl -f -n '__fish_use_subcommand' -a 'git-checkout'
alias gluc='git pull upstream (git_current_branch)'
alias glum='git pull upstream (git_main_branch)'
alias gp='git push'
alias gpd='git push --dry-run'
function ggf
if test (count $argv) -ne 1
set b (git_current_branch)
end
git push --force origin (set -q b $argv[1]; and echo $b)
end
complete -c ggf -f -n '__fish_use_subcommand' -a 'git-checkout'
is-at-least 2.30 (command git --version | awk '{print $3}') \
&& alias gpf 'git push --force-with-lease --force-if-includes' \
|| alias gpf 'git push --force-with-lease'
function ggfl
if test (count $argv) -ne 1
set b (git_current_branch)
end
git push --force-with-lease origin (set -q b $argv[1]; and echo $b)
end
complete -c ggfl -f -n '__fish_use_subcommand' -a 'git-checkout'
alias gpsup 'git push --set-upstream origin (git_current_branch)'
is-at-least 2.30 (command git --version | awk '{print $3}') \
&& alias gpsupf 'git push --set-upstream origin (git_current_branch) --force-with-lease --force-if-includes' \
|| alias gpsupf 'git push --set-upstream origin (git_current_branch) --force-with-lease'
alias gpv='git push --verbose'
alias gpoat='git push origin --all && git push origin --tags'
alias gpod='git push origin --delete'
alias ggpush 'git push origin "(git_current_branch)"'
function ggp
if test (count $argv) -ne 0 -a (count $argv) -ne 1
git push origin $argv
else
if test (count $argv) -eq 0
set b (git_current_branch)
end
git push origin (set -q b $argv[1]; and echo $b)
end
end
complete -c ggp -f -n '__fish_use_subcommand' -a 'git-checkout'
alias gpu='git push upstream'
alias grb='git rebase'
alias grba='git rebase --abort'
alias grbc='git rebase --continue'
alias grbi='git rebase --interactive'
alias grbo='git rebase --onto'
alias grbs='git rebase --skip'
alias grbd 'git rebase (git_develop_branch)'
alias grbm 'git rebase (git_main_branch)'
alias grbom 'git rebase origin/(git_main_branch)'
alias gr='git remote'
alias grv='git remote --verbose'
alias gra='git remote add'
alias grrm='git remote remove'
alias grmv='git remote rename'
alias grset='git remote set-url'
alias grup='git remote update'
alias grh='git reset'
alias gru='git reset --'
alias grhh='git reset --hard'
alias grhk='git reset --keep'
alias grhs='git reset --soft'
alias gpristine='git reset --hard && git clean --force -dfx'
alias groh 'git reset origin/(git_current_branch) --hard'
alias grs='git restore'
alias grss='git restore --source'
alias grst='git restore --staged'
alias gunwip 'git rev-list --max-count=1 --format="%s" HEAD | grep -q "\--wip--" && git reset HEAD~1'
alias grev='git revert'
alias grm='git rm'
alias grmc='git rm --cached'
alias gcount='git shortlog --summary --numbered'
alias gsh='git show'
alias gsps='git show --pretty=short --show-signature'
alias gstall='git stash --all'
alias gstaa='git stash apply'
alias gstc='git stash clear'
alias gstd='git stash drop'
alias gstl='git stash list'
alias gstp='git stash pop'
# use the default stash push on git 2.13 and newer
is-at-least 2.13 (command git --version | awk '{print $3}') \
&& alias gsta 'git stash push' \
|| alias gsta 'git stash save'
alias gsts='git stash show --patch'
alias gst='git status'
alias gss='git status --short'
alias gsb='git status --short --branch'
alias gsi='git submodule init'
alias gsu='git submodule update'
alias gsd='git svn dcommit'
alias git-svn-dcommit-push 'git svn dcommit && git push github (git_main_branch):svntrunk'
alias gsr='git svn rebase'
alias gsw='git switch'
alias gswc='git switch --create'
alias gswd 'git switch (git_develop_branch)'
alias gswm 'git switch (git_main_branch)'
alias gta='git tag --annotate'
alias gts='git tag --sign'
alias gtv 'git tag | sort -V'
alias gignore='git update-index --assume-unchanged'
alias gunignore='git update-index --no-assume-unchanged'
alias gwch='git whatchanged -p --abbrev-commit --pretty=medium'
alias gwt='git worktree'
alias gwta='git worktree add'
alias gwtls='git worktree list'
alias gwtmv='git worktree move'
alias gwtrm='git worktree remove'
alias gstu 'gsta --include-untracked'
function gtl
git tag --sort=-v:refname -n --list "$argv[1]*"
end
alias gk '\gitk --all --branches &!'
alias gke '\gitk --all (git log --walk-reflogs --pretty=%h) &!'
# Logic for adding warnings on deprecated aliases
# set -l old_alias new_alias
# for old_alias new_alias in \
# # gup gpr \
# gupv gprv \
# gupa gpra \
# gupav gprav \
# gupom gprom \
# gupomi gpromi
# echo -e "%F{yellow}[oh-my-zsh] '%F{red}$old_alias%F{yellow}' is a deprecated alias, using '%F{green}$new_alias%F{yellow}' instead.%f"
# functions -q $new_alias
# end