KeyWord
Branch(개념,생성/이동,삭제,이름변경), log확인, 병합(merge/rebase), 충돌해결, 병합취소
참고자료
[깃 끝판왕 강좌] 제대로 파는 Git & GitHub, https://www.youtube.com/watch?v=1I3hMwQU6GU&t=5743s, 얄팍한 코딩사전
드리는 말씀
깃 사용법을 자주 잊어 개인이 보기위해 작성한 글입니다.
자료를 참고하셔도 무방하나, 해당 글은유튜브 [얄팍한 코딩사전], git강의를 토대로 작성되었습니다.
git을 공부하고자 하시는 분은 꼭 봐보시길 강력 추천드립니다.
1. Branch: 분기된 가지 (다른 차원)
- 프로젝트를 하나 이상의 모습으로 관리해야 할 때
- 예) 실배포용, 테스트서버용, 새로운 시도용
- 여러 작업들이 각각 독립되어 진행될 때
- 예) 신기능1, 신기능2, 코드개선, 긴급수정
- 각각의 차원에서 작업한 뒤 확정된 것을 메인 차원에서 통합
이 모든 것을 하나의 프로젝트 폴더에서 진행할 수 있도록 한다.
1. Branch 생성 및 이동
- git branch "브랜치명"
- git branch가 잘 생성 되었는지 확인하기 위해서는 git branch 명령어를 쓴다.
- git branch 명령은 현재 위치한 branch와 branch들을 보여준다.
- git switch "브랜치명"
- git switch "브랜치명"으로 생성된 사용자가 원하는 브랜치로 이동할 수 있다.
2. Branch 삭제 및 이름변경
- Branch 삭제 : git branch -d "삭제할 브랜치명"
- Branch 이름변경 :git branch -m "기존 브랜치명" "새 브랜치명"
3. Branch command창에서 시각화 된 log 확인법
Branch를 command 창에서 시각화 된 log로 확인하기 위한 명령어
- git log --all --decorate --oneline --graph
- 사실, Sorce Tree로 보는게 가장 편하다.
- 사실, Sorce Tree로 보는게 가장 편하다.
2 ] Branch를 합치는 방법
1. 두 가지 방법이 존재
- merge : 특정 작업을 진행한 branch를 main branch에 하나의 commit으로 붙이는 것
- rebase : 특정 작업을 진행한 branch의 commit들을 main에다가 연달아 붙이는 것
2. merge와 rebase의 차이
merge는 기존 branch의 흔적을 남기면서(잔가지들의 흔적이 남음) 하나의 commit으로 병합되는 반면,
rebase는 작업한 branch의 commit 내용을 main에다가 붙이게 된다. (잔가지들의 흔적을 모두 병합하고자 하는 브랜치에 붙여버린다.)
- 히스토리에 차이가 있다.
- 히스토리를 깔끔하게 진행하겠다 :: rebase
- branch 작업 내용을 남겨둘 필요가 있겠다 :: merge
- 협업 진행시 rebase를 사용하지 않고 merge를 사용하는 것이 바람직하다. (무조건 정답은 아니다.)
3. branch, merge 실습하기
- 병합을 하고자 하는 branch로 이동한다.
- git merge "병합할 Branch명"으로 병합을 실시한다.
- 병합할 Branch명의 history가 그대로 남음을 상기한다.
- 만약, 병합된 대상의 branch를 삭제하고 싶다면 git branch -d "병합된 대상의 branch" 명령어를 준다.
- 주의 할 것이, git branch -d 를 하면 branch가 삭제 되는 것이지, history가 삭제되는 것은 아니다.
- merge전의 상태로 Reset을 하고 싶다면 ??
- 위에서 실습한 Reset을 활용한다.
- 또는 sorce tree에서 commit 위치에 해당하는 부분을 찾아 Reset을 진행한다.
4. branch, rebase실습하기
rebase는 merge와 반대로 해야한다.
- new-teams branch를 main으로 rebase를 하는 경우를 예시로 한 설명
- new-teams branch로 이동한다.
- git rebase main으로 rebase를 진행한다. 아래와 같은 결과가 sorce tree에서 보이게 된다.
- main branch의 위치를 주의깊게 볼 필요가 있으며, rebase로 진행된 new-teams branch의 작업 내용이 main에 적용이 되지 않는다.
- 따라서 main branch의 위치를 new-teams의 위치로 옮겨줘야한다.
- 다시, 실습 환경으로 돌아와서 main으로 이동 후, git merge new-teams 명령어로 new-teams의 시점으로 fast-foword시킨다. 결과는 아래와 같다.
- 이렇게 작업을 진행하면 new-teams의 작업 내용(수정, 삭제, 삽입)이 main에 적용되게 된다.
- 다시, 실습 환경으로 돌아와서 main으로 이동 후, git merge new-teams 명령어로 new-teams의 시점으로 fast-foword시킨다. 결과는 아래와 같다.
- 필요한 경우, new-teams branch를 git branch -d new-teams로 삭제해준다. 결과는 아래와 같다.
3 ] 병합시 생기는 충돌 해결하기
병합시 충돌이 생기는 경우는, 두 사용자 이상이 같은 브랜치에서 같은 줄에 다른 수정이 이루어졌을 때 생긴다.
협업에서 자주 접할 수 있는 문제이므로 주의깊게 공부하자.
1. 실습으로 이해하는 충돌 해결
- 상황 설정 : conflict-1, conflict-2 branch에서 의도적 충돌 발생시키기
- 상황 설명 : main에서 병합을 진행할 것이며, 각각의 브랜치는 병합시 충돌이 발생하게 된다.
- main : Tigers의 manager를 Kenneth로 변경, Leopards의 coach를 Nicholas로 변경, Panthers의 coach를 Shirley로 변경 - confilct-1 : Tigers의 manager를 Deborah로 변경 (commit message : Edit Tigers) - conflict-2 (1차) : Leopards의 coach를 Melissa로 변경 (commit message : Edit Leopards) - conflict-2 (2차) : Panthers의 coach를 Raymond로 변경 (commit message : Edit Panthers)
[1] main에서 merge를 이용해 confilt-1을 병합하기
- main에서 merge를 이용해 confilct-1을 병합할 때 생기는 메시지
- main에서 merge를 이용해 confilct-1을 병합할 때 생기는 충돌 (vscode에서 나오는 메시지)
- 충돌 발생시, 충돌난 부분을 수정해주고 저장해줘야한다.
- vscode에서는 3번째 줄 위를(회색 글씨) 개발자가 원하는 옵션을 클릭해 적용시킬 수 있다.
- 이후, git add . 명령어와 git commit 명령어를 통해 수정사항을 git에게 알린다.
[2] main에서 rebase를 이용해 confilt-2를 병합하기
- rebase는 모든 commit의 내용을 연달아 붙이는 것이기 때문에 병합시에 각각의 commit마다 충돌을 해결해줘야한다.
- 실습진행 초기 상태
- conflict-2 branch에 진입하여 git rebase를 하고 나오는 설명
- both modified : lepoards.yaml : 두 브랜치에서 leopards.yaml을 건드릴려고 한다. 따라서, 이 파일을 개발자가 수정해달라고 하는 의미이다.
- 충돌 부분의 파일을 수정 하고 git add .
- 이후, git rebase --continue 명령어 진행한다. 왜냐하면, 한 번의 수정으로 브랜치 수정이 되지 않을 수 있기 때문이다. 강조하지만 rebase인 경우 각각이 브랜치를 수정해줘야한다. 아래는 현재까지 진행한 사진이다.
- 앞선 부분까지 진행했다면 commit이 한 번 완료된 것이다.
- 이 후, 아직 남은 branch가 있으므로 충돌된 부분을 확인하여 작업을 진행한다.
- 결과를 보면 알겠지만, rebase과정의 모든 충돌이 해결되면, git rebase --continue시 위와 같은 메시지가 출력된다.
- 분명 두 마디를 수정하여 rebase를 진행했는데 한 마디가 나온 이유는 충돌 해결 중 두 번째 것에서는 current, 즉 main 브랜치 것(Shirley)을 채택했기 때문에 (즉 rebase가 의미가 없어졌으므로) 커밋으로 추가할 필요가 없어졌기 때문이다.
- git main이 뒤쳐져 있기 때문에 아래와 같은 진행방법으로 마무리한다. (최신 커밋으로 바꿔준다.)
- git switch main
- git merge conflict-2
- 다 사용된 브랜치가 필요없을 경우, git branch -d "지울 브랜치명"으로 지워준다.
- 지워줘야하는 브랜치를 그때 그때 지워줘야 프로젝트 진행시 혼란을 겪지 않는다.
2. git 병합시 당장 해결하기 힘든 경우 취소하기
- merge인 경우 : 명령어 git merge --abort를 통해 merge를 중단한다.
- rebase인 경우 : 명령어 git rebase --abort를 통해 rebase를 중단한다.
'etc Ⅰ > git' 카테고리의 다른 글
git :) 문제해결방법, git에서 한글이 깨져 나올 경우 (0) | 2022.05.05 |
---|---|
git :) [로컬저장소 중심 - 1편] git init, git status, 파일배제, git과거로의 회귀(Rest,Revert) (0) | 2022.04.28 |