7 minute read

들어가기전에)

별첨) 다양한 브랜치 확인 명령어

# git branch  (로컬 브랜치 목록 조회)
C:\KBCard\bck-frontend>git branch
* master
  newbranch

# git branch -r  (원격 브랜치 목록 조회)
C:\KBCard\bck-frontend>git branch -r
  origin/master
  origin/newbranch

# git branch -a  (모든 브랜치 목록 조회)

C:\KBCard\bck-frontend>git branch
* master
  newbranch
  origin/master
  origin/newbranch
  

깃 브랜치 생성 및 조작방법

STEP1. 비주얼코드 깃 연동

(생략)

STEP2. AS-IS 나의 브랜치 확인

cd C:\KBCard\bck-frontend  # 깃 경로

# git branch  (로컬 브랜치 목록 조회)
git branch
* master
  

💡master 라는 브랜치가 하나 만들어짐.
💡master는 저장소를 만들면 기본적으로 생성되는 브랜치.

STEP3. 브랜치 생성

# 신규 브랜치 생성
git branch newbranch
git branch newbranch2

STEP4. 브랜치 확인

사진1

  • 기본 명령어

      # 신규 브랜치 확인
      git branch
      * master
        newbranch
        newbranch2
    
    

    💡브랜치 옆 * 표시는 현재 작업중인 브랜치.

  • 깃로그 명령어

      # 로그확인 (상세하게 확인하는 방법)
      git log
      commit 9662ff3806604ee6fa1b422e0fe698c78e3ec08d (HEAD -> master, newbranch, newbranch2)
      Author: TaeHo Choi <layup3@naver.com>
      Date:   Sun Jul 30 13:24:19 2023 +0900
    
      commit 21fe9197ecb4e2a36be1c3e8f7da2a3c3e324d82
      Author: TaeHo Choi <layup3@naver.com>
      Date:   Sun Jul 30 13:24:10 2023 +0900
    
      commit 4759017c060621644835058cb0dbff0bbfae72f9
    
    
      // 로그확인 (간단하게 확인하는 방법)
      git log --oneline
      9662ff3 (HEAD -> master, newbranch, newbranch2) 
      21fe919
      4759017 Initialize project using Create React App
    
    

    💡HEAD -> 가 가르키는 브랜치가 현재 작업중인 브랜치.
    💡git log –oneline 는 로그를 간략하게 보여주는 명령어. (커밋 로그를 한 줄씩 간략하게 출력)

STEP5. (master 브랜치) 신규건 생성/작업/커밋

  1. 첫번째

     vi /public/study-file1.txt
    
     # 입력 후 저장
     내용1 입니다.
    
    
     # 커밋
     git add .
     git commit -m '첫번째'      
     [master 5c97963] '첫번째'
    
    
     # 깃로그 확인
     git log --oneline
     5c97963 (HEAD -> master) '첫번째'
     cc6c583 (newbranch2)
     9662ff3 (newbranch)
     21fe919
     4759017 Initialize project using Create React App
    
    
  2. 두번째 커밋

     vi /public/study-file1.txt
    
     # 입력 후 저장
     내용1 입니다.
     내용2 입니다.
    
    
     # 커밋
     git add study-file1.txt
     git commit -m '두번째'
     [master 564be84] '두번째'
    
    
     # 깃로그 확인
     git log --oneline       
     564be84 (HEAD -> master) '두번째'
     5c97963 '첫번째'
     cc6c583 (newbranch2)
     9662ff3 (newbranch)
     21fe919
     4759017 Initialize project using Create React App
    
    
  3. 세번째 커밋

     vi /public/study-file1.txt
     
     # 입력 후 저장
     내용1 입니다.
     내용2 입니다.
     내용3 입니다.
    
    
     # 커밋
     git add study-file1.txt
     git commit -m '세번째'  
     [master 267a63b] '세번째'
    
    
     # 깃로그 확인
     git log --oneline       
     267a63b (HEAD -> master) '세번째'
     564be84 '두번째'
     5c97963 '첫번째'
     cc6c583 (newbranch2)
     9662ff3 (newbranch)
     21fe919
     4759017 Initialize project using Create React App
    
    

    💡현재 작업중인 브랜치는 master 이다.
    💡master는 커밋한 내용들을 가르킨다.
    💡나머지 newbranch, newbranch2는 뭐가 없다.

STEP6. (newbranch 브랜치) 신규건 생성/작업/커밋

