일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- KDT 프로그래머스 데브코스 프론트엔드
- netlify redirect
- 프로그래머스 데브코스 프론트엔드
- 쌓임맥락
- 프로그래머스 프론트엔드 데브코스
- 다른컴퓨터에서 git사용
- 폼 입력 바인딩
- SCSS import
- SCSS use
- git 같은계정 다른 컴퓨터
- nextjs사용법
- SCSS forward
- vue mixin
- 프로그래머스 K_Digital Training
- vuex map
- react next
- Spacer
- 리액트
- 이벤트 수식어
- Vue
- vue 이벤트 수신
- SCSS extend
- flex
- intersection opserver
- KDT 프로그래머스
- postcss
- vue 지역 컴포넌트
- 리스트 렌더링
- 프로그래머스 데브코스
- 고양이 사진 검색기
- Today
- Total
혼자 적어보는 노트
[Git] 브랜치 다루기, 충돌 해결 / branch / merge / rebase 본문
Branch
프로젝트를 여러 버전으로 관리해야 할 때
여러 작업을 따로 작업하고 한번에 통합할 때 사용한다.
혼자서 작은 프로젝트를 진행할 때에는 branch를 잘 사용하지 않았지만
다른 사람들과 함께 작업을 하거나 테스트 코드 작성시에 branch를 다양하게 사용할 수 있다.
로컬 branch 생성
브랜치 생성 시 현재 위치해 있던 브랜치가 복사되어 새로운 브랜치가 추가된다.
git branch [생성할 브랜치이름]
// 예시
git branch new-branch
원격 저장소에 있는 branch 연결
원격저장소에만 있는 branch를 로컬로 가지고 오려면 아래의 명령어를 사용한다.
git fetch
git checkout -t [원격브랜치명]
원격 브랜치 경로도 포함해야 함
로컬/원격 branch 목록 확인
git branch // 로컬브랜치 조회
git branch -r // 원격브랜치 조회
git branch -a // 원격브랜치를 포함한 전체 브랜치 조회
branch 이동
기존에는 checkout 으로 사용했지만 checkout이 하나의 명령어에 많은 기능이 들어있기 때문에
git 2.23버전부터 checkout의 브랜치 이동 기능이 switch/restore로 분리되었다. (restore은 다음에 다룰예정)
checkout / switch 모두 사용해도 되지만 switch를 사용하는 것을 권장하고 있다.
git switch [변경할 브랜치명]
git checkout [변경할 브랜치명]
branch 생성과 동시에 이동
git switch -c [새 브랜치명]
git checkout -d [새 브랜치명]
로컬 branch 삭제
git branch -d [삭제할 브랜치명]
원격 branch 삭제
git push [원격저장소 이름] -d [삭제할 원격브랜치 이름]
로컬 branch 이름 수정
git branch -m [기존브랜치명] [새 브랜치명]
브랜치 합치기 / merge, rebase
merge
두 브랜치를 한 커밋에 이어주는 방식
* 이전의 브랜치 history내역이 남아 있다.
merge 하는 법
1. 메인이 되는 브랜치로 이동한다.
git switch [main이 될 브랜치]
2. 명령어를 통해 합칠 브랜치를 입력해준다.
git merge [합칠 브랜치명]
3. merge된 branch삭제
git branch -d [삭제할 브랜치명]
❗ merge 충돌 해결
겹치지 않는 파일의 변경이나 추가만 되어있는 코드에서는 merge가 정상적으로 실행되지만
같은 파일의 같은 위치에 다른 내용을 입력할 경우 브랜치간의 충돌이 발생한다.
예시상황
1. main브랜치에서 user.txt에 정보를 작성 후 커밋
2. modify-user 브랜치를 추가하고, modify-user브랜치에서 user.txt파일을 전부 수정
3. main브랜치에서 modify-user을 merge
4. 충돌 발생
같은 파일의 같은 위치에 서로 다른 내용이 담겨있다면 충돌이 발생하며
어떤 브랜치의 내용으로 병합할 지 정해주어야 한다.
$ git merge modify-user
Auto-merging user.txt
CONFLICT (content): Merge conflict in user.txt
Automatic merge failed; fix conflicts and then commit the result.
충돌이 발생하면 에러메세지가 출력되는데
터미널을 보면 MERGING이 아직 진행중임을 알 수 있다.
충돌이 발생하고 있는 부분은 아래와 같이 VSCode 에디터 상에서 표시가 된다.
상단의 버튼들을 이용하여 해당 부분을 어떤 브랜치의 코드로 변경을 할 지 선택할 수도 있지만
해당 코드를 지우고 새로운 코드를 작성해도 된다.
변경사항을 적용한 후 커밋 하면 merge가 된 것을 확인할 수 있다.
git add .
git commit
❗ MERGING 중단 하기
충돌이 발생했을 때 MERGING상태를 아래의 명령어로 중단시킬 수 있다.
git merge --abort
다른 브랜치의 커밋들을 묶어서 가져오기
위와 같이 new 브랜치에 있는 커밋들을 하나로 묶어서
main브랜치로 가지고 오고 싶을 경우 main브랜치에서 아래와 같은 명령어를 사용한다
git merge --squash [묶을 브랜치]
위의 명령어를 입력하고 git status로 확인해보면 merge되거나 그런 내역 없이
해당 브랜치의 변경 사항들이 staging area에 들어와 있다.
그 상태에서 git commit을 하고 메세지를 입력하면
new브랜치의 커밋들은 그대로인 상태에서
main브랜치에 new브랜치의 변경사항들이 하나의 커밋으로 추가된다.
rebase
브랜치를 다른 브랜치에 이어주는 방식
* 내역이 남는 merge와는 달리 한 줄로 정리된 내역을 유지할 수 있다.
rebase 하는 법
1. 이동시킬 브랜치로 이동한다. (new-branch에서 main으로 이어주려면 new-branch로 이동)
git switch [이동시킬 브랜치명]
2. 명령어를 통해 이어줄 브랜치를 입력해준다. (main에 이어주려면 main 입력)
git rebase [이어붙일 브랜치]
3. rebase는 되었으나 이때 브랜치의 위치를 보면 이어붙이기를 한 new-branch는 상단에 위치하지만
main브랜치의 위치는 이전 커밋 위치 그대로이다.
4. main브랜치로 이동 후 아래의 명령어로 new-branch의 위치로 merge
git branch main
git merge new-branch
5. new-branch 삭제
git branch -d [삭제할 브랜치명]
❗ rebase 충돌 해결
rebase도 merge와 마찬가지로 충돌이 발생할 경우
해결 후 진행을 해주어야 한다.
예시상황
1. main브랜치에서 friend.txt에 정보를 작성 후 커밋
2. new-friend 브랜치를 추가하고, new-friend브랜치에서 friend.txt파일을 전부 수정
3. main브랜치로 돌아가서 friend.txt파일 삭제 후 커밋
4. new-friend 브랜치로 돌아가서 git rebase main
4. 충돌 발생
$ git rebase main
error: could not apply 00c14c5... Modify friend and Add new-friend
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 00c14c5... Modify friend and Add new-friend
CONFLICT (modify/delete): friend.txt deleted in HEAD and modified in 00c14c5
(Modify friend and Add new-friend). Version 00c14c5 (Modify friend and Add new-friend) of friend.txt left in tree.
merge와 마찬가지로 터미널을 확인하면 rebase중임을 알 수 있다.
git status 명령어를 입력하여 unmerged paths를 확인해보면
main에서 삭제된 friend.txt가 나타난다.
friend.txt를 add 해주고 충돌을 해결해준다.
git add friend.txt
충돌 부분을 해결했다면 아래의 명령어로 rebase를 진행한다.
git rebase --continue
❗ REBASE 중단 하기
충돌이 발생했을 때 REBASE상태를 아래의 명령어로 중단시킬 수 있다.
git rebase --abort
다른 브랜치에서 생성된 브랜치 옮겨서 rebase
위의 그림처럼 main브랜치에서 first브랜치를 생성하고
first브랜치에서 second브랜치를 생성한 상태에서
first브랜치는 그대로 두고 second브랜치의 커밋만 main브랜치에 붙이고 싶다면
아래의 명령어를 사용하면 된다.
git rebase --onto master server client
'기타' 카테고리의 다른 글
[Git] 브랜치 다루기 2 - HEAD (0) | 2022.02.05 |
---|---|
[Git] pull / push / fetch 다루기 + 충돌 해결 (0) | 2022.02.05 |
[Git] commit, reset 되돌리기 - reset / revert / conflict / reflog (0) | 2022.02.03 |
[Git] Git의 공간 다루기 / commit / add / diff / stash (0) | 2022.02.03 |
[Git] 초기설정 / 저장소생성 / gitignore (0) | 2022.02.03 |