ใDo it! ๊น & ๊นํ๋ธ ์ ๋ฌธใ 3์ฅ. ๊น๊ณผ ๋ธ๋์น
๋ฅผ ์ฐธ๊ณ ํ์์ต๋๋ค
๋ชฉ์ฐจ3-2 ๋ธ๋์น ๋ง๋ค๊ธฐ ๋ฐ ์ด๋ํ๊ธฐ
3-1 ๋ธ๋์น๋?
๋ธ๋์น(branch)
๋๋ฌด๊ฐ ๊ฐ์ง์์ ์ ์ค๊ธฐ๋ฅผ ๋ป๋ฏ์ด ์ฌ๋ฌ ๊ฐ๋๋ก ํผ์ง๋ ๋ฐ์ดํฐ ํ๋ฆ
๊น์ผ๋ก ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์์ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก main ๋ธ๋์น(๊ตฌ master ๋ธ๋์น) ๋ง๋ค์ด์ง
์ฌ์ฉ์๊ฐ ์ปค๋ฐํ ๋๋ง๋ค main ๋ธ๋์น๋ ์ด๋ค ๊ฒ ์ต์ ์ปค๋ฐ์ธ์ง ์ ๋ณด๋ฅผ ๊ฐ์ง.
๊ธฐ์กด ํ์ผ์ main ๋ธ๋์น์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์, ์ ๋ธ๋์น์์ ๊ธฐ์กด ํ์ผ ๋ด์ฉ์ ์์ ํ๊ฑฐ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์.
main๋ธ๋์น์์ ์ ๋ธ๋์น๋ฅผ ๋ง๋๋ ๊ฒ์ '๋ถ๊ธฐ(branch)ํ๋ค'
๋ถ๊ธฐํ๋ ๋ธ๋์น๋ฅผ main ๋ธ๋์น์ ํฉ์น๋ ๊ฒ์ '๋ณํฉ(merge)ํ๋ค'
3-2 ๋ธ๋์น ๋ง๋ค๊ธฐ ๋ฐ ์ด๋ํ๊ธฐ
์ค์ต ์ํฉ ๋ง๋ค๊ธฐ
์ค์ต ์ํฉ : ๋ฒ์ ์ด ๋ค๋ฅธ ์ฌ์ฉ ์ค๋ช ์๋ฅผ ์ ๊ณตํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๋ธ๋์น๋ก ํด๊ฒฐํ๊ณ ์ ํจ.
$ cd ~ # ํ์ผ๋ก ์ด๋
$ mkdir manual # manual ๋๋ ํฐ๋ฆฌ ๋ง๋ฆ
$ cd manaul # manual ๋ก ์ด๋
$ git init # manual ๋๋ ํฐ๋ฆฌ๋ฅผ ์ ์ฅ์๋ก ๋ง๋ฆ
$ ls -al # .git ๋๋ ํฐ๋ฆฌ ๋ง๋ค์ด์ก๋์ง ํ์ธ
$ vim work.txt # vim์ผ๋ก work.txt ๋ค์ด๊ฐ์ content 1 ์
๋ ฅํ๊ณ ์ ์ฅํ๊ณ ๋์ด (:wq)
$ git add work.txt # ์คํ
์ด์ง์ ์ฌ๋ฆผ
$ git commit -m "work 1" # ์ปค๋ฐ
$ git log # ์ปค๋ฐ ๋ด์ญ ํ์ธ
(HEAD -> main) ; HEAD๊ฐ ํ์ฌ main์ด๋ผ๋ ๋ธ๋์น๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
์ด๊ฒ ๋ถ์ ์ปค๋ฐ์ด ๊ฐ์ฅ ์ต์ ์ปค๋ฐ (ํ์ฌ๋ work 1)
# ์์ ์ด์ด์
$ vim work.txt # work.txt์ 'content 2' ์ถ๊ฐ ์
๋ ฅ ํ ์ ์ฅ
$ git commit -am "work 2" # ์คํ
์ด์ง๊ณผ ์ปค๋ฐ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌ
$ vim work.txt # work.txt์ 'content 3' ์ถ๊ฐ ์
๋ ฅ ํ ์ ์ฅ
$ git commit -am "work 3"
$ git log # ์ปค๋ฐ ๋ก๊ทธ ํ์ธ
** ์คํ ์ด์ง๊ณผ ์ปค๋ฐ์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๋ commit -am์ ํ ๋ฒ์ด๋ผ๋ ์ปค๋ฐํ ์ ์๋ ํ์ผ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
3๊ฐ์ ์ปค๋ฐ์ด ๋ง๋ค์ด์ก๊ณ , ๊ฐ์ฅ ์ต์ ์ปค๋ฐ์ธ work 3์ (HEAD -> main) ํ์
์ ๋ธ๋์น ๋ง๋ค๊ธฐ
( apple, google, ms๋ผ๋ ๊ณ ๊ฐ์ฌ์๊ฒ ๋ด์ฉ์ด ์๋ก ๋ค๋ฅธ ์ฌ์ฉ ์ค๋ช ์๋ฅผ ์ ๊ณตํด์ผํ๋ ์ํฉ. )
$ git branch
๊น์์ ๋ธ๋์น๋ฅผ โ ๋ง๋ค๊ฑฐ๋ โกํ์ธํ๋ ๋ช ๋ น
$ git branch ๋ธ๋์น ์ด๋ฆ
์๋ก์ด ๋ธ๋์น ๋ง๋ค๊ธฐ
$ git branch # ํ์ฌ ๋ธ๋์น ํ์ธ -> main์ด๋ผ๊ณ ๋์ด
$ git branch apple # apple์ด๋ผ๋ ๋ธ๋์น ์์ฑ
$ git branch # ํ์ฌ ๋ธ๋์น ํ์ธ -> apple ๋ธ๋์น ์ถ๊ฐ๋จ & ์์ง main ๋ธ๋์น์์ ์์
* ํ์ : ํ์ฌ ์์ ํ๋ ๋ธ๋์น.
(HEAD -> main, apple)
์ ์ฅ์์ main๊ณผ apple์ด๋ผ๋ 2๊ฐ์ ๋ธ๋์น๊ฐ ์๋ค,
HEAD -> main ์ด๋ฏ๋ก ํ์ฌ ์์ ํ๋ ๋ธ๋์น๋ main ๋ธ๋์น (HEAD๋ ์์ ์ค์ธ ๋ธ๋์น๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ)
์ด ์ํ์์ ์ ์ปค๋ฐ์ ์ถ๊ฐํ๋ฉด?
main ์ธ์ 3๊ฐ์ ๋ธ๋์น ์ถ๊ฐํ๊ณ , ํ์ฌ ์ต์ ์ปค๋ฐ์ work 3. ์ด ์ํ์์ ์๋ก์ด ์ปค๋ฐ ์ถ๊ฐํ๋ฉด?
ms, google, apple ๋ธ๋์น์๋ ์ต์ ์ปค๋ฐ์ด work 3 ์ด๋ผ๋ ๋ป.
$ vim work.txt # work.txt์ "main content 4' ์ถ๊ฐ ์
๋ ฅ ํ ์ ์ฅ
$ git commit -am "main work 4"
$ git log --oneline # ํ ์ค์ ํ ์ปค๋ฐ์ฉ ๋ณด์ฌ์ค
git log --oneline ์ต์ : ํ ์ค์ ํ ์ปค๋ฐ์ฉ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ปค๋ฐ์ ํ๋์ ํ์ธํ ๋ ํธ๋ฆฌํจ
main work 4๋ ์์ง main ๋ธ๋์น์๋ง ์ ์ฉ๋์ด ์๊ณ , ms google apple ๋ธ๋์น๋ ์์ง work 3 ์ปค๋ฐ ์ํ.
์ฆ, ์๋ก ๋ง๋ ์ปค๋ฐ์ ํ์ฌ ๋ธ๋์น(main ๋ธ๋์น)์๋ง ์ ์ฉ๋๊ณ ๋๋จธ์ง ๋ธ๋์น์๋ ์ ์ฉ๋์ง ์์
* ์ปค๋ฐ์ ํ ์ค๋ก ํ์ํ ๊ฒฝ์ฐ ์ปค๋ฐ ํด์ 7์๋ฆฌ : ์ปค๋ฐ ํด์๋ ๊ธธ๊ธฐ ๋๋ฌธ์ ์์ 7์๋ฆฌ๋ก ์ปค๋ฐ์ ๊ตฌ๋ณํ ์ ์์
๋ธ๋์น ์ ํํ๊ธฐ — git switch
๋ธ๋์น๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ๊ฐ๊ฐ ์๋ก ๋ค๋ฅธ ์ปค๋ฐ ๋ง๋ค ์ ์์ -> ๋ธ๋์น๋ฅผ ์ค๊ฐ๋ฉด์ ์์ ํด์ผ ํจ
git switch ๋ค์ ๋ธ๋์น ์ด๋ฆ : '๋ธ๋์น๋ฅผ ์ ํํ๋ค', ํ์ฌ ๋ธ๋์น์์ ๋ค๋ฅธ ๋ธ๋์น๋ก ์ด๋ํ๋ ๊ฒ (* ๊ตฌ checkout)
$ git switch apple # apple ๋ธ๋์น๋ก ์ ํ
$ git log --oneline # ํ์ฌ ๋ธ๋์น์ ์ปค๋ฐ ๋ก๊ทธ ํ์ธ (apple ๋ธ๋์น๋ก ๋ฐ๊ฟจ์ ๋ ์ด๋ค ๋ณํ๊ฐ ์๊ธฐ๋์ง ํ์ธ)
$ cat work.txt # work.txt ํ์ผ ๋ด์ฉ ํ์ธ
apple ๋ธ๋์น ๋ง๋ค๊ธฐ ์ ๊น์ง main ๋ธ๋์น์ ์๋ ์ปค๋ฐ๋ค์ ๊ทธ๋๋ก apple ๋ธ๋์น์๋ ์ ์ฉ
work 3์ด apple, ms, google ๋ธ๋์น์ ์ต์ ์ปค๋ฐ
์ปค๋ฐ ํด์์์ HEAD๊ฐ apple์ ๊ฐ๋ฆฌํด
์ต์ ์ปค๋ฐ์ด work 3์ด๊ธฐ ๋๋ฌธ์ content 3๊น์ง ์์
main content 4๋ apple ๋ธ๋์น๋ฅผ ๋ถ๊ธฐํ ํ์ main ๋ธ๋์น์ ์ถ๊ฐ๋ ์ปค๋ฐ์ด๊ธฐ ๋๋ฌธ์ apple ๋ธ๋์น์ ์ํฅ X
** checkout?
checkout ๋ช ๋ น์์ ํ๋ ๊ธฐ๋ฅ์ restore์ switch๋ก ๋๋. ์์ง checkout ๋ช ๋ น๋ ์ฌ์ฉ์ ๊ฐ๋ฅํจ
- restore : ์์ ์ฌํญ์ด๋ ์คํ ์ด์ง ์ทจ์ํ ๋
- switch : ๋ธ๋์น๋ฅผ ์ ํํ ๋
3-3 ๋ธ๋์น ์ ๋ณด ํ์ธํ๊ธฐ
๋ธ๋์น๋ง๋ค ๋ง๋ค์ด์ง ์ปค๋ฐ์ด ์๋ก ์ด๋ค ๊ด๊ณ๊ฐ ์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ & ๋ธ๋์น ์ฌ์ด์ ์ฐจ์ด์ ์ ํ์ธํ๋ ๋ฐฉ๋ฒ
์ ํํ ๋ธ๋์น์์ ์ปค๋ฐํ๊ธฐ
$ vim work.txt # work.txt์ 'apple content 4' ์ถ๊ฐ ์
๋ ฅ ํ ์ ์ฅ
$ vim apple.txt # apple.txt ๋ง๋ค๊ณ 'apple content 4' ์
๋ ฅ ํ ์ ์ฅ
$ git add . # ํ์ฌ ์ ์ฅ์์์ ์์ ๋ด์ฉ ์๋ ํ์ผ์ ํ๊บผ๋ฒ์ ์คํ
์ด์ง
$ git commit -m "apple work 4" # ์ปค๋ฐ
$ git log --oneline # ์ปค๋ฐ ์ ์ฅ ๋ด์ญ ํ์ธ
(HEAD -> apple) : ํ์ฌ apple ๋ธ๋์น๋ก ์ ํ, ์ต์ ์ปค๋ฐ์ apple work 4
๋ธ๋์น์ ์ปค๋ฐ ๊ด๊ณ ์์๋ณด๊ธฐ
git log --branches ์ต์ : ๋ธ๋์น๋ง๋ค ์ต์ ์ปค๋ฐ์ ๋ณผ ์ ์์
git log --graph ์ต์ : ๋ธ๋์น์ ์ปค๋ฐ ๊ด๊ณ๋ฅผ ๊ทธ๋ํ ํํ๋ก ํ์
์ปค๋ฐ ๋ด์ญ ์ผ์ชฝ์ ์๋ ์์ง์ (|, /) : ์ปค๋ฐ๊ณผ ์ปค๋ฐ์๊ด๊ณ
- (apple ๋ธ๋์น) apple work 4 ์ปค๋ฐ์ ๋ถ๋ชจ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด work 3 ์ปค๋ฐ. work 3์ปค๋ฐ ๋ค์ apple work 4 ์ปค๋ฐ์ด ๋ง๋ค์ด์ก๋ค!
- (main ๋ธ๋์น) main work 4 ์ปค๋ฐ์ ๋ถ๋ชจ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด work 3 ์ปค๋ฐ.
- apple ๋ธ๋์น์ ์ปค๋ฐ๊ณผ main ๋ธ๋์น์ ์ปค๋ฐ์ด ๊ฐ์ ๋ถ๋ชจ ์ปค๋ฐ.
main ๋ธ๋์น๋ apple ๋ธ๋์น๋ work 3 ์ปค๋ฐ๊น์ง๋ ๊ฐ๊ณ ๊ทธ ์ดํ๋ถํฐ ๋ธ๋์น๋ง๋ค ๋ค๋ฅธ ์ปค๋ฐ์ ๋ง๋ค์๋ค!
๋ธ๋์น ์ฌ์ด์ ์ฐจ์ด์
๋ธ๋์น๋ง๋ค ์ปค๋ฐ์ด ์์ฌ ๊ฐ์๋ก ๋ธ๋์น ์ฌ์ด์ ์ฐจ์ด๋ฅผ ํ์ธํ๊ธฐ ์ด๋ ค์
git log์์ ๋ธ๋์น ์ด๋ฆ ์ฌ์ด์ ๋ง์นจํ 2๊ฐ(..) ๋ฅผ ๋ฃ๋ ๋ช ๋ น์ผ๋ก ๋ธ๋์น ๊ฐ ์ฐจ์ด ํ์ธ ๊ฐ๋ฅ
๋ง์นจํ ์ผ์ชฝ์ ์๋ ๋ธ๋์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ ๋ธ๋์น์ ๋น๊ต
$ git log main..apple : main ๋ธ๋์น์๋ ์๊ณ apple ๋ธ๋์น์๋ง ์๋ ์ปค๋ฐ ๋ณด์ฌ์ค
$ git log apple..main : apple ๋ธ๋์น์๋ ์๊ณ main ๋ธ๋์น์๋ง ์๋ ์ปค๋ฐ ๋ณด์ฌ์ค
3-4 ๋ธ๋์น ๋ณํฉํ๊ธฐ
'๋ธ๋์น ๋ณํฉ(merge)' : ๋ธ๋์น ์์ ์ ๋ง๋ฌด๋ฆฌํ๊ณ ๊ธฐ์กด ๋ธ๋์น์ ํฉ์น๊ธฐ
์ฌ๋ฌ ์ํฉ๋ง๋ค ๋ณํฉํ๋ ๋ฐฉ๋ฒ & ๋ณํฉํ๋ฉด์ ๋ธ๋์น ์ฌ์ด์ ์ถฉ๋์ด ์์ ๋ ํด๊ฒฐ๋ฐฉ๋ฒ
์๋ก ๋ค๋ฅธ ํ์ผ ๋ณํฉํ๊ธฐ
( ๋ถ๊ธฐํ ๋ธ๋์น์ ์๋ก ๋ค๋ฅธ ๋ฌธ์๊ฐ ์์ ๋ )
$ git init ๋๋ ํฐ๋ฆฌ ์ด๋ฆ : ์๋ก์ด ๋๋ ํฐ๋ฆฌ ๋ง๋ค๊ณ ์ ์ฅ์๋ฅผ ์ด๊ธฐํํ๋ ๊ณผ์ ์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌ
$ git init manual-2 # ์๋ก์ด ๋๋ ํฐ๋ฆฌ ๋ง๋ค๊ธฐ & ์ ์ฅ์ ์ด๊ธฐํ ํ๋ฒ์ !
$ cd manual-2 # manual-2 ๋๋ ํฐ๋ฆฌ๋ก ์ด๋
$ ls -al # .git/ ๋๋ ํฐ๋ฆฌ ๋ง๋ค์ด์ก๋์ง ํ์ธ
$ vim work.txt # work.txt ๋ง๋ค๊ณ '1' ์
๋ ฅ ํ ์ ์ฅ
$ git add work.txt
$ git commit -m "work 1"
ํ์ฌ ; 1. HEAD๊ฐ main ๋ธ๋์น๋ฅผ ๊ฐ๋ฆฌํด 2. main์ด work 1 ์ปค๋ฐ์ ๊ฐ๋ฆฌํด
$ git branch o2 # 'o2' ๋ธ๋์น ์์ฑ
$ vim main.txt # (ํ์ฌ main ๋ธ๋์น) 'main 2' ์
๋ ฅ ํ ์ ์ฅ
$ git add main.txt # ์คํ
์ด์ง
$ git commit -m "main work 2" # ์ปค๋ฐ
$ git switch o2 # o2 ๋ธ๋์น๋ก ์ ํ
$ vim o2.txt # o2.txt ๋ง๋ค๊ณ '2' ์
๋ ฅ ํ ์ ์ฅ
$ git add o2.txt # ์คํ
์ด์ง
$ git commit -m "o2 work 2" # ์ปค๋ฐ
$ git log --oneline -branches --graph # ํ์ฌ ์ปค๋ฐ ์ํ ํ์ธ
$ git merge ๊ฐ์ ธ์ฌ-๋ธ๋์น-์ด๋ฆ
# ์ด์ ๋ถํฐ ๋ณํฉ!
$ git switch main # ๋ธ๋์น๋ฅผ ๋ณํฉํ๋ ค๋ฉด ๋จผ์ main ๋ธ๋์น๋ก ์ ํ
$ git merge o2 # main ๋ธ๋์น๋ฅผ ๊ธฐ์ค์ผ๋ก o2 ๋ธ๋์น๋ฅผ ๊ฐ์ ธ์ ๋ณํฉ
git merge ์คํ ์, ๋น์ด ์๋์ผ๋ก ์คํ๋๋ฉด์ 'Merge branch o2' ๋ผ๋ ์ปค๋ฐ ๋ฉ์์ง ๋ํ๋จ.
๋ธ๋์น๋ฅผ ๋ณํฉํ๋ฉด์ ๋ง๋ค์ด์ง ์ปค๋ฐ ๋ฉ์์ง, ์์ ํด๋ ๋๊ณ ๊ทธ๋๋ก ์จ๋ ๋จ (esc → :wq)
ls -al ๋ช ๋ น์ ์ฌ์ฉํด ํ์ธํด๋ณด๋ฉด o2 ๋ธ๋์น์ ์๋ o2.txt ํ์ผ์ด main ๋ธ๋์น์ ํฉ์ณ์ง ๊ฒ์ ํ์ธํ ์ ์์
git log ๋ช ๋ น์ผ๋ก ํ์ธํด๋ณด๋ฉด
o2 work 2 ์ปค๋ฐ์ด main ๋ธ๋์น์ ๋ณํฉ๋๋ฉด์ 'Merge branch o2' ๋ผ๋ ์ปค๋ฐ์ด ์๋ก ์๊น.
** ๋นจ๋ฆฌ ๊ฐ๊ธฐ ๋ณํฉ (fast-forward merge)
main ๋ธ๋์น์์ ๋ธ๋์น๋ฅผ ๋ถ๊ธฐํ ํ์ main ๋ธ๋์น์ ์๋ฌด ๋ณํ๊ฐ ์๋ค๋ฉด (์๋ก์ด ์ปค๋ฐ ๋ง๋ค์ง ์์๋ค๋ฉด)
๋ถ๊ธฐํ ๋ธ๋์น์์ ๋ง๋ ์ต์ ์ปค๋ฐ์ main ๋ธ๋์น๊ฐ ๊ฐ๋ฆฌํค๊ฒ๋ง ํ๋ฉด ๋จ (git merge)
git merge ๋ช ๋ น์ผ๋ก ๋จ์ํ ํฌ์ธํฐ๋ง ์์ง์ธ ๊ฒ์ผ๋ก ์ปค๋ฐ ๋ฉ์์ง ์ฐฝ ์ด๋ฆฌ์ง ์์
์๋ก ๋ค๋ฅธ ๋ธ๋์น์์ ํ ๋ฌธ์์ ๋ค๋ฅธ ๋ถ๋ถ์ ์์ ํ์ ๋ ๋ณํฉํ๊ธฐ
( ๊ฐ์ ๋ฌธ์์์ ์๋ก ๋ค๋ฅธ ๋ถ๋ถ์ ์์ ํ์ ๋ )
main ๋ธ๋์น์ o2 ๋ธ๋์น ์์ชฝ์์ work.txt ํ์ผ์ ์์ ํ์ง๋ง ๋ฌธ์ ์์ ์์ ์์น๋ ๋ค๋ฅธ ์ํฉ.
์ด ์ํฉ์์ ๋ณํฉํ๊ธฐ
$ git switch main # main ๋ธ๋์น๋ก ์ ํ (main ๋ธ๋์น์ ํฉ์น๊ธฐ ์ํด)
$ git merge o2 # o2 ๋ธ๋์น๋ฅผ main ๋ธ๋์น๋ก ๋๊ณ ์ด
$ cat work.txt # work.txt ํ์ผ ํ์ธ
main ๋ธ๋์น์ ์์ ๋ด์ฉ๊ณผ o2 ๋ธ๋์น์ ์์ ๋ด์ฉ์ด ํ๋์ ํ์ผ์ ํฉ์ณ์ง !
๊ฐ์ ๋ฌธ์๋ก ์๋ก ๋ค๋ฅธ ์์น๋ฅผ ์์ ํ์ ๊ฒฝ์ฐ ์๋์ผ๋ก ํฉ์ณ์ฃผ๋ ๊ธฐ๋ฅ์ด ์๋ค !
์๋ก ๋ค๋ฅธ ๋ธ๋์น์์ ํ ๋ฌธ์์ ๊ฐ์ ๋ถ๋ถ์ ์์ ํ์ ๋ ๋ณํฉํ๊ธฐ
๊น์์๋ ์ค ๋จ์๋ก ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ํ์ธํจ
์๋ก ๋ค๋ฅธ ๋ธ๋์น์์ ๊ฐ์ ๋ฌธ์์ ๊ฐ์ ์ค์ ์์ ํ์ ๊ฒฝ์ฐ,
๋ธ๋์น๋ฅผ ๋ณํฉํ๋ฉด ๋ธ๋์น ์ถฉ๋(conflict)์ด ๋ฐ์ํจ.
์ด๋ค ๊ฒฝ์ฐ์ ๋ธ๋์น ์ถฉ๋์ด ์๊ธฐ๋์ง & ์ถฉ๋์ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง
main ๋ธ๋์น์ o2 ๋ธ๋์น ์์ชฝ์์ work.txt ํ์ผ์ ์์ ์์น๊ฐ ๊ฐ์
git merge ๋ช ๋ น์ ์คํํ์ ๋์ฒ๋ผ ๋น์ด ์๋์ผ๋ก ์ด๋ฆฌ์ง ์๊ณ ๊ฒฝ๊ณ ๋ฉ์์ง ๋ํ๋จ.
work.txt๋ฅผ ์๋ ๋ณํฉํ๋ ๋์ ์ถฉ๋์ด ๋ฐ์ํ๋ค.
(๋ง์ผ ํ์ผ์ ์ฌ๋ฌ ๊ฐ ๋ณํฉํ๋ค๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ํ์ผ ์ธ์ ๋ค๋ฅธ ํ์ผ์ ์๋์ผ๋ก main ๋ธ๋์น์ ๋ณํฉ๋จ)
์ถฉ๋์ด ์๊ธด ๋ฌธ์๋ ์๋์ผ๋ก ๋ณํฉ๋ ์ ์์ผ๋ฏ๋ก
์ฌ์ฉ์๊ฐ ์ถฉ๋ ๋ถ๋ถ์ ์ง์ ํด๊ฒฐ ํ ์ปค๋ฐํด์ผ ํจ.
<<<<<<< HEAD์ ๊ฐ์ด๋ฐ ๊ฐ๋ก์ค(=======) ์ฌ์ด์ ๋ด์ฉ์ ํ์ฌ ๋ธ๋์น์ธ main ๋ธ๋์น์์ ์์ ํ ๋ด์ฉ
๊ฐ๋ก์ค(=======)๊ณผ >>>>>>> o2 ์ฌ์ด์ ๋ด์ฉ์ o2 ๋ธ๋์น์์ ์์ ํ ๋ด์ฉ
⇒ ์์ชฝ ๋ธ๋์น์ ๋ด์ฉ์ ์ฐธ๊ณ ํ๋ฉด์ ๋ด์ฉ์ ์ง์ ์์ ํด์ผ ํจ!
์ํ๋ ํํ๋ก ๋ด์ฉ ์์ ํ๊ณ , ์์ ๋๋๋ฉด ๋ฌธ์์ ์๋ <<<<<<< HEAD, >>>>>>> o2, ======= ์ญ์ ํ๊ณ ,
๋ฌธ์ ์ ์ฅ ํ ํธ์ง๊ธฐ ์ข ๋ฃ
์ดํ ์์ ํ work.txt๋ฅผ ์คํ ์ด์ง์ ์ฌ๋ฆฌ๊ณ ์ปค๋ฐํ๋ฉด ๋ !
** ๋ณํฉ ๋ฐ ์ถฉ๋ ํด๊ฒฐ ํ๋ก๊ทธ๋จ
ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ํด์๋ก ๋ธ๋์น๊ฐ ๋ง์ผ๋ฏ๋ก ๋ธ๋์น์์ ๋ณํฉํ ํ์ผ๋ ๋ง์์ง๋ฏ๋ก ๊ทธ๋งํผ ์ถฉ๋๋ ๋ง์์ง
๊ทธ๋์ ๊น์ ๋ธ๋์น ๋ณํฉ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๊ณ ์ถฉ๋์ ํด๊ฒฐํด ์ฃผ๋ ํ๋ก๊ทธ๋จ์ด ๋ง๋ค.
๋ณํฉ ์๊ณ ๋ฆฌ์ฆ์๋ 2 way merge์ 3 way merge๊ฐ ์๋๋ฐ,
3 way merge๊ฐ ํจ์ฌ ํจ์จ์ ์ด๋ฏ๋ก ์ด๋ฅผ ์ง์ํ๋ ํ๋ก๊ทธ๋จ ์ ํํ๋ ๊ฒ ์ข๋ค.
P4Merge | ๋ฌด๋ฃ, ์ฌ์ฉ ํธ๋ฆฌ, ๋ณํฉ ๊ธฐ๋ฅ ์ข์ ๋จ์ถํค๋ฅผ ์ง์ํ์ง ์๋๋ค๋ ๋จ์ |
meld | ๋ฌด๋ฃ, ์คํ์์ค ํ์ผ ๋น๊ต ๋ฟ๋ง ์๋๋ผ ์ง์ ํธ์ง๋ ๊ฐ๋ฅ |
Kdiff3 | ๋ฌด๋ฃ, ์ฌ์ฉ ํธ๋ฆฌ, ๋ณํฉ ๊ธฐ๋ฅ ์ข์ ํ๊ธ ๊นจ์ ธ๋ณด์ผ ์ ์๋ค๋ ๋จ์ |
Araxis Merge | ์ ๋ฃ ์ฉ๋ ํฐ ํ์ผ์์ ์ ๋์ํจ |
๋ณํฉ ๋๋ ๋ธ๋์น ์ญ์
๋ธ๋์น๋ฅผ ๋ณํฉํ ํ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ ๋ธ๋์น๋ ๊น์์ ์ญ์
๋จ, ๋ธ๋์น๋ฅผ ์ญ์ ํ๋๋ผ๋ ์์ ํ ์ง์์ง๋ ๊ฒ์ ์๋๋ฉฐ, ๊ฐ์ ์ด๋ฆ์ ๋ธ๋์น๋ฅผ ๋ง๋ค๋ฉด ์์ ๋ด์ฉ ๋ค์ ๋ณผ ์ ์์
$ git branch # ํ์ฌ ์ ์ฅ์์ ์ด๋ค ๋ธ๋์น ์๋์ง ํ์ธ
$ git switch main # ๋ธ๋์น๋ฅผ ์ญ์ ํ๊ธฐ ์ํด main์ผ๋ก ์ด๋
$ git branch -d o2 # o2 ๋ธ๋์น ์ญ์
$ git branch # ๋ธ๋์น ์ญ์ ๋์๋์ง ํ์ธ
์ ์ฅ์์ ๊ธฐ๋ณธ ๋ธ๋์น๋ main์ด๋ฏ๋ก ๋ธ๋์น๋ฅผ ์ญ์ ํ๋ ค๋ฉด main ๋ธ๋์น์์ ํด์ผ ํจ.
๋ธ๋์น ์ญ์ 'delete'
git branch -d ๋ธ๋์น-์ด๋ฆ
git branch -D ๋ธ๋์น-์ด๋ฆ : main ๋ธ๋์น์ ๋ณํฉํ์ง ์์ ๋ธ๋์น๋ ๊ฐ์ ๋ก ์ญ์
์ญ์ ํ ๋ธ๋์น์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ๋ค์ ๋ธ๋์น๋ฅผ ๋ง๋ค๋ฉด ์์ ์์ ๋ด์ฉ ๊ทธ๋๋ก ๋ํ๋จ
์ฆ, ๋ธ๋์น ์ญ์ ๋ ์ ์ฅ์์์ ์์ ํ ์์ ๋ ๊ฒ ์๋๋ผ, ๊น์ ํ๋ฆ ์์์ ๊ฐ์ถ๋ ๊ฒ!
cherry-pick์ผ๋ก ๋ณํฉํ๊ธฐ
'cherry-pick' ๋ ํ๋์ ๋ณํฉ ๋ฐฉ๋ฒ
main ๋ธ๋์น์ topic ๋ธ๋์น๋ฅผ ํฉ์น๊ธด ํ๋๋ฐ,
๋ธ๋์น ์ ์ฒด๊ฐ ์๋๋ผ topic ๋ธ๋์น ์ค ํน์ ๋ฒ์ ์ ๋ณ๊ฒฝ ๋ด์ฉ๋ง ํฉ์น๋ ค๊ณ ํ ๋ ์ฌ์ฉ.
topic ๋ธ๋์น์ ์๋ ๋ค๋ฅธ ๋ฒ์ ๋ค์ ํฉ์ณ์ง์ง ์์
ํฐ๋ฏธ๋์์๋ ์ธ๋ฏธ์ฝ๋ก (;)์ผ๋ก ๊ตฌ๋ถํด์ ์ฌ๋ฌ ๊ฐ์ ๋ช ๋ น ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ ์ ์์
touch : ๋น ํ์ผ์ ๋ง๋ฆ
$ touch init.txt; git add init txt; git commit -m "init"
// init.txt ํ์ผ ๋ง๋ฆ ; ์คํ
์ด์ง ; ์ปค๋ฐ
git log --all ์ต์ : ์ต์ ์ปค๋ฐ ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์ปค๋ฐ์ ๋ค ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ์ต์
$ git branch topic
$ git log --oneline --all --graph
$ touch m1; git add m1; git commit -m "m1"
$ touch m2; git add m2; git commit -m "m2"
$ git log --oneline --all --graph
$ git switch topic
$ touch t1; git add t1; git commit -m "t1"
$ touch t2; git add t2; git commit -m "t2"
$ touch t3; git add t3; git commit -m "t3"
$ git log --oneline --all --graph
ํ์ฌ 2๊ฐ์ ๋ธ๋์น๊ฐ ์๋๋ฐ,
topic ๋ธ๋์น์ t2 ๋ฒ์ ์์ ์ ์ฉํ๋ ๋ด์ฉ์ main ๋ธ๋์น์๋ ์ ์ฉํ๊ณ ์ถ์ ๋
์ฌ์ฉํ๋ ๊ฒ์ด cherry-pick.
topic ๋ธ๋์น์ ์ฌ๋ฌ ๋ฒ์ ์ค ํ๋๋ฅผ ๊ณจ๋ผ์์ ๋ณํฉ
$ git switch main
$ git cherry-pick 0000000
์ฐ์ ๋ณํฉ๋ ๋ธ๋์น์ธ main ๋ธ๋์น๋ก ์ ํ.
$ git cherry-pick ์ฒด๋ฆฌํฝํ -ํด์
main ๋ธ๋์น์ ์ด๋ค ํ์ผ์ด ์๋์ง ํ์ธํ๊ณ
๊น ๋ก๊ทธ ํ์ธ
topic ๋ธ๋์น์์ t2๊ฐ ์๊ณ , main ๋ธ๋์น์๋ t2๊ฐ ์ถ๊ฐ๋จ