git(5) - merge๐Ÿค


merge?

merge๋Š” branch๋กœ ๋ถ„๊ธฐ๋œ ๊ฐ commit์„ ํ•˜๋‚˜๋กœ ๋‹ค์‹œ ํ•ฉ์น˜๊ณ ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค.


1. ๋ช…๋ น์–ด

  1. branch ๋ณ‘ํ•ฉ

    • master์— merge๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉด branch๋ฅผ ์‚ญ์ œํ•ด๋„ ๋œ๋‹ค.
    (master) $ git merge {branch name}
    (master) $ git merge example 
    


  2. merge ์ทจ์†Œ

    (master) $ git merge --abort 
    


  3. ๋ณ‘ํ•ฉํ•˜๋ฉด์„œ ํ•ด๋‹น branch๋Š” ๊ธฐ๋ก์„ ๋‚จ๊ธฐ๊ณ  ์‹ถ์„๋•Œ

    (master) $ git merge --no-ff
    


  4. branch ํ™•์ธ

    $ git branch --merged # ํ˜„์žฌ ๋ธŒ๋žœ์น˜์— ๋จธ์ง€๊ฐ€ ๋œ ๋ธŒ๋žœ์น˜ ํ™•์ธ
    $ git branch --no-merged # ๋งˆ์Šคํ„ฐ ๋ธŒ๋Ÿฐ์น˜์—์„œ ํŒŒ์ƒ๋œ ๋ธŒ๋žœ์น˜ ํ•™์ธ
    


2. branch ๋ณ‘ํ•ฉ ์‹œ๋‚˜๋ฆฌ์˜ค

branch ๊ด€๋ จ๋œ ๋ช…๋ น์–ด๋Š” ๊ฐ„๋‹จํ•˜๋‹ค.

๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค ์†์—์„œ ์–ด๋–ค ์ƒํ™ฉ์ธ์ง€ ํŒŒ์•…ํ•˜๊ณ  ์ž์œ ๋กญ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.


์ƒํ™ฉ 1. fast-foward

fast-foward ๋ž€ ๋ฟŒ๋ฆฌ๊ฐ€ ๋˜๋Š” master๋ธŒ๋žœ์น˜์— ๋ณ€ํ™”๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์€ ์ฑ„ ๋‹ค๋ฅธ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธด ๋ธŒ๋žœ์น˜๋กœ ๋จธ์ง€๋ฅผ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ.

์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  HEAD์˜ ์œ„์น˜๋งŒ ๋ณ€ํ•œ ์ฑ„ ๋จธ์ง€๋ฅผ ํ•œ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์— master ๋ธŒ๋žœ์น˜๊ฐ€ ์ž๋ฆฌ์žก๊ฒŒ ๋œ๋‹ค.


d7afaf1 (HEAD -> master) add README # ์˜ˆ์‹œ

๋‚ด๊ฐ€ ์ด๋™ํ•œ Commit์˜ ์ •๋ณด๋ฅผ ํ‘œ์‹œ, ์œ„ ์˜ˆ์‹œ๋Š” master์— ์œ„์น˜ํ•ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.


  1. feature/home branch ์ƒ์„ฑ ๋ฐ ์ด๋™

    (master) $ git branch feature/home
    (master) $ git checkout feature/home
    


  2. ์ž‘์—… ์™„๋ฃŒ ํ›„ commit

    (feature/home) $ touch home.txt
    (feature/home) $ git add .
    (feature/home) $ git commit -m 'Add home.txt'
    (feature/home) $ git log --oneline
    b534a34 (HEAD -> feature/home) Complete Home!!!!
    e89616a (master) Init
    


  3. master ์ด๋™

    (feature/home) $ git checkout master
    (master) $ git log --oneline
    


  4. master์— ๋ณ‘ํ•ฉ

    (master) $ git merge feature/home 
    Updating e89616a..b534a34
    Fast-forward
     home.txt | 0
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 home.txt
    


  5. ๊ฒฐ๊ณผ : fast-foward

    (master) $ git log --oneline
    b534a34 (HEAD -> master, feature/home) Complete Home!!!!
    e89616a Init
    


  6. branch ์‚ญ์ œ

    (master) $ git branch -d feature/home 
    Deleted branch feature/home (was b534a34).
    