우선 브랜치를 이동(변경) 한다.

git checkout newbranch

git branch
  master
* newbranch
  newbranch2

사진2

설정이 변경되니까 편집기에도 브랜치가 변경되었다.

  1. 첫번째

     vi /public/study-file1.txt
    
     파일이없다....
    
    

    파일이 없다.

    • 이전에 master 가 만든 study-file1.txt 파일이 없다.
    • 즉, master 브랜치가 만든 내용은 모두 없다.
     vi /public/study-file2.txt # 신규
    
     # 입력 후 저장
     내용1 입니다.
    
    
     # 커밋
     git add study-file2.txt
     git commit -m '첫번째(newbranch)'
     [newbranch e7d40d2] '첫번째(newbranch)'
      1 file changed, 1 insertion(+)
      create mode 100644 public/study-file2.txt
    
    
     # 깃로그 확인
     git log --oneline    
     e7d40d2 (HEAD -> newbranch) '첫번째(newbranch)'
     9662ff3
     21fe919
     4759017 Initialize project using Create React App
    
    
  2. 두번째

     vi /public/study-file2.txt
    
     # 입력 후 저장
     내용2 입니다.
    
    
     # 커밋
     git add study-file2.txt
     it commit -m '두번째(newbranch)'  
     [newbranch 934f18d] '두번째(newbranch)'
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    
     # 깃로그 확인
     git log --oneline       
     934f18d (HEAD -> newbranch) '두번째(newbranch)'
     e7d40d2 '첫번째(newbranch)'
     9662ff3
     21fe919
     4759017 Initialize project using Create React App
    
    
  3. 세번째

     vi /public/study-file2.txt
    
     # 입력 후 저장
     내용3 입니다.
    
    
     # 커밋
     git commit -m '세번째(newbranch)'  
     [newbranch 1f4fca6] '세번째(newbranch)'
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    
     # 깃로그 확인
     git log --oneline
     1f4fca6 (HEAD -> newbranch) '세번째(newbranch)'
     934f18d '두번째(newbranch)'
     e7d40d2 '첫번째(newbranch)'
     9662ff3
     21fe919
     4759017 Initialize project using Create React App
    
    

    💡현재 작업중인 브랜치는 newbranch 이다.
    💡newbranch는 자신이 커밋한 내용만 가르킨다.
    💡git log 를 보면 master 브랜치 정보 조차 안보인다는 것을 알았다.
    💡즉, 현재 사용중인 브랜치 자신이 모든 작업의 주체이다.

브랜치 병합

사진3

[중간점검]

# 그래프로 확인
git log --oneline --branches --graph

* 1f4fca6 (HEAD -> newbranch) '세번째(newbranch)'
* 934f18d '두번째(newbranch)'
* e7d40d2 '첫번째(newbranch)'
| * 267a63b (master) '세번째'
| * 564be84 '두번째'
| * 5c97963 '첫번째'
| * cc6c583 (newbranch2)
|/

  • 1f4fca6: newbranch 브랜치의 가장 최근 커밋. (HEAD -> newbranch)는 현재 체크아웃된(사용중인) 브랜치가 newbranch 임을 알 수 있다.
  • 934f18d: newbranch 브랜치의 두 번째 커밋
  • e7d40d2: newbranch 브랜치의 첫 번째
  • 267a63b: master 브랜치의 가장 최근 커밋
  • 564be84: master 브랜치의 두 번째 커밋
  • 5c97963: master 브랜치의 첫 번째
  • cc6c583: newbranch2 브랜치의 커밋은 없다.

    💡이 그래프를 보면 newbranch와 master 브랜치가 서로 독립적으로 작업하고 있으며, newbranch2 브랜치는 아직 별도의 커밋을 가지고 있지 않아서 기존의 커밋들과 분리되어 있는 것을 확인할 수 있다.

사진4 사진5

병합(머지) 방법 요약

깃허브에서 메인 브랜치와 다른 브랜치를 합치는 방법

  1. 먼저, 다른 브랜치에서 변경사항을 커밋(commit)하고 푸시(push).
  2. 메인 브랜치(기준브랜치)로 이동하여, 머지(merge)를 실행
  3. 메인 브랜치(기준브랜치)에서 머지 버튼을 클릭하면 자동으로 다른 브랜치의 변경사항이 메인 브랜치에 병합된다.

    💡만약 브랜치를 삭제할 수 없다면, 일단 메인 브랜치로 변경사항을 병합한 후에 삭제하자.

