ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Git Hub 사용법] branch scenario
    Git/Github 2022. 7. 22. 16:54
    728x90
    반응형

    목차

      branch scenario

      Branch 사용법

      브랜치를 조작할 떄는 반드시 master 브랜치의 최소 1개의 커밋은 있어야한다.

       

      # git 초기화 및 commit 남겨놓기
      
      $ git init
      $ touch a.txt 
      # a.txt text 1이라는 글을 작성한다.
      
      $ git add .
      $ git commit -m "text 1"
      [master (root-commit) 76526b0] text 1
       1 file changed, 1 insertion(+)
       create mode 100644 a.txt
      # 3개의 커밋을 더 남긴다.
      $ git log --oneline
      e7e679d (HEAD -> master) text 3
      34eb48c text 2
      76526b0 text 1

       

      HEAD

      https://stackoverflow.com/questions/2304087/what-is-head-in-git

       

      What is HEAD in Git?

      You see the Git documentation saying things like The branch must be fully merged in HEAD. But what is Git HEAD exactly?

      stackoverflow.com

      • 현재 위치한 브랜치의 최신 커밋
      • HEAD는 현재 브랜치를 가리키는 포인터

      이제 우리는 로그인 기능을 개발합니다.

      $ git branch feature/login
      $ git branch
        feature/login
      * master

      master 브랜치에서 마지막 줄 추가

      text 1
      text 2
      text 3
      master에서 작성한 text 4 # 추가
      
      # add, commit
      $ git add .
      $ git commit -m "master text 4"
      [master bde4505] master text 4
       1 file changed, 2 insertions(+), 1 deletion(-)
       
       # log
      $ git log --oneline
      bde4505 (HEAD -> master) master text 4
      e7e679d (feature/login) text 3
      34eb48c text 2
      76526b0 text 1

       

      브랜치 이동을 하고 a.txt를 확인해보자

      $ git checkout feature/login 
      Switched to branch 'feature/login'
      
      # master text 4가 사라짐
      
      # log 확인
      $ git log --oneline
      e7e679d (HEAD -> feature/login) text 3
      34eb48c text 2
      76526b0 text 1
      # 현재 브랜치는 feature/login
      
      text 1
      text 2
      text 3
      login text 4 # 추가

       

      브랜치를 다룰 때는 현재 내가 '어떤'브랜치에 있는지를 반드시 알아야한다.

      # login.txt
      
      login text 4 # 추가
      $ git status
      On branch feature/login
      Changes not staged for commit:
        (use "git add <file>..." to update what will be committed)
        (use "git restore <file>..." to discard changes in 
      working directory)
              modified:   a.txt  # WD + commit 이력 있음(modified)
      
      Untracked files:
        (use "git add <file>..." to include in what will be committed)
              login.txt # WD + commit 이력 없음(git이 지금까지 한번도 추적한적 없음)
      
      no changes added to commit (use "git add" and/or "git commit -a")
      
      # add, commit
      $ git add .
      $ git commit -m "login text4"
      [feature/login 5a98d3e] login text4
       2 files changed, 3 insertions(+), 1 deletion(-)
       create mode 100644 login.txt
      
      # 현재 브랜치는? feature/login
      $ git log --oneline
      5a98d3e (HEAD -> feature/login) login text4
      e7e679d text 3
      34eb48c text 2
      76526b0 text 1
      
      # 다른 브랜치의 그래프까지 보는 방법
      $ git log --all --graph --oneline
      * 5a98d3e (HEAD -> feature/login) login text4        
      | * bde4505 (master) master text 4
      |/
      * e7e679d text 3
      * 34eb48c text 2
      * 76526b0 text 1

       

      Branch merge scenario

      # 바탕 화면에 git-merge 폴더 생성 후 해당 폴더에서 vs code를 열자!
      
      $ git init
      Initialized empty Git repository in C:/Users/xxxxx/Desktop/git-merge/.git/
      $ touch test.txt
      
      # test.txt에 master test 1이라고 채워넣기 (저장 꼭!!)
      
      $ git status
      On branch master
      
      No commits yet
      
      Untracked files:
        (use "git add <file>..." to include in what will be committed)
              test.txt
      
      nothing added to commit but untracked files present (use "git add" to track)
      
      $ git add .
      $ git commit -m "master test 1"
      [master (root-commit) 3cd9906] master test 1
       1 file changed, 1 insertion(+)
       create mode 100644 test.txt
       
      # log
      $ git log
      commit 3cd9906376e433d324e57f92387c8b71727351c7 (HEAD -> master)
      Author: Owen <xxxxx@gmail.com>
      Date:   Fri Jul 22 16:27:09 2022 +0900
      
          master test 1

      3가지 병합 상황

      Fast-forward

      • 주의 사항, 반드시 master 브랜치에는 1개 이상의 커밋이 존재해야한다.

      "다른 브랜치가 생성된 이후에 master 브랜치의 변경 사항이 없는 상황 = >  단순하게 master 브랜치의 포인터를 최신 commit으로 이동 시킨다."

       

      master 브랜치에서 feature/login 브랜치를 병합(merge) 할 때 feature/login 브랜치가 master 브랜치 이후의 commit을 가리키고 있다면 master 브랜치는 feature/login 브랜치가 가리키고 있는 최신 commit으로 포인터(HEAD)를 이동 시키면 된다.

       

      1. feature/login 브랜치 생성 후 이동

      $ git checkout -b feature/login
      Switched to a new branch 'feature/login'

      2. 특정한 작업을 완료하고 commit 진행

      $ touch login.txt
      $ git add .
      $ git commit -m "login test 1"
      [feature/login 2fff2ab] login test 1
       1 file changed, 0 insertions(+), 0 deletions(-)
       create mode 100644 login.txt
      
      # log
      $ git log --oneline
      # master 브랜치에서 feature/login 브랜치 생성 -> feature/login 브랜치에서 새로운 commit 생성
      2fff2ab (HEAD -> feature/login) login test 1
      3cd9906 (master) master test 1

      3. master 브랜치로 이동

      • 브랜치를 이동하는 순간 login.txt 파일이 사라진다.
      • 왜냐하면 login.txt파일은 master 브랜치가 아니라 feature/login 브랜치에서 commit(버전)을 했기 때문임
      $ git checkout master
      Switched to branch 'master'

      4. master 브랜치에 feature/login 브랜치에서 작업한 결과물 병합

      • 병합 이후에  login.txt 파일이 생김
      $ git merge feature/login 
      Updating 3cd9906..2fff2ab
      Fast-forward
       login.txt | 0
       1 file changed, 0 insertions(+), 0 deletions(-)
       create mode 100644 login.txt

      5. 로그 확인

      • HEAD -> master가 위로 올라왔음.
      # 병합 전
      $ git log --oneline
      # master 브랜치에서 feature/login 브랜치 생성 -> feature/login 브랜치에서 새로운 commit 생성
      2fff2ab (HEAD -> feature/login) login test 1
      3cd9906 (master) master test 1
      
      # 병합 후 
      $ git log --oneline
      2fff2ab (HEAD -> master, feature/login) login test 1 
      3cd9906 master test 1

      6. 브랜치 삭제

      $ git branch -d feature/login 
      Deleted branch feature/login (was 2fff2ab).
      
      # 확인
      $ git branch
      * master
      
      $ git log --oneline
      2fff2ab (HEAD -> master) login test 1
      3cd9906 master test 1

      Merge commit -> conflict x

      다른 브랜치(feature/signup)가 생성된 이후에 master 브랜치에 변경 사항이 있고 feature/signup 브랜치에도 변경 사항이 존재하는 경우 -> 이때 충돌 상황이 발생하지 않는 경우

      • 다른 파일의 변경 사항을 작성(수정) commit한 경우
      • Merge commit 이 발생함
        • 이 commit 내역은 우리가 직접 작성한 commit이 아닌 git이 자동으로 작성해준 commit message
      • 충돌이 발생하지 않는 이유는 다른 파일(같은 파일이라도 다른 라인을 수정한 경우 포함)이기 때문에 단순하게 합치기만 하면 되기 때문이다.

      1. signup 브랜치 생성 & 이동

      $ git checkout -b feature/signup
      Switched to a new branch 'feature/signup'

      2. 특정한 작업을 진행하고 commit

      $ touch signup.txt
      
      # add, commit
      $ git add .
      $ git commit -m "signup test 1"
      [feature/signup 513dd9f] signup test 1
       1 file changed, 0 insertions(+), 0 deletions(-)
       create mode 100644 signup.txt
       
      # log
      $ git log --oneline
      513dd9f (HEAD -> feature/signup) signup test 1  # feature/signup 브랜치의 최신 커밋 + 현재 내가 위치한 브랜치
      2fff2ab (master) login test 1 # master 브랜치의 최신 커밋
      3cd9906 master test 1

      3. master로 이동

      • 이동하는 순간 signup.txt 파일이 사라짐
      • signup 브랜치에서 파일을 생성하고 commit 했기 때문
      $ git checkout master
      Switched to branch 'master'
      
      $ git log --oneline
      2fff2ab (HEAD -> master) login test 1
      3cd9906 master test 1

      4. master 브랜치에서 추가 작업을 진행한 다음 commit

      $ touch master.txt
      
      # add, commit
      $ git add .
      $ git commit -m "master test 1"
      [master 8f0a66f] master test 1
       1 file changed, 0 insertions(+), 0 deletions(-)
       create mode 100644 master.txt
       
      # log 
      $ git log --oneline
      8f0a66f (HEAD -> master) master test 1
      2fff2ab login test 1
      3cd9906 master test 1
      
      $ git log --all --oneline
      8f0a66f (HEAD -> master) master test 1
      513dd9f (feature/signup) signup test 1
      2fff2ab login test 1
      3cd9906 master test 1

      5. master 브랜치에 병합

      • merge를 진행하고나서 확인해보니 signup.txt가 생기는 걸 확인할 수 있음
      $ git merge feature/signup 
      Merge made by the 'recursive' strategy.
       signup.txt | 0
       1 file changed, 0 insertions(+), 0 deletions(-)
       create mode 100644 signup.txt
       
      # log
      $ git log --oneline
      25392f4 (HEAD -> master) Merge branch 'feature/signup' # 우리가 직접 입력한 commit x -> Merge commit
      8f0a66f master test 1
      513dd9f (feature/signup) signup test 1
      2fff2ab login test 1
      3cd9906 master test 1

      6. log

      $ git log --all --graph --oneline
      *   25392f4 (HEAD -> master) Merge branch 'feature/signup'
      |\
      | * 513dd9f (feature/signup) signup test 1
      * | 8f0a66f master test 1
      |/
      * 2fff2ab login test 1
      * 3cd9906 master test 1

      7. branch 삭제

      $ git branch -d feature/signup 
      Deleted branch feature/signup (was 513dd9f).
      
      $ git log --all --graph --oneline
      *   25392f4 (HEAD -> master) Merge branch 'feature/signup'
      |\
      | * 513dd9f signup test 1
      * | 8f0a66f master test 1
      |/
      * 2fff2ab login test 1
      * 3cd9906 master test 1

      Merge commit -> conflict o

      다른 브랜치(feature/signup)가 생성된 이후에 master 브랜치에 변경 사항이 있고 feature/signup 브랜치에도 변경 사항이 존재하는 경우 -> 이때 충돌 상황이 발생하는 경우

      • 같은 파일의 같은 부분을 작성(수정)하여 commit한 경우
      • Merge commit이 발생함
        • 이 commit 내역은 우리가 직접 작성한 commit이 아닌 git이 자동으로 작성해준 commit message
      • 충돌이 발생하는 이유는 같은 파일의 같은 부분을 수정했기 때문에 어떤 버전으로 만들지 git은 알 수 없기 때문이다.
      • 그래서 직접 사람이 수정해줘야 한다.

      1. hotfix 브랜치 생성 후 이동

      $ git checkout -b hotfix
      Switched to a new branch 'hotfix'

      2. 특정 작업 완료 후 & commit 진행

      # hotfix branch의 test.txt
      master test 1
      이건 hotfix 브랜치에서 # 추가
      수정했습니다.
      $ git add .
      $ git commit -m "hotfix test 1"
      [hotfix a094f24] hotfix test 1
       1 file changed, 3 insertions(+), 1 deletion(-)
       
      $ git log --oneline
      a094f24 (HEAD -> hotfix) hotfix test 1
      25392f4 (master) Merge branch 'feature/signup'       
      8f0a66f master test 1
      513dd9f signup test 1
      2fff2ab login test 1
      3cd9906 master test 1

      3. master로 이동

      $ git checkout master
      Switched to branch 'master'

      4. 특정 작업 후 commit

      • hotfix 브랜치에서 작업한 부분과 동일한 부분을 수정
      # master branch의 test.txt
      master test 1
      이건 master 브랜치에서 # 추가
      수정한 내용입니다.
      $ git add .
      $ git commit -m "master test 1"
      [master fb44eef] master test 1
       1 file changed, 3 insertions(+), 1 deletion(-)
       
      # log
      $ git log --oneline
      fb44eef (HEAD -> master) master test 1
      25392f4 Merge branch 'feature/signup'
      8f0a66f master test 1
      513dd9f signup test 1
      2fff2ab login test 1
      3cd9906 master test 1

      5. Merge

      $ git merge hotfix 
      Auto-merging test.txt
      CONFLICT (content): Merge conflict in test.txt # 충돌.. -> merge 하는 과정에서 충돌이 발생함 -> test.txt
      
      # 자동으로 병합하는 것 실패!! -> 충돌을 해결하고 난 다음에 그 결과를 commit 하셈
      Automatic merge failed; fix conflicts and then commit the result.

      같은 부분(라인)을 다른 브랜치에서 각각 수정하고 commit 했기 때문에 병합하는 과정에서 git은 어떤 부분을 합쳐야 하는지 알 수 없음 -> 그래서 우리가 직접 합치고 나서 merge commit을 발생 시켜야 합니다.

       

      master test 1
      <<<<<<< HEAD
      이건 master 브랜치에서 
      수정한 내용입니다.
      =======
      이건 hotfix 브랜치에서
      수정했습니다.
      >>>>>>> hotfix
      # 수정
      master test 1
      이건 master 브랜치에서 
      수정한 내용입니다.
      이건 hotfix 브랜치에서
      수정했습니다.
      xxxxx@DESKTOP-30KI4HL xxx ~/Desktop/git-merge (master|MERGING) 
      # master | MERGING -> Merge commit을 남겨야 함
      
      $ git status
      On branch master
      You have unmerged paths.
        (fix conflicts and run "git commit")        
        (use "git merge --abort" to abort the merge)
      
      Unmerged paths:
        (use "git add <file>..." to mark resolution)
              both modified:   test.txt # both modifed 
      
      no changes added to commit (use "git add" and/or "git commit -a")
      
      # add로 올리고 commit으로 Merge commit을 직접 남긴다.
      $ git add .
      $ git commit -m "충돌 해결!!!"
      git commit -m "충돌 해결git add .!"
      [master 35a5e9b] 충돌 해결git add .!

      6. log 확인

      • 충돌이 발생하지 않은 경우에는 25392f4 (HEAD -> master) Merge branch 'feature/signup' 이러한 commit을 git이 자동으로 만들어주지만 충돌을 직접 해결하는 경우 우리가 충돌을 해결했다는 의미의 커밋을 직접 남길 수 있다.
      $ git log --oneline
      35a5e9b (HEAD -> master) 충돌 해결git add .!
      fb44eef master test 1
      a094f24 (hotfix) hotfix test 1
      25392f4 Merge branch 'feature/signup'
      8f0a66f master test 1
      513dd9f signup test 1
      2fff2ab login test 1
      3cd9906 master test 1

      7. branch 삭제

      $ git branch -d hotfix 
      Deleted branch hotfix (was a094f24).
      
      # log
      $ git log --all --oneline --graph
      *   35a5e9b (HEAD -> master) 충돌 해결git add .!
      |\
      | * a094f24 hotfix test 1
      * | fb44eef master test 1
      |/
      *   25392f4 Merge branch 'feature/signup'       
      |\
      | * 513dd9f signup test 1
      * | 8f0a66f master test 1
      |/
      * 2fff2ab login test 1
      * 3cd9906 master test 1
      반응형

      'Git > Github' 카테고리의 다른 글

      [Git Hub] 깃허브, DS_Store 개념 및 삭제 방법  (0) 2022.10.06
      [Git hub 사용법] branch command  (0) 2022.07.19
      [Git hub 사용법] Push Error  (0) 2022.07.19
      [Git Hub 사용법] gitignore  (0) 2022.07.19
      [GitHub 사용법] pull & clone  (0) 2022.07.18

      댓글

    Designed by Tistory.