์ƒํ™ฉ 2. merge commit

์„œ๋กœ ๋‹ค๋ฅธ ์ด๋ ฅ(commit)์„ ๋ณ‘ํ•ฉ(merge)ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋‹ค๋ฅธ ํŒŒ์ผ์ด ์ˆ˜์ •๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ

git์ด auto merging์„ ์ง„ํ–‰ํ•˜๊ณ , commit์ด ๋ฐœ์ƒ๋œ๋‹ค.

  1. feature/about branch ์ƒ์„ฑ ๋ฐ ์ด๋™

    (master) $ git checkout -b feature/about
    (feature/about) $
    


  2. ์ž‘์—… ์™„๋ฃŒ ํ›„ commit

    (feature/about) $ touch about.txt
    (feature/about) $ git add .
    (feature/about) $ git commit -m 'Add about.txt'
    (feature/about) $ git log --oneline
    5e1f6de (HEAD -> feature/about) ์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€ ์™„๋ฃŒ!
    b534a34 (master) Complete Home!!!!
    e89616a Init
    


  3. master ์ด๋™

    (feature/about) $ git checkout master
    (master) $
    


  4. master์— ์ถ”๊ฐ€ commit์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

    • ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ˆ˜์ • ํ˜น์€ ์ƒ์„ฑํ• ๊ฒƒ.
    (master) $ touch master.txt
    (master) $ git add .
    (master) $ git commit -m 'Add master.txt'
    (master) $ git log --oneline
    98c5528 (HEAD -> master) ๋งˆ์Šคํ„ฐ ์ž‘์—…....
    b534a34 Complete Home!!!!
    e89616a Init
    


  5. master์— ๋ณ‘ํ•ฉ

    (master) $ git merge feature/about
    


  6. ๊ฒฐ๊ณผ -> ์ž๋™์œผ๋กœ merge commit ๋ฐœ์ƒ


  7. ์ปค๋ฐ‹ ๋ฐ ๊ทธ๋ž˜ํ”„ ํ™•์ธํ•˜๊ธฐ

    $ git log --oneline --graph
    *   582902d (HEAD -> master) Merge branch 'feature/about'
    |\
    | * 5e1f6de (feature/about) ์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€ ์™„๋ฃŒ!
    * | 98c5528 ๋งˆ์Šคํ„ฐ ์ž‘์—…....
    |/
    * b534a34 Complete Home!!!!
    * e89616a Init
    


  8. branch ์‚ญ์ œ

    $ git branch -d feature/about 
    Deleted branch feature/about (was 5e1f6de).
    

์ƒํ™ฉ 3. merge commit ์ถฉ๋Œ

์„œ๋กœ ๋‹ค๋ฅธ ์ด๋ ฅ(commit)์„ ๋ณ‘ํ•ฉ(merge)ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ™์€ ํŒŒ์ผ์˜ ๋™์ผํ•œ ๋ถ€๋ถ„์ด ์ˆ˜์ •๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ

git์ด auto merging์„ ํ•˜์ง€ ๋ชปํ•˜๊ณ , ์ถฉ๋Œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋œฌ๋‹ค.

ํ•ด๋‹น ํŒŒ์ผ์˜ ์œ„์น˜์— ํ‘œ์ค€ํ˜•์‹์— ๋”ฐ๋ผ ํ‘œ์‹œ ํ•ด์ค€๋‹ค.

