2023.01.05.
Git cheat sheet
Basic

git / github / git-flow / cheat sheet

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 ์ปค๋ฐ‹ ์ƒ์„ฑ

$ 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 ์œ„์น˜๋กœ ๋ฆฌ์…‹๋˜์–ด ์ดํ›„์˜ ๋‚ด์šฉ ์‚ญ์ œ

$ 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.

git-cheat-sheet-3.jpg

fast-forward

๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜๊ฐ€ ๋ณ‘ํ•ฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ธŒ๋žœ์น˜ ์ดํ›„์— ์ƒˆ ์ปค๋ฐ‹์ด ์—†๋Š” ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ณ‘ํ•ฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹์„ ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜๋กœ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ด

ref.

git-cheat-sheet-4.jpg

# 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

git-cheat-sheet-5.jpg

squash

git merge --squash new_new_branch

git-cheat-sheet-6.jpg

  • 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

  1. main
  2. develop
  3. feature
  4. release
  5. 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 ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ

Trunk-based

main ๋ธŒ๋žœ์น˜๋งŒ์„ ์‚ฌ์šฉ โ‰’ Github Flow

  • ์ง€์†์ ์ด๊ณ  ๋งŽ์€ ํ…Œ์ŠคํŠธ ํ•„์š”
  • ci/cd์— ์ ํ•ฉํ•จ
main ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ํ›„ main ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ ๋ฐ˜๋ณต
main ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ํ›„ main ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ ๋ฐ˜๋ณต

.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

another commands

Documents

Etc. Ref

Thank You for Visiting My Blog, Have a Good Day ๐Ÿ˜ธ
ยฉ 2022 Developer ๋‚˜์—ฐ, Powered By Gatsby.