STEP1. 기준브랜치(master) 이동

“본격적으로 newbranch 브랜치를 master 브랜치에 병합해본다.”

git checkout master
Switched to branch 'master'
  1. AS-IS

     git log --oneline --branches --graph        
     * 1f4fca6 (HEAD -> newbranch) '세번째(newbranch)'
     * 934f18d '두번째(newbranch)'
     * e7d40d2 '첫번째(newbranch)'
     | * 267a63b (master) '세번째'
     | * 564be84 '두번째'
     | * 5c97963 '첫번째'
     | * cc6c583 (newbranch2)
     |/
     * 9662ff3
     * 21fe919
     * 4759017 Initialize project using Create React App
    
    
  2. TO-BE

     git log --oneline --branches --graph
     * 1f4fca6 (newbranch) '세번째(newbranch)'
     * 934f18d '두번째(newbranch)'
     * e7d40d2 '첫번째(newbranch)'
     | * 267a63b (HEAD -> master) '세번째'
     | * 564be84 '두번째'
     | * 5c97963 '첫번째'
     | * cc6c583 (newbranch2)
     |/
     * 9662ff3
     * 21fe919
     * 4759017 Initialize project using Create React App
    
    

    💡헤드가 master 측으로 이동되었다.
    💡’master’ 브랜치에 ‘newbranch’를 넣기 위해서는 우선 ‘master’ 브랜치에 ‘HEAD’가 위치하게 만들어야 한다.

STEP2. 대상브랜치(newbranch)를 기준브랜치(master) 에 병합

  • 편집은 ‘newbranch’ 브랜치에서 실행 했기 때문에
  • ‘master’ 브랜치로 브랜치를 전환한 지금
  • study-file2.txt 파일을 확인했을 때 그 내용이 변경되어 있지 않아야 한다.
  • (물론 현재는 신규건이라 당연히 없어서 정상일 것이다.)

그럼 이제 병합을 시작해볼까?

# newbranch 브랜치를 master 브랜치에 병합
git merge newbranch
Merge made by the 'ort' strategy.
 public/study-file2.txt | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 public/study-file2.txt

git log --oneline --branches --graph
*   d64f63f (HEAD -> master) Merge branch 'newbranch'
|\
| * 1f4fca6 (newbranch) '세번째(newbranch)'
| * 934f18d '두번째(newbranch)'
| * e7d40d2 '첫번째(newbranch)'
* | 267a63b '세번째'
* | 564be84 '두번째'
* | 5c97963 '첫번째'
* | cc6c583 (newbranch2)
|/
* 9662ff3
* 21fe919
* 4759017 Initialize project using Create React App

💡newbranch 안에 있던 ‘study-file2.txt’ 파일이 master 브랜치에 생겼다!
💡반대로 newbranch 안에는 master 의 변경분인 ‘study-file1.txt’ 파일이 없는 것을 확인했다.
💡master 브랜치를 newbranch 측으로 병합 완료했다.

💡fast-forward 에 대해서
이 ‘✅newbranch’ 브랜치를 ‘✅master’ 브랜치로 병합할 때, ‘✅master’ 브랜치의 상태가 이전부터 변경되어 있지만 않으면 매우 쉽게 병합할 수 있습니다. ‘✅newbranch’ 브랜치의 이력은 ‘✅master’ 브랜치의 이력을 모두 포함하고 있기 때문에, ‘master’ 브랜치는 단순히 이동하기만 해도 ‘✅newbranch’ 브랜치의 내용을 적용할 수 있습니다. 또한 이 같은 병합은 ‘fast-forward(빨리 감기) 병합’이라고 부릅니다.

브랜치 병합 되돌리기

사진6

정리

it checkout  master 
Switched to branch 'master'

git log --oneline --branches --graph
*   d64f63f (HEAD -> master) Merge branch 'newbranch'
|\
| * 1f4fca6 (newbranch) '세번째(newbranch)'
| * 934f18d '두번째(newbranch)'
| * e7d40d2 '첫번째(newbranch)'
* | 267a63b '세번째'
* | 564be84 '두번째'
* | 5c97963 '첫번째'
* | cc6c583 (newbranch2)
|/
* 9662ff3
* 21fe919
* 4759017 Initialize project using Create React App

git reset --hard HEAD~~
HEAD is now at 564be84 '두번째'