์›ํ•˜๋Š” ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์ˆ˜์ •์„ ํ•˜๊ณ  ์ง์ ‘ commit์„ ๋ฐœ์ƒ ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

  1. feature/test branch ์ƒ์„ฑ ๋ฐ ์ด๋™

    (master) $ git checkout -b feature/test
    


  2. ์ž‘์—… ์™„๋ฃŒ ํ›„ commit

    # README.md ํŒŒ์ผ ์—ด์–ด์„œ ์ˆ˜์ •
    (feature/test) $ touch test.txt
    (feature/test) $ git add .
    (feature/test) $ git commit -m 'Add test.txt'
    (feature/test) $ git log --oneline
    95fad1c (HEAD -> feature/test) README ์ˆ˜์ •ํ•˜๊ณ  test ์ž‘์„ฑํ•˜๊ณ 
    582902d (master) Merge branch 'feature/about'
    98c5528 ๋งˆ์Šคํ„ฐ ์ž‘์—…....
    5e1f6de ์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€ ์™„๋ฃŒ!
    b534a34 Complete Home!!!!
    e89616a Init
    


  3. master ์ด๋™

    $ git checkout master
    


  4. master์— ์ถ”๊ฐ€ commit์„ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ

    • ๋™์ผ ํŒŒ์ผ์„ ์ˆ˜์ • ํ˜น์€ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค.
    # README.md ํŒŒ์ผ ์—ด์–ด์„œ ์ˆ˜์ •
    (master) $ git add README.md
    (master) $ git commit -m 'Update README.md'
    


  5. master์— ๋ณ‘ํ•ฉ

    (master) $ git merge feature/test 
    Auto-merging README.md
    CONFLICT (content): Merge conflict in README.md
    Automatic merge failed; fix conflicts and then commit the result.
    


  6. ๊ฒฐ๊ณผ -> merge conflict๋ฐœ์ƒ

    git status ๋ช…๋ น์–ด๋กœ ์ถฉ๋Œ ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.

    (master|MERGING) $ git status
    On branch master
    You have unmerged paths.
      (fix conflicts and run "git commit")        
      (use "git merge --abort" to abort the merge)
       
    Changes to be committed:
            new file:   test-1.txt
            new file:   test-2.txt
            new file:   test.txt
       
    Unmerged paths:
      (use "git add <file>..." to mark resolution)
            both modified:   README.md
    


  7. ์ถฉ๋Œ ํ™•์ธ ๋ฐ ํ•ด๊ฒฐ

    <<<<<<< HEAD
    # ๋งˆ์Šคํ„ฐ์—์„œ ์ž‘์—…ํ•จ...
    =======
    # ํ…Œ์ŠคํŠธ์—์„œ ์ž‘์„ฑ
    >>>>>>> feature/test
    


  8. merge commit ์ง„ํ–‰

    (master|MERGING) $ git add .
    (master|MERGING) $ git commit
    
    • vim ํŽธ์ง‘๊ธฐ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

      • ์ž๋™์œผ๋กœ ์ž‘์„ฑ๋œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , esc๋ฅผ ๋ˆ„๋ฅธ ํ›„ :wq๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ €์žฅ ๋ฐ ์ข…๋ฃŒ.
      • w : write
      • q : quit
    • vs code ํŽธ์ง‘๊ธฐ์—์„œ ๋ฉ”์‹œ์ง€๋ณด๊ณ  ๋‹ซ์„๊ฒƒ.


  9. ์ปค๋ฐ‹ ๋ฐ ํ™•์ธํ•˜๊ธฐ

    (master) $ git log --oneline --graph
    *   bc1c0cd (HEAD -> master) Merge branch 'feature/test'
    |\  
    | * 95fad1c (feature/test) README ์ˆ˜์ •ํ•˜๊ณ  test ์ž‘์„ฑํ•˜๊ณ 
    * | 2ecad28 ๋ฆฌ๋“œ๋ฏธ ์ˆ˜์ •
    |/  
    *   582902d Merge branch 'feature/about'
    |\  
    | * 5e1f6de ์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€ ์™„๋ฃŒ!
    * | 98c5528 ๋งˆ์Šคํ„ฐ ์ž‘์—…....
    |/  
    * b534a34 Complete Home!!!!
    * e89616a Init
    


  10. branch ์‚ญ์ œ

    (master) $ git branch -d feature/test
    


merge์— ๊ด€ํ•œ ์ฐธ๊ณ ํ•˜๊ธฐ ์ข‹์€ ์ž๋ฃŒ

https://otzslayer.github.io/git/2021/12/05/git-merge-fast-forward.html

๊ด€์‹ฌ์žˆ์„ ํฌ์ŠคํŒ