author
postNo
status
thumbnail
description
category
tags
createdAt
updatedAt
Branch 생성
branch란 무엇일까? branch는 현재 작업하고있는 공간을 말한다. Git은 스냅샷으로 수정사항을 저장하는데,
이 변경사항들을 branch라고하는 내 현재 작업공간에 저장시킨다.
branch를 여러개 사용하면 1개의 프로젝트내에서 한번에 여러기능을 간섭없이 개발할 수 있다.
branch의 생성은 간단하다
그리고 해당 branch로 이동한다.
branch생성 그리고 이동. 간단하다.
생성과 동시에 이동은
-b옵션을 이용하여 한 줄로도 가능하다.branch의 merge 혹은 rebase
branch하나를 만들어서 작업이 끝났다면 다른 branch와 합쳐야한다. 이 합치는 과정을
merge또는 rebase라고 한다.(실제로 동작하는 과정을 다르지만, 소스를 합친다는 입장에서는 동일하다)
다음과 같이 사용한다.
위와같이 실행하면
{머지할 branch}의 내용이 {본 branch}로 들어가면서 합쳐진다.작업이 끝난, 즉 필요없는 branch는 삭제해주자.
git bracn -D {삭제할 branch}Conflict
다수의 개발자가 한 프로젝트에서 각 기능개발을 하다보면 동일한 파일을 수정하는 경우는 반드시 있다.
동일한 파일을 각각의 branch에서 작업하고 본branch에서 합치다 보면 동일한 파일이 수정되었기 때문에
git은 누구의 소스로 합쳐야할지 모르는 상황이 생긴다. 이런 경우를 Conflict가 생겼다고 하고 git은 이를 알려준다.
git merge를 할 때 Conflict가 발생하면 다음과같은 메세지가 출력된다
해당 파일을 열어보자
이와같이
<<< HEAD, =======, >>>>>>> 라는 이상한 문자열이 생겨났다!한줄한줄 살펴보자.
2~4번 라인 (<<<HEAD ~ ==== 사이) 현재 내 branch의 파일 내용이다.
4~6번 라인 (====== ~ {branch명})은 merge하려는 branch의 파일내용이다.
작업자는 위 3가지의 문자열을 삭제하고 올바르게 최신의 소스로 만들어주면 된다.
완료되었다면
git merge --continue를 실행해주자.merge로 실행했다면
3-way-merge로 잘 merge된것을 확인할 수 있다.(git log)
rebase를 이용한 commit 관리
1. 이러한 상황을 가정해보자.
- 해당 함수를 다 만들어서 commit을 하였다.
- 다음 함수를 만들어서 commit을 하였다.
- 생각해보니 1번과 2번의 기능은 하나의 커밋으로 합치고싶다.
이러한 경우에 우리는 2개의 commit을 합치는 기능을 사용할 수 있다.
rebase를 사용하는데 사용방법은 간단하다.{number} 자리에 해당하는 만큼의 최근 commit을 가져온다.그리고 합쳐야할 commit중 최신 commit의 상태를
s 혹은 squash로 바꾸고 저장하고 빠져나온다.항상 최근 commit이 이전 commit으로 합쳐진다는것을 기억하자.
그러면 git은 자동으로 commit메세지를 수정할 수 있는 화면으로 이동한다.
위 내용 중
이 부분을 수정하여 한줄로 commit메세지를 작성한다.
저장하고 빠져나와서
git log를 확인해보자. 2개의 commit이 1개로 합쳐진것을 확인할 수 있다.2. 이러한 상황을 가정해보자.
- 해당 함수를 다 만들어서 commit을 하였다.
- 다음 함수를 만들어서 commit을 하였다.
- 생각해보니 1번과 2번의 커밋 순서를 변경하고싶다.
이러한 경우에 우리는 2개의 commit의 순서를 조정할 수 있다.
이번 역시
rebase를 사용한다.순서 변경은 합치는것보다 더 간단하다. 출력되는 순서에서 문서의 순서만 편집해주면 된다.
단 순서조정하는 commit이 conflict가 난다면 조정이 불가능하다.
(필자는 이러한경우에는
git reset HEAD^를 사용하여 최근 커밋을 삭제하고 다시 커밋하는 방식을 사용한다.)cherry-pick을 이용한 commit 가져오기
branch를 작업하다보면 한 branch에서 너무 많은 작업을 했다거나, 다른 branch에서의 작업을 가져와 함께 pr하고싶은 경우가 생긴다.
이런 경우 git의
cherry-pick이란 기능을 사용할 수 있다.git log명령어를 통해 commit history를 확인해보자아래 더 많이 있지만 최근 3개만 보면 위와 같다.
기본적으로 log에는 헤더, 브랜치의 위치, 커밋 메세지와 시간 그리고 중요한
hash값이 있다. 이 hash값을 이용해 우리는 다른 branch의 commit을 가져올 수 있다.
다른 브랜치로 이동하여 간단한 commit을 만들어보자.
1개의 commit을 새로 하였다. 그리고 log을 다시 확인해보자.
2ba365f8ceb1cf92875b06afdea69d0d020b3ad1 hash값의 커멧메시지 테스트4 가 추가되었다.master로 돌아가 이번엔 다른 branch를 만들어보자.
이번엔 커멧메세지 테스트5로 새로운 커밋을 만들어보았다.
fix/main-table-style, fix/main-footer-style 2개의 브랜치가 생겼다. 이제 PR을 한다고 가정해보자. 가만히 생각을 해보니 2개의 브랜치로 나눌 이유가 없었다. (두 작업이 비슷한 작업이었다고 가정한다)
이런경우 한 브랜치에서 다른 브랜치의 commit을 가져오자.
fix/main-table-style 브랜치에서 fix/main-footer-style 의 마지막 커밋인 커밋메세지 테스트5를 가져올 것이다. 가져오기 위해서는
커밋메세지 테스트5 commit의 hash값을 기억해야 한다. 위에서 보면 648d6ee06a09cc3513be7e69a3525d21803dc462이 값이다.hash값을 기억했다면
fix/main-table-style으로 이동하자.cherry-pick을 이용하여 commit을 가져오자.실행 결과를 보면 1개의 커밋을 정상적으로 가져왔다. log을 확인해보자.
위 그래프와 같이 1개의 커밋을 가져와서 정상적으로 합쳐졌다!
여러개의 브랜치를 1개로 합쳐 PR을 하고싶은 경우나 혹은 1개의 branch의 commit을 여러개의 branch로 나누어 PR하고싶을 때 사용하면 좋을 듯 하다.