💡아까 머지해서 생성된 newbranch 의 파일이 삭제된것같다.
💡확인결과 2step 뒤로 롤백해서 돌아갔다
💡다시 ‘study-file1.txt’ 안에 세번째 라고 작성해서 커밋했다. :)

git log --oneline --branches --graph
* 1f4fca6 (newbranch) '세번째(newbranch)'
* 934f18d '두번째(newbranch)'
* e7d40d2 '첫번째(newbranch)'
| * 564be84 (HEAD -> master) '두번째'
| * 5c97963 '첫번째'
| * cc6c583 (newbranch2) 
|/  
* 9662ff3
* 21fe919
* 4759017 Initialize project using Create React App

브랜치 병합2 (충돌 재현)

사진7 사진8 사진9 사진10

STEP1. 동기화

  1. master 브랜치 내용
  2. newbranch 브랜치 내용
  3. 모두 동기화 시키기

STEP2. 동일파일 변경분 다르게 입력

  • master 브랜치

      내용1 입니다!
      내용2 입니다!
      내용3 입니다!
      내용4 입니다!
    
      내용5 입니다!
    
      # git commit -m '다섯번째'  
    
    
  • newbranch 브랜치

      내용1 입니다!
      내용2 입니다!
      내용3 입니다!
      내용4 입니다!
    
      내용999 입니다!
    
      # git commit -m '커밋 999'  
    
    

STEP3. 대상브랜치(newbranch)를 기준브랜치(master) 에 병합

git merge newbranch

Auto-merging public/study-file1.txt
CONFLICT (content): Merge conflict in public/study-file1.txt
Automatic merge failed; fix conflicts and then commit the result.

# 자동 병합 public/study-file1.txt 
# CONFLICT(콘텐츠): public/study-file1.txt의 병합 충돌
# 자동 병합에 실패했습니다. 충돌을 수정한 다음 결과를 커밋합니다.

에러가 발생했다.

STEP4. 문제의 코드 수정

git merge를 실행하면서 충돌이 발생하면?

  • Git은 자동으로 머지를 진행하지 못하고, “CONFLICT”와 함께 충돌 내용을 알려준다.
  • 이 상태에서는 충돌이 발생한 파일을 수동으로 해결한 후에 변경사항을 다시 커밋해야 한다.

문제 파일 파악하기

  • 충돌이 발생한 파일은 Git에 의해 변경사항이 표시되어 있다. (비주얼 스튜디오 코드에 이쁘게 나온다.)
  • «««<, =======, »»»>는 각각 충돌이 발생한 세 영역을 구분하는 마커이다.
    • «««< HEAD 이후부터 ======= 이전까지는 현재 브랜치인 HEAD에서의 변경사항이다.
    • ======= 이후부터 »»»> 이전까지는 머지 대상 브랜치에서의 변경사항 이다.
      <<<<<<< HEAD
      기준 브랜치에서의 내용
      =======
      머지하려는 브랜치에서의 내용
      >>>>>>> 머지하려는 브랜치의 커밋 해시
    
    
      <<<<<<< HEAD
      내용5 입니다!
      =======
      내용999 입니다!
      >>>>>>> newbranch
    
    

문제 파일을 수정

  1. 충돌이 발생한 파일에서 불필요한 부분을 삭제하거나 수정하여 원하는 코드로 충돌을 해결한다.
  2. 충돌을 해결한 후에는 파일에 기록된 충돌 내용을 삭제하고, 파일을 저장한다.

    해결하려는 충돌의 내용은 두 브랜치에서 변경된 내용 중에서 어떤 것을 반영할지를 결정해야 한다.

    • 예를 들어, 충돌을 해결하여 “내용999 입니다!”를 사용하고자 한다면 다음과 같이 수정하면 된다. (newbranch 기준으로 변경해서 해결했다.)
# master 브랜치의 파일을 newbranch 기준으로 변경
내용1 입니다!
내용2 입니다!
내용3 입니다!
내용4 입니다!

내용999 입니다!  # 변경

정상파일 add/commit 반영

git add .

git commit -m '병합오류수정'  
[master e3d60a2] '병합오류수정'

git merge newbranch
Already up to date.

💡동일하게 만들었더니 머지가 필요 없어졌다.
💡이렇게 충돌되는 부분을 수정하고 반영하면 된다.

Tags: ,

Categories:

Updated:

Leave a comment