-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgit-shortcuts.zsh
More file actions
304 lines (258 loc) · 6.95 KB
/
git-shortcuts.zsh
File metadata and controls
304 lines (258 loc) · 6.95 KB
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
# ─────────────────────────────────────────────────────────────
# Git Shortcuts
# ─────────────────────────────────────────────────────────────
# Source: ~/.scripts/git-shortcuts.zsh
# ─────────────────────────────────────────────────────────────
# Global spinner for loading indication
# Usage: start_spinner "message" / stop_spinner
# ─────────────────────────────────────────────────────────────
_spinner_pid=""
start_spinner() {
local msg="${1:-Loading}"
(
while true; do
for c in ⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏; do
printf "\r%s %s" "$c" "$msg" >&2
sleep 0.1
done
done
) &!
_spinner_pid=$!
}
stop_spinner() {
[[ -n "$_spinner_pid" ]] && kill "$_spinner_pid" 2>/dev/null && wait "$_spinner_pid" 2>/dev/null
_spinner_pid=""
printf "\r\033[K" >&2
}
# ─────────────────────────────────────────────────────────────
# gs - git status shortcut
alias gs="git status"
# gsw - switch branch
alias gsw="git switch"
# gcb - create and switch to new branch
unalias gcb 2>/dev/null
gcb() {
if [ -z "$1" ]; then
echo "Usage: gcb \"branch-name\""
return 1
fi
local branch="$1"
local output
output=$(git checkout -b "$branch" 2>&1)
local ret=$?
if [[ $ret -eq 0 ]]; then
echo "✅ Created and switched to branch: $branch"
else
echo "❌ Failed to create branch"
echo ""
echo "$output"
echo ""
fi
return $ret
}
# gco - checkout branch or file
alias gco="git checkout"
# gl - pretty git log
alias gl="git log --oneline --graph --decorate --all"
# gd - git diff
alias gd="git diff"
# gb - git branch
alias gb="git branch"
# gaa - git add all
alias gaa="git add ."
# uncommit - undo last commit but KEEP your changes (staged)
alias uncommit="git reset --soft HEAD~1"
# dropcommit - undo last commit AND discard the changes completely
alias dropcommit="git reset --hard HEAD~1"
# commit "message" - stages all changes and commits
commit() {
if [ -z "$1" ]; then
echo "Usage: commit \"your commit message\""
return 1
fi
git add . && git commit -m "$1"
}
# push - pushes current branch to origin
push() {
local branch=$(git symbolic-ref --short HEAD 2>/dev/null)
if [ -z "$branch" ]; then
echo "❌ Not in a git repository"
return 1
fi
start_spinner "Pushing to $branch"
local output
output=$(git push origin "$branch" 2>&1)
local ret=$?
stop_spinner
if [[ $ret -eq 0 ]]; then
echo "✅ Pushed to $branch"
else
echo "❌ Push failed"
echo ""
echo "$output"
echo ""
fi
return $ret
}
# pull - pulls current branch from origin
pull() {
local branch=$(git symbolic-ref --short HEAD 2>/dev/null)
if [ -z "$branch" ]; then
echo "❌ Not in a git repository"
return 1
fi
start_spinner "Pulling from $branch"
local output
output=$(git pull origin "$branch" 2>&1)
local ret=$?
stop_spinner
if [[ $ret -eq 0 ]]; then
echo "✅ Pulled from $branch"
else
echo "❌ Pull failed"
echo ""
echo "$output"
echo ""
fi
return $ret
}
# drop - stash and drop all changes (discard all uncommitted changes)
drop() {
git stash && git stash drop
}
# cnb - create new branch and switch to it
cnb() {
if [ -z "$1" ]; then
echo "Usage: cnb \"branch-name\""
return 1
fi
local branch="$1"
local output
output=$(git checkout -b "$branch" 2>&1)
local ret=$?
if [[ $ret -eq 0 ]]; then
echo "✅ Created and switched to branch: $branch"
else
echo "❌ Failed to create branch"
echo ""
echo "$output"
echo ""
fi
return $ret
}
# sum - get AI-generated one-line commit summary using cursor agent
sum() {
local status_output=$(git status --porcelain 2>/dev/null)
local diff_output=$(git diff 2>/dev/null)
if [ -z "$status_output" ]; then
echo "No changes to summarize"
return 1
fi
start_spinner "Generating commit summary"
# Build prompt with all context inline
local prompt="You are in project: $(basename $(pwd)). Generate a concise one-line git commit message (max 72 chars) for ONLY these changes. Return ONLY the commit message text, nothing else. No quotes, no explanation, no markdown.
STATUS:
$status_output
DIFF:
$(echo "$diff_output" | head -150)"
# Use cursor agent with fresh workspace context
local result
result=$(cursor agent --print --mode ask --workspace "$(pwd)" "$prompt" 2>/dev/null | tail -1)
stop_spinner
# Clean up the result (remove quotes if present)
result="${result//\"/}"
result="${result//\'/}"
result="${result//\`/}"
echo "$result"
}
# cws - commit with AI-generated summary
cws() {
local summary
summary=$(sum)
if [ $? -ne 0 ] || [ -z "$summary" ]; then
echo "❌ No changes to commit"
return 1
fi
echo "📝 $summary"
echo -n "[Y/n/e]: "
read -r confirm
case "$confirm" in
[Nn])
echo "Cancelled."
return 0
;;
[Ee])
echo -n "Message: "
read -r summary
[[ -z "$summary" ]] && echo "❌ Empty." && return 1
;;
esac
start_spinner "Committing"
local output
output=$(git add . && git commit -m "$summary" 2>&1)
local ret=$?
stop_spinner
if [[ $ret -eq 0 ]]; then
echo "✅ $summary"
else
echo "❌ Commit failed"
echo ""
echo "$output"
echo ""
fi
return $ret
}
# cwsp - commit with AI-generated summary and push
cwsp() {
local summary
summary=$(sum)
if [ $? -ne 0 ] || [ -z "$summary" ]; then
echo "❌ No changes to commit"
return 1
fi
echo "📝 $summary"
echo -n "[Y/n/e]: "
read -r confirm
case "$confirm" in
[Nn])
echo "Cancelled."
return 0
;;
[Ee])
echo -n "Message: "
read -r summary
[[ -z "$summary" ]] && echo "❌ Empty." && return 1
;;
esac
start_spinner "Committing"
local output
output=$(git add . && git commit -m "$summary" 2>&1)
local ret=$?
stop_spinner
if [[ $ret -ne 0 ]]; then
echo "❌ Commit failed"
echo ""
echo "$output"
echo ""
return 1
fi
echo "✅ $summary"
local branch=$(git symbolic-ref --short HEAD 2>/dev/null)
start_spinner "Pushing to $branch"
output=$(git push origin "$branch" 2>&1)
ret=$?
stop_spinner
if [[ $ret -eq 0 ]]; then
echo "✅ Pushed to $branch"
else
echo "❌ Push failed"
echo ""
echo "$output"
echo ""
fi
return $ret
}
# Auto-load completions
if [ -f ~/.scripts/completions.zsh ]; then
source ~/.scripts/completions.zsh
fi