-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgitx
More file actions
executable file
·233 lines (201 loc) · 8.09 KB
/
gitx
File metadata and controls
executable file
·233 lines (201 loc) · 8.09 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
#!/usr/bin/env bash
set -euo pipefail
# ──────────────────────────────────────────────────────────────
# 사용법 (프로젝트 로컬)
# ./gitx "[prefix] : Your commit message" # 전체 워크플로우 (add → commit → push) - ./gitx "feat : 로그인 기능 추가"
# ./gitx commit "[prefix] : Your commit" # git add → commit - ./gitx commit "feat : 로그인 기능 추가"
# ./gitx push # git fetch → push - ./gitx push
# ./gitx reset # 로컬 변경사항 버리기 (reset --hard, clean -fd) -" ./gitx reset
# ./gitx merge # 현재 브랜치를 develop 브랜치로 병합 - ./gitx merge "[docs] : 문서 수정"
# ./gitx force-merge # 현재 브랜치를 develop에 강제 병합 후 푸시 - ./gitx force-merge
# ./gitx fetch # 모든 원격 저장소 fetch (git fetch --all) - ./gitx fetch
# ./gitx checkout [branch명] # 새 브랜치 생성 및 체크아웃 - ./gitx checkout feature/login
# ./gitx merge-from <source-branch> # <source-branch>를 현재 브랜치에 병합 & 푸시 - ./gitx merge-from develop
# ./gitx abort # 현재 진행 중인 병합 취소 (git merge --abort) - ./gitx abort
# 로컬 브랜치 삭제 (안전)
# git branch -d feature/2025-05-23
# 병합 여부 무시하고 강제로 삭제
# git branch -D feature/2025-05-23
# ──────────────────────────────────────────────────────────────
do_commit() {
git add .
if [[ -z "${1:-}" ]]; then
echo "❗️ commit 메시지를 \"[prefix] : message\" 형식으로 입력하세요."
exit 1
fi
git commit -m "$1"
}
do_push() {
git fetch
branch=$(git rev-parse --abbrev-ref HEAD)
git push origin "$branch"
}
do_reset() {
echo "⚠️ 로컬 변경사항을 모두 버립니다. (git reset --hard, git clean -fd)"
read -p "계속하시겠습니까? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "취소되었습니다."
exit 1
fi
git reset --hard
git clean -fd
echo "✅ 로컬 변경사항이 모두 버려졌습니다."
}
do_merge() {
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [[ "$current_branch" == "develop" ]]; then
echo "❗️ 현재 브랜치가 이미 'develop'입니다. 병합할 필요가 없습니다."
exit 1
fi
# 두 번째 인자로 커밋 메시지를 받거나, 기본 메시지 사용
merge_msg="${2:-"Merge branch '$current_branch' into develop"}"
echo "ℹ️ 현재 브랜치 '$current_branch'를 'develop' 브랜치로 병합합니다."
echo "ℹ️ 커밋 메시지: \"$merge_msg\""
read -p "계속하시겠습니까? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "취소되었습니다."
exit 1
fi
echo "🔄 'develop' 브랜치로 이동 중..."
git checkout develop
echo "🔄 'develop' 브랜치의 최신 변경사항을 가져오는 중..."
git pull origin develop
echo "🔄 '$current_branch' 브랜치를 'develop'으로 병합 중..."
git merge "$current_branch" --no-ff -m "$merge_msg"
echo "✅ '$current_branch' 브랜치가 'develop'으로 병합되었습니다."
echo "ℹ️ 변경사항을 원격 'develop' 브랜치에 푸시하려면 './gitx push'를 실행하세요."
}
do_force_merge() {
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [[ "$current_branch" == "develop" ]]; then
echo "❗️ 현재 브랜치가 이미 'develop'입니다. 병합할 필요가 없습니다."
exit 1
fi
merge_msg="${2:-"[강제병합] Merge branch '$current_branch' into develop"}"
echo "🚨 현재 브랜치 '$current_branch'를 'develop'에 강제 병합 후 푸시합니다."
echo "ℹ️ 커밋 메시지: \"$merge_msg\""
echo "⚠️ 이 작업은 되돌릴 수 없습니다!"
read -p "정말로 계속하시겠습니까? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "취소되었습니다."
exit 1
fi
echo "🔄 현재 브랜치 변경사항 커밋 중..."
git add .
if ! git diff --staged --quiet; then
git commit -m "WIP: Auto-commit before force merge" || true
fi
echo "🔄 'develop' 브랜치로 이동 중..."
git checkout develop
echo "🔄 'develop' 브랜치의 최신 변경사항을 가져오는 중..."
git pull origin develop
echo "🔄 '$current_branch' 브랜치를 'develop'으로 강제 병합 중..."
git merge "$current_branch" --no-ff -m "$merge_msg" --strategy-option=theirs || {
echo "⚠️ 병합 충돌 발생. 자동으로 현재 브랜치 우선으로 해결 중..."
git add .
git commit -m "$merge_msg" || true
}
echo "🔄 'develop' 브랜치에 푸시 중..."
git push origin develop
echo "✅ '$current_branch' 브랜치가 'develop'에 강제 병합되고 푸시되었습니다."
echo "ℹ️ 현재 브랜치: $(git rev-parse --abbrev-ref HEAD)"
}
do_fetch() {
echo "🔄 모든 원격 저장소에서 fetch 중..."
git fetch --all
echo "✅ fetch 완료."
}
do_checkout() {
if [[ -z "${2:-}" ]]; then
echo "❗️ 체크아웃할 브랜치 이름을 입력하세요. 사용법: ./gitx checkout [branch명]"
exit 1
fi
branch_name=$2
echo "ℹ️ 브랜치 '$branch_name' 생성 후 체크아웃 합니다."
git checkout -b "$branch_name"
echo "✅ 현재 브랜치: $(git rev-parse --abbrev-ref HEAD)"
}
do_merge_from() {
if [[ -z "${2:-}" ]]; then
echo "❗️ 병합할 소스 브랜치 이름을 입력하세요. 사용법: ./gitx merge-from <source-branch>"
exit 1
fi
source_branch=$2
current_branch=$(git rev-parse --abbrev-ref HEAD)
# 소스 브랜치 존재 여부 확인
if ! git rev-parse --verify "$source_branch" &> /dev/null; then
echo "❗️ 브랜치 '$source_branch'가 존재하지 않습니다."
exit 1
fi
echo "ℹ️ 소스 브랜치 '$source_branch'를 현재 브랜치 '$current_branch'에 병합합니다."
read -p "계속하시겠습니까? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "취소되었습니다."
exit 1
fi
echo "🔄 소스 브랜치 '$source_branch'의 최신 변경사항을 가져오는 중..."
git fetch origin "$source_branch"
echo "🔄 '$source_branch' 브랜치를 '$current_branch'에 병합 중..."
git merge "$source_branch"
echo "✅ '$source_branch' 브랜치가 '$current_branch'에 병합되었습니다."
echo "🔄 변경사항을 원격 '$current_branch' 브랜치에 푸시 중..."
git push origin "$current_branch"
echo "✅ 병합 및 푸시가 완료되었습니다."
}
do_abort() {
echo "ℹ️ 현재 진행 중인 병합을 취소합니다."
if git merge --abort; then
echo "✅ 병합이 취소되었습니다."
else
echo "❗️ 현재 진행 중인 병합이 없습니다."
exit 1
fi
}
cmd="${1:-}"
case "$cmd" in
commit)
if [[ -z "${2:-}" ]]; then
echo "❗️ commit 메시지를 입력하세요. 사용법: ./gitx commit \"[prefix] : message\""
exit 1
fi
do_commit "$2"
;;
push)
do_push
;;
reset)
do_reset
;;
merge)
do_merge "$@"
;;
force-merge)
do_force_merge "$@"
;;
merge-from)
do_merge_from "$@"
;;
fetch)
do_fetch
;;
checkout)
do_checkout "$@"
;;
abort)
do_abort
;;
*)
if [[ -z "$cmd" ]]; then
echo "❗️ 사용법: ./gitx commit/push/reset/merge/force-merge/merge-from/fetch/checkout/abort 또는 ./gitx \"[prefix] : message\""
exit 1
elif [[ "$cmd" == *" : "* ]]; then
# 전체 워크플로우: commit + push
do_commit "$cmd"
do_push
else
echo "❗️ 잘못된 명령어 또는 커밋 메시지 형식입니다. 사용법을 확인하세요."
echo " ./gitx commit/push/reset/merge/force-merge/merge-from/fetch/checkout/abort 또는 ./gitx \"[prefix] : message\""
exit 1
fi
;;
esac