last modified: 2024-07-05
๐ก more information
Git
: ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ
ref : https://git-scm.com/docs/
0. start
check version
# ์๋ ์ปค๋ฉ๋๋ก ์ค์น ์๋ฃ ํ์ธ(๋ฒ์ ํ์ธ) ๊ฐ๋ฅ
git --version
user config
git config --global user.email "<user@email.com>"
git config --global user.name "<username>"
$ git init
(๋ก์ปฌ) ์ ์ฅ์ ์์ฑ
# git ์ ์ฅ์ ์์
git init
# ๊ธฐ๋ณธ ๋ธ๋์น๋ช
์ด 'master'์ธ ๊ฒฝ์ฐ๋ ์์
# ๋ธ๋์น ์ด๋ฆ์ 'main'์ผ๋ก ๋ณ๊ฒฝ
git branch -M main
1. create version (record)
- staging area: commit ํ๊ธฐ ์ ์ commitํ ํ์ผ๋ค์ ๊ณจ๋ผ๋๋ ๊ณณ
- ex. staging modified file to staging area for commit
- repository: git์ด ํ์ผ ๊ธฐ๋ก์ ์ ์ฅํด๋๋ ์ ์ฅ์
$ git add
# git add <file_name>
git add new.js
# ๋ชจ๋ ํ์ผ ์คํ
์ด์ง
git add . # ํ์ฌ ์ ์ฅ์ ๋ด ๋ชจ๋ (์์ ๋) ํ์ผ
git add --all # ๋ชจ๋ ์์ ๋ ํ์ผ
$ git commit
git commit -m ":commit message"
$ git log
git log
git log --all --oneline --graph
# vim ์๋ํฐ๋ก ํ์ผ์ ์ด์ด ํ์ธ
# ํค๋ณด๋ `j/k` ํค๋ฅผ ์ฌ์ฉํ์ฌ ์คํฌ๋กค ๋ค์ด/์
# `q` ํค๋ฅผ ์
๋ ฅํ์ฌ ์๋ํฐ ์ข
๋ฃ
$ git diff
๊ฐ์ฅ ์ต๊ทผ ์ปค๋ฐ๊ณผ์ ์ฝ๋ ์ฐจ์ด ํ์ธ
git diff
# vim ์๋ํฐ๋ก ํ์ผ์ ์ด์ด ํ์ธ
# git difftool <commit_id?> <commit_id?>
git difftool
# vim ์๋ํฐ๋ก ํ์ผ์ ์ด์ด ํ์ธ
# `:i`๋ฅผ ์
๋ ฅํ์ฌ ํ์ผ ์์
# `:q` ํน์ `:qa`์ ์
๋ ฅํ์ฌ ์๋ํฐ ์ข
๋ฃ
- ํน์ ์ปค๋ฐ๊ณผ์ ์ฝ๋ ์ฐจ์ด ํ์ธ:
git difftool <commit_id>
. - ๋ ๊ฐ์ ์ปค๋ฐ์ ํน์ ํ์ฌ ์ฝ๋ ์ฐจ์ด ํ์ธ:
git difftool <commit_id> <another_commit_id>
. - VSCode์ GUI extension์ ์ฌ์ฉํ ์๋ ์์ ex. โGit Graphโ in VSCode extension
$ git stash
- ์ปค๋ฐ ์ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ปค๋ฐ์ ํฌํจํ์ง ์๋๋ก ์ ๊น ๋ณด๊ดํ๊ธฐ: stash ์ฌ์ฉ ํน์ new temporary branch ์์ฑ
- ์ต๊ทผ ์ปค๋ฐ๊ณผ์ ์ฐจ์ด์ ์ ์ ๋ถ ๋ณด๊ด
git stash
# ํน์
git stash save 'memo'
# > Saved working directory and index state WIP on main: <commit_id> <commit_message>
# ์ผ๋ถ ์ฝ๋๋ง stash
git stash -p
# stash ๋ฆฌ์คํธ ๋ณด๊ธฐ
git stash list
# ๊ฐ์ฅ ์ต๊ทผ stash ๋ค์ ๋ถ๋ฌ์ค๊ธฐ
git stash pop
# stash ์ญ์
git stash drop {number} # specify one
git stash clear # all
commit revert
$ git restore
์ฝ๋๋ฅผ ์ต๊ทผ ํน์ ํน์ ์ปค๋ฐ์ผ๋ก ๋๋๋ฆฌ๊ธฐ ์ํด ์ฌ์ฉํ๊ฑฐ๋ ํน์ ํ์ผ์ staging์ ์ทจ์
# git restore <ํ์ผ๋ช
>
# git restore --source <์ปค๋ฐ_์์ด๋> <ํ์ผ๋ช
>
# git resotre --staged <ํ์ผ๋ช
>
$ git revert โ
์ปค๋ฐ ๋๋๋ฆฌ๊ธฐ
# git revert <์ปค๋ฐ_์์ด๋> <์ปค๋ฐ_์์ด๋?>
# ์ ์ฒ๋ผ ์ฌ๋ฌ ์ปค๋ฐ ์์ด๋๋ฅผ ์ง์ ํ ์ ์์
# ์ต๊ทผ ์ปค๋ฐ ๋๋๋ฆฌ๊ธฐ
git revert HEAD
!['git revert commit2_id' ์ปค๋ฉ๋ ์คํ ์ commit2๊ฐ ์ญ์ ๋ ์๋ก์ด commit4 ์ปค๋ฐ ์์ฑ 'git revert commit2_id' ์ปค๋ฉ๋ ์คํ ์ commit2๊ฐ ์ญ์ ๋ ์๋ก์ด commit4 ์ปค๋ฐ ์์ฑ](/static/d37c7926f1ea22c4164b0a849af47bd6/953fe/git-cheat-sheet-1.jpg)
$ git reset โ
ํน์ ์ปค๋ฐ์ด ์์ฑ๋ ์์ ์ผ๋ก ๋๋์๊ฐ๊ธฐ
# git reset --hard <์ปค๋ฐ_์์ด๋>
# ๋ฆฌ์
ํ ๋ณ๋์ฌํญ staging
# git reset --soft <์ปค๋ฐ_์์ด๋>
# git reset ์ปค๋ฉ๋์ ๊ธฐ๋ณธ ์ต์
# ๋ฆฌ์
ํ ๋ณ๋์ฌํญ unstage
# git reset --mixed <์ปค๋ฐ_์์ด๋>
!['git reset --hard commit2' ์ปค๋ฉ๋ ์คํ ์ commit2 ์์น๋ก ๋ฆฌ์
๋์ด ์ดํ์ ๋ด์ฉ ์ญ์ 'git reset --hard commit2' ์ปค๋ฉ๋ ์คํ ์ commit2 ์์น๋ก ๋ฆฌ์
๋์ด ์ดํ์ ๋ด์ฉ ์ญ์ ](/static/8ec2edc77b2226f36db131092c8e7524/953fe/git-cheat-sheet-2.jpg)
$ git clean
๋ชจ๋ ๋ณ๊ฒฝ ๋ด์ฉ ์ทจ์(์ถ์ ๋์ง ์์ ๋ชจ๋ ํ์ผ ์ ๊ฑฐ)
2. branch
create and switch branch
# git branch/switch <๋ธ๋์น_์ด๋ฆ>
git branch new_branch
git switch new_branch
# ํ์ฌ ๋ธ๋์น ์ํ ํ์ธ
git status
merge branch
# ๋ณํฉํ๊ธฐ ์ํ ๋ฒ ์ด์ค ๋ธ๋์น๋ก ์ด๋
git switch main
# ๋ณํฉํ๊ณ ์ ํ๋ ๋ธ๋์น ๋ณํฉ
git merge new_branch
- ๊ฐ์ ํ์ผ, ๊ฐ์ ๋ผ์ธ์ ์์ ์ฌํญ์ด ๊ฒน์น๋ค๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ์ ์์
- ๋ณํฉ ์ถฉ๋ ์, ์ถฉ๋์ด ์ผ์ด๋ ํ์ผ์ ์ด์ด์ ์์ ํ ์ฌ์ปค๋ฐ
3-way
๋ณํฉํ๋ ค๊ณ ํ๋ ๋ ๋ธ๋์น์ ๋ชจ๋ 1๊ฐ ์ด์์ ์ปค๋ฐ์ด ์๋ ๊ฒฝ์ฐ ๋ ๋ธ๋์น๊ฐ ๋ณํฉ๋ ์๋ก์ด ์ปค๋ฐ ์์ฑ
ref.
fast-forward
๋ฒ ์ด์ค ๋ธ๋์น๊ฐ ๋ณํฉํ๊ณ ์ ํ๋ ๋ธ๋์น ์ดํ์ ์ ์ปค๋ฐ์ด ์๋ ๊ฒฝ์ฐ, ์๋ก์ด ์ปค๋ฐ์ ๋ง๋ค์ง ์๊ณ ๋ณํฉํ๊ณ ์ ํ๋ ๋ธ๋์น์ ์ปค๋ฐ์ ๋ฒ ์ด์ค ๋ธ๋์น๋ก ๊ทธ๋๋ก ๊ฐ์ ธ์ด
ref.
# fast-forward๋ฅผ ์ํํด๋ ๋๋ ์ํฉ์์ ๊ฐ์ ๋ก 3-way ๋ฐฉ๋ฒ์ผ๋ก ๋ณํฉ
git merge --no-ff new_branch
rebase
๋ฒ ์ด์ค ๋ธ๋์น๊ฐ ๋ณํฉํ๊ณ ์ ํ๋ ๋ธ๋์น ์ดํ์ ์ ์ปค๋ฐ์ด ์๋ ๊ฒฝ์ฐ, ์๋ก์ด ๋ธ๋์น์ ์์์ ์ ๋ฒ ์ด์ค ๋ธ๋์น์ ๋์ผ๋ก ์ด๋์์ผ fast-forward ์คํ
# ๋ณํฉํ๊ณ ์ํ๋ ๋ธ๋์น๋ก ์ด๋
git switch new_branch
# main ๋ธ๋์น์์ ์์์ ์ด๋
git rebase main
# ๋ธ๋์น ๋ณํฉ
git switch main
git merge new_branch
squash
git merge --squash new_new_branch
- commit4์ ๋ก๊ทธ์ commit2-1, commit2-2๊ฐ ๋จ์ง ์์
delete branch
๋ณํฉ์ด ์๋ฃ๋ ๊ฒฝ์ฐ ๋์ฒด๋ก ๋ธ๋์น๋ฅผ ์ญ์
# ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒฝ์ฐ
git branch -d new_branch
# ๋ณํฉ๋์ง ์์ ๋ธ๋์น๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ
git branch -D new_new_branch
3. upload
- ์๊ฒฉ์ ์ฅ์(online repository)์ ์ ์ฅ โ ํ์ ์ ๊ฐ์์ ๋ก์ปฌ ์ ์ฅ์๋ก ๋ณต์ ํ ํ ๊ฐ๋ฐ ์งํํ๊ฒ ๋จ
$ git push
# git push -u <์๊ฒฉ_์ ์ฅ์_์ฃผ์> <์ฌ๋ฆด_๋ก์ปฌ_๋ธ๋์น๋ช
>
git push -u https://github.com/<someone>/<some_repository>.git main
$ git remote add <variable>
์๊ฒฉ ์ ์ฅ์ ์ค์
# git remote add <๋ณ์๋ช
> <๊ฐ(url)>
git remote add origin https://github.com/<someone>/<some_repository_name>.git
git push -u origin main
# => 'git push -u https://github.com/<someone>/<some_repository>.git main'์ ๋์ผ
# => `-u`๋ฅผ ์ฌ์ฉํ์ฌ <origin_url> <origin_branch> ์ฃผ์ ๊ธฐ์ต
# => ์ฃผ์๋ฅผ ๊ธฐ์ตํ ์ดํ, 'git push'๋ง ์ฌ์ฉํด๋ ๋์ผํ๊ฒ ์๋
$ git clone
์๊ฒฉ ์ ์ฅ์ ๋ก์ปฌ๋ก ๋ณต์
# git clone <์ ์ฅ์_์ฃผ์>
git clone https://github.com/<someone>/<some_repository_name>
$ git pull
์๊ฒฉ ๋ณ๊ฒฝ์ฌํญ์ ๋ก์ปฌ ์ ์ฅ์์ ํตํฉ
์๊ฒฉ์ ๋ก์ปฌ ์์ ์ด ์๋ ๊ฒฝ์ฐ, ์ปค๋ฐ์ pushํ๊ธฐ ์ ์ ์๊ฒฉ ๋ณ๊ฒฝ ์ฌํญ์ ๋ก์ปฌ ์ ์ฅ์์ ํตํฉ ๋จผ์ ์งํ
git pull
# git pull = git fetch + git merge
- git fetch: ์๊ฒฉ ์ ์ฅ์์์ ์ ๋ณ๊ฒฝ์ฌํญ ๊ฐ์ ธ์ค๊ธฐ
- git merge: ๋ณ๊ฒฝ์ฌํญ ๋ณํฉ
- ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณํฉ ์ ์ถฉ๋ ๋ฐ์ ๊ฐ๋ฅ
pull request
pushํ ๋ธ๋์น๊ฐ ์๊ฒฉ ์ ์ฅ์์ ๋ณํฉํ ์ ์๋๋ก ์์ฒญ
- ์๊ฒฉ ์ ์ฅ์์์ pull request ์์ฑ:
https://github.com/<someone>/<some_repository_name>
- ์ถฉ๋ ํด๊ฒฐ
- pull request ๋ณํฉ
branch push
# ๋ก์ปฌ ํ๊ฒฝ์์,
git branch <new_branch>
git switch <new_branch>
git add .
git commit -m "create new branch"
# ์ ๋ธ๋์น push
git push origin <new_branch>
4. additional
workflow
โ GitFlow / Github Flow / Trunk-based / Gitlab Flow
GitFlow
by Vincent Driessen
- main
- develop
- feature
- release
- hotfix
- ci/cd์ ์ ํฉํ์ง ์์
- ๊ฐ๋ฐ ํ๊ฒฝ ๋ฑ์ ๋ง๋๋ก ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉ
- ์ฐธ๊ณ : Gitflow - Atlassian Git Tutorial
![develop, feature, release, hotfix ๋ธ๋์น์ ์ญํ ์ ๋ฐ๋ผ ์ฌ์ฉ. develop ๋ธ๋์น๋ฅผ ์ฃผ๋ก ๊ฐ๋ฐ์ ์งํํ๋ฉฐ ๊ฐ๋ฐํ๋ ๊ธฐ๋ฅ๋ณ feature ๋ธ๋์น๋ฅผ ์ถ๊ฐ, ๋ณํฉ์ ๋ฐ๋ณตํ๊ณ release ๋ธ๋์น๋ฅผ ์์ฑํ์ฌ ๋ฐฐํฌ. ๊ธด๊ธํ ์ค๋ฅ ์์ ์ hotfix ๋ธ๋์น๋ฅผ ์์ฑํ์ฌ main๊ณผ develop ๋ธ๋์น์ ๋ณํฉ develop, feature, release, hotfix ๋ธ๋์น์ ์ญํ ์ ๋ฐ๋ผ ์ฌ์ฉ. develop ๋ธ๋์น๋ฅผ ์ฃผ๋ก ๊ฐ๋ฐ์ ์งํํ๋ฉฐ ๊ฐ๋ฐํ๋ ๊ธฐ๋ฅ๋ณ feature ๋ธ๋์น๋ฅผ ์ถ๊ฐ, ๋ณํฉ์ ๋ฐ๋ณตํ๊ณ release ๋ธ๋์น๋ฅผ ์์ฑํ์ฌ ๋ฐฐํฌ. ๊ธด๊ธํ ์ค๋ฅ ์์ ์ hotfix ๋ธ๋์น๋ฅผ ์์ฑํ์ฌ main๊ณผ develop ๋ธ๋์น์ ๋ณํฉ](/static/7e749ad37cec1d83bc3d22d033528c9f/19de6/git-cheat-sheet-7.jpg)
Trunk-based
main ๋ธ๋์น๋ง์ ์ฌ์ฉ โ Github Flow
- ์ง์์ ์ด๊ณ ๋ง์ ํ ์คํธ ํ์
- ci/cd์ ์ ํฉํจ
![main ๋ธ๋์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ๋ฐํ๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๋ธ๋์น ์์ฑ ํ main ๋ธ๋์น์ ๋ณํฉ ๋ฐ๋ณต main ๋ธ๋์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ๋ฐํ๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๋ธ๋์น ์์ฑ ํ main ๋ธ๋์น์ ๋ณํฉ ๋ฐ๋ณต](/static/225404d556baeb05f3b34508e7ef9932/19de6/git-cheat-sheet-8.jpg)
.gitignore
push๋์ง ์๋ ํ์ผ ํน์ ๊ฒฝ๋ก ์ ์ ํ์ผ
how to write
gitignore
ํ์ผ์ ๊ฐ ๋ผ์ธ์ผ๋ก ๊ตฌ๋ถํ์ฌ ํ์ผ ํน์ ๊ฒฝ๋ก ํจํด ์ ์
# this is a comment
\#dir_start_with_hash
!this_is_negative_pattern
\!file_start_with_exclamation_mark!.txt
/directory/separate
*.anything
without/?.something
**/match/all/dir
all/**
all/**/between
- ํน์ gitignore ์์ฑ: gitignore.io
another commands
- 20 Git Commands you (probably) didnโt know about ๐งโโ๏ธ, Alicia Sykes - blog post
- Git - git Documentation