Git 브랜치
들어가기전에)
별첨) 다양한 브랜치 확인 명령어
# 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. 브랜치 확인
-
기본 명령어
# 신규 브랜치 확인 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 브랜치) 신규건 생성/작업/커밋
-
첫번째
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
-
두번째 커밋
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
-
세번째 커밋
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
설정이 변경되니까 편집기에도 브랜치가 변경되었다.
-
첫번째
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
-
두번째
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
-
세번째
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 브랜치 정보 조차 안보인다는 것을 알았다.
💡즉, 현재 사용중인 브랜치 자신이 모든 작업의 주체이다.
브랜치 병합
[중간점검]
# 그래프로 확인
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 브랜치는 아직 별도의 커밋을 가지고 있지 않아서 기존의 커밋들과 분리되어 있는 것을 확인할 수 있다.
병합(머지) 방법 요약
깃허브에서 메인 브랜치와 다른 브랜치를 합치는 방법
- 먼저, 다른 브랜치에서 변경사항을 커밋(commit)하고 푸시(push).
- 메인 브랜치(기준브랜치)로 이동하여, 머지(merge)를 실행
-
메인 브랜치(기준브랜치)에서 머지 버튼을 클릭하면 자동으로 다른 브랜치의 변경사항이 메인 브랜치에 병합된다.
💡만약 브랜치를 삭제할 수 없다면, 일단 메인 브랜치로 변경사항을 병합한 후에 삭제하자.
STEP1. 기준브랜치(master) 이동
“본격적으로 newbranch 브랜치를 master 브랜치에 병합해본다.”
git checkout master
Switched to branch 'master'
-
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
-
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(빨리 감기) 병합’이라고 부릅니다.
브랜치 병합 되돌리기
정리
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 (충돌 재현)
STEP1. 동기화
- master 브랜치 내용
- newbranch 브랜치 내용
- 모두 동기화 시키기
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
문제 파일을 수정
- 충돌이 발생한 파일에서 불필요한 부분을 삭제하거나 수정하여 원하는 코드로 충돌을 해결한다.
-
충돌을 해결한 후에는 파일에 기록된 충돌 내용을 삭제하고, 파일을 저장한다.
해결하려는 충돌의 내용은 두 브랜치에서 변경된 내용 중에서 어떤 것을 반영할지를 결정해야 한다.
- 예를 들어, 충돌을 해결하여 “내용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.
💡동일하게 만들었더니 머지가 필요 없어졌다.
💡이렇게 충돌되는 부분을 수정하고 반영하면 된다.
Leave a comment