์ ์ฉํ shell script
๐ Shell script
์ฌ์ค ๋๋ ์ ์คํฌ๋ฆฝํธ์ ๊ทธ๋ค์ง ์น์ํ ํธ์ด ์๋๋ค. ์ฌ์ฉํ๋ ์ํฉ ์์ฒด๊ฐ ๋๋ฌด ํ์ ์ ์ด๋ผ ๋๋์ฑ ๊ทธ๋ ๋ค.๐ค
๊ทธ๋ฐ๋ฐ ์ต๊ทผ ์ด ์ ์คํฌ๋ฆฝํธ์ ์์ฒญ๋(!) ์ฌ์ฉ๋ฒ์ ๋ฐ๊ฒฌํ์ผ๋, ๋ฐ๋ก ๋ด๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ๊น ๋ช ๋ น์ด ๋ฌถ์์ ํ ๋ฒ์ ์คํํ ์ ์๋๋ก ํ๋ ๊ฒ์ด๋ค! ์ด๊ฑธ ๋ชจ๋ฅด๋ ๋๋ก ๋์๊ฐ ์ ์๋ค๋ ์๊ฐ์ ๋ธ๋ก๊ทธ์ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
๐ Shell script๋?
์ ์คํฌ๋ฆฝํธ์ ๋ํด ์์๋ณด๋ฉด์ ๋ด๊ฐ ํผ๋ํ๋ ๊ฐ๋ ์ด ์๋ค๋๊ฑธ ๊นจ๋ฌ์๋ค.
๋จผ์ ์ ์คํฌ๋ฆฝํธ(Shell + Script)๋ผ๋ ์ด๋ฆ๋ถํฐ ์ดํด๋ณด์. Script๊ฐ ๋๋ณธ์ด๋ ์๋ฏธ๊ฐ ์๋๊ฐ.
์ฆ ์ ์คํฌ๋ฆฝํธ๋ ์์ด ํ๋ํ ๋ด์ฉ์ด ์ ํ ์ผ์ข ์ ๋๋ณธ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ์์ ์ฌ์ฉ์์ ๋ช ๋ น์ ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ผ๋ก ์ผ์ข ์ ๋ช ๋ น์ด ํด์๊ธฐ๋ค.
๋ฆฌ๋ ์ค์ ์ ๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก CLI(๋ฌธ์ ์ ๋ ฅ)์ ํตํด ์ด์์ฒด์ (OS)๋ฅผ ์กฐ์ํ๋ฏ๋ก ์ด๋ฐ ์ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ์ํ๋ ๋๋ก ์ด์์ฒด์ ๋ฅผ ์กฐ์ํ ์ ์๊ฒ ๋๋ค.
ํฐ๋ฏธ๋์ ๋ช ๋ น์ด ์ ๋ ฅ์ฐฝ์ผ๋ก ์ฌ์ฉ์๊ฐ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ ์ฐฝ๊ตฌ๋ค.
์ฆ ์ด๋ฅผ ์ข ํฉํด ์๊ฐํด๋ณด๋ฉด, ์ฌ์ฉ์๋ ํฐ๋ฏธ๋์ ํตํด ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๊ณ , ์์ ํด๋น ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋ช ๋ น์ ์ํํ๊ฒ ๋๋ ๊ฒ์ด๋ค!
์(๋ช ๋ น์ด ํด์๊ธฐ)์๋ ์ฌ๋ฌ ์ข ๋ฅ๊ฐ ์๋๋ฐ ๋ด๊ฐ ์ฃผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ Window์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ๋์ด์๋ Power Shell ๊ณผ git์ ์ค์นํ๋ฉด์ ํจ๊ป ์ค์นํ๋ git bash๋ฅผ ์๋ก ๋ค ์ ์๋ค.
์ด ๋๊ฐ์ง๋ ๋ช ๋ น์ด๋ฅผ ํด์ํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ฏ๋ก ์ด๋์์๋ ์คํ๋์๋ ๋ช ๋ น์ด๊ฐ ๋ค๋ฅธ ๊ณณ์์๋ ์คํ๋์ง ์๋ ์ผ์ด ๋ฐ์ํ๊ธฐ๋ ํ๋ค.
โจ ํ์ํ ์คํฌ๋ฆฝํธ ์์ฑํ๊ธฐ
๊ฐ๋จํ๊ฒ ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ฌด์์ธ์ง ์์๋ณด์์ผ๋, ์ด์ ๋ด๊ฐ ์์ฃผ์ฐ๋ ๊น ๋ช ๋ น์ด ๋ฌถ์์ ๋ชจ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด๋ณด์.
์ผ๋จ ํ์ํ ์ํฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฌ๋ฌ ๋ธ๋์น๋ฅผ ๋๊ณ ์ฌ๋ฌ ๋ก์ปฌ ํ๊ฒฝ์์ ์์ ํ๋ฉด์, main์ด๋ ๋ค๋ฅธ ๊ณณ์ ๋ด์ฉ์ ํด๋น branch์ merge ์ํฌ ํ์์ฑ์ด ์๋๋ฐ, ์ด ๋ ํ์ฌ ๋ธ๋์น ๋ด์ฉ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ค๋ฉด ์๋์ ๊ฐ์ ์์ ์ ๋ฐ๋ณตํด์ผ ํ๋ค.
- ๊ธฐ์กด ๋ธ๋์น(Origin) stash
- ํ์ํ ๋ธ๋์น(New)๋ก switch
- ๋ก์ปฌ์์ remote branch ๋ด์ฉ pull
- ๋ค์ ์๋ ๋ธ๋์น๋ก switch
- New branch์ merge
- stash ํด ๋ branch ๋ด์ฉ pop
์ด ๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ๋ฉด ๋จ์ถ์ด๋ก ์ ๋ง ๋น ๋ฅด๊ฒ ์ด 6๋จ๊ณ๋ฅผ ์คํํ ์ ์๋ค!
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
#!/bin/bash
# === ์ค์ ===
TARGET_BRANCH=${1:-main}
# === ํ์ฌ ๋ธ๋์น ์ ์ฅ ===
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
echo "๐ ํ์ฌ ๋ธ๋์น: $CURRENT_BRANCH"
echo "๐ ๋ณํฉ ๋์ ๋ธ๋์น: $TARGET_BRANCH"
# === ๋ณ๊ฒฝ์ฌํญ ์๋์ง ํ์ธ ===
if ! git diff --quiet || ! git diff --cached --quiet; then
echo "1๏ธโฃ ๋ณ๊ฒฝ์ฌํญ stash ์ ์ฅ ์ค..."
git stash push -m "auto-stash before merging $TARGET_BRANCH"
STASHED=1
else
echo "โ
๋ณ๊ฒฝ์ฌํญ ์์ (stash ์๋ต)"
STASHED=0
fi
# === ๋ณํฉ ๋์ ๋ธ๋์น๋ก ์ด๋ ===
echo "2๏ธโฃ $TARGET_BRANCH ๋ธ๋์น๋ก ์ด๋"
git checkout "$TARGET_BRANCH"
echo "3๏ธโฃ ์ต์ ๋ด์ฉ pull"
git pull origin "$TARGET_BRANCH"
echo "4๏ธโฃ ์๋ ๋ธ๋์น๋ก ๋ณต๊ท: $CURRENT_BRANCH"
git checkout "$CURRENT_BRANCH"
# === ๋ณํฉ ===
echo "5๏ธโฃ ์ต์ $TARGET_BRANCH ๋ด์ฉ๊ณผ ๋ณํฉ"
git merge "$TARGET_BRANCH"
# === ์ถฉ๋ ์ฌ๋ถ ํ์ธ ===
if [ $? -ne 0 ]; then
echo "โ ๋ณํฉ ์ค ์ถฉ๋ ๋ฐ์! ์๋ ํด๊ฒฐ ํ์"
exit 1
fi
# === stash ๋ณต์ ===
if [ "$STASHED" -eq 1 ]; then
echo "6๏ธโฃ stash ๋ณต์ํ์๊ฒ ์ต๋๊น? (y/n)"
read -r REPLY
if [[ "$REPLY" =~ ^[Yy]$ ]]; then
echo "โ
stash ๋ณต์ ์ค..."
git stash pop
else
echo "โ stash๋ ๊ทธ๋๋ก ๋จ์์์ต๋๋ค. ํ์ ์ 'git stash list' ํ์ธ"
fi
fi
echo "๐ ๋ธ๋์น ์ต์ ํ ์๋ฃ!"
์ด์ด์ remote branch๋ฅผ ๋ก์ปฌ์ ๊ฐ์ง๊ณ ์ค๋ ๊ฒ๋ ๊ฐ๋จํ๊ฒ ๋ฐ๊ฟ๋ณด์
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
#!/bin/bash
# === ๋ธ๋์น๋ช
์
๋ ฅ๋ฐ๊ธฐ ===
read -p "๐ ๊ฐ์ ธ์ฌ ๋ธ๋์น๋ช
์ ์
๋ ฅํ์ธ์: " BRANCH_NAME
# === ์
๋ ฅ ์์ผ๋ฉด ์ข
๋ฃ ===
if [ -z "$BRANCH_NAME" ]; then
echo "โ ๋ธ๋์น๋ช
์ด ์
๋ ฅ๋์ง ์์์ต๋๋ค. ์ข
๋ฃํฉ๋๋ค."
exit 1
fi
echo "๐ ๋ธ๋์น๋ช
: $BRANCH_NAME"
# === ๋ก์ปฌ ๋ธ๋์น์ ์กด์ฌํ๋์ง ํ์ธ ===
if git show-ref --verify --quiet refs/heads/$BRANCH_NAME; then
echo "โ
์ด๋ฏธ ๋ก์ปฌ์ ์กด์ฌํ๋ ๋ธ๋์น์
๋๋ค. ํด๋น ๋ธ๋์น๋ก ์ด๋ํฉ๋๋ค."
git checkout $BRANCH_NAME
else
echo "๐ ๋ก์ปฌ์ ์๋ ๋ธ๋์น์
๋๋ค. ์๊ฒฉ์์ ๊ฐ์ ธ์ต๋๋ค..."
git fetch origin $BRANCH_NAME
# === fetch ์ฑ๊ณต ์ฌ๋ถ ํ์ธ ===
if [ $? -ne 0 ]; then
echo "โ ์๊ฒฉ์ ์๋ ๋ธ๋์น์
๋๋ค. ๋ธ๋์น ์ด๋ฆ์ ํ์ธํด์ฃผ์ธ์."
exit 1
fi
# === ๋ก์ปฌ ๋ธ๋์น ์์ฑ + ํธ๋ํน ์ค์ ===
git checkout -b $BRANCH_NAME origin/$BRANCH_NAME
echo "๐ ๋ก์ปฌ ๋ธ๋์น ์์ฑ ๋ฐ ์ฒดํฌ์์ ์๋ฃ: $BRANCH_NAME"
fi
๋จผ์ , ํด๋น ๊ฒฝ๋ก์ ์์ฑํด ๋ sh ํ์ผ์ ๋ฃ์ด์ค๋ค. D:\Users\(user_name)\scripts
(scripts ํด๋๋ ์ง์ ๋ง๋ ํด๋๋ค)
๊ทธ ๋ค์ ๊ฐ๋จํ๊ฒ ๋จ์ถ์ด๋ก ๋ฑ๋กํด๋ณด์.
code ~/.bashrc
๋ฅผ ํตํด ํ์ฌ ํ ๋๋ ํ ๋ฆฌ์ ์๋ bash ์ค์ ํ์ผ์ vs code ์๋ํฐ๋ก ์คํํ์. ๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด alias๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
1
2
alias gr='bash ~/scripts/git-refresh.sh'
alias br='bash ~/scripts/git-branch.sh'
์ด์ ํฐ๋ฏธ๋์ ๊ป๋ค๊ฐ ์ผ์ bash
ํฐ๋ฏธ๋์ gr
ํน์ br
๋ง ์
๋ ฅํด์ฃผ๋ฉด ์์์ ์์ฑํ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ด ์์ฃผ ๊ฐ๋จํ๊ฒ ์ํ๋๋๋ก ์๋ํ๊ฒ ๋๋ค!
๐ vs code ๊ธฐ๋ณธ ํฐ๋ฏธ๋ ๋ฐ๊พธ๊ธฐ
์ง๊ธ๊น์ง ๊ธฐ๋ณธ ํฐ๋ฏธ๋์ Power shell์ ์ฌ์ฉํ๊ณ ์์๋๋ฐ, git bash์ผ ๋๋ง ์ด๋ฒ์ ์ค์ ํ ๋จ์ถํค๋ฅผ ์ฌ์ฉํ ์ ์์ด ๊ธฐ๋ณธ ํฐ๋ฏธ๋์ ๊ต์ฒดํด์ฃผ์๋ค.
ํฐ๋ฏธ๋ ๊ต์ฒด ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
Ctrl + Shift + P
Preference: Open User Settings(JSON)
ํด๋ฆญ- ์๋ ๋ด์ฉ ์ถ๊ฐํ๊ธฐ
1 2 3 4 5 6
"terminal.integrated.defaultProfile.windows": "Git Bash", "terminal.integrated.profiles.windows": { "Git Bash": { "path": "C:\\Program Files\\Git\\bin\\bash.exe" } }
:star: ์ฐธ๊ณ ๋ก, path๊ฐ์ ์ด๋์ Git์ ์ค์นํ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค.