1. 사전 준비
먼저 Git 저장소를 만들어 주었다.
폴더 이름은 BranchTutorial로 지정해주고, 저장소로 지정해 주었다.
mkdir BranchTutorial
cd BranchTutorial
git init
폴더에 myfile.txt라는 이름으로 파일을 만든 후 커밋한다.
여기까지 진행했다면, 다음과 같은 이력이 남게 된다.
2. 브랜치 만들기
'issue1'이라는 이름으로 새로운 브랜치를 작성한다.
브랜치는 branch라는 명령어로 만들 수 있다.
git branch <branchname>
을 이용하여 새로운 브랜치를 작성한다.
옵션을 지정하지 않고 branch명령어를 실행하면 브랜치 목록 전체를 확인할 수 있다.
앞 부분에 *이 붙어있는 것이 현재 선택된 브랜치이다.
현재 master브랜치인 것을 확인할 수 있다.
지금 시점까지의 이력은
이다.
3. 브랜치 전환하기
앞에서 우리가 새로 만든 issue1라는 이름의 브랜치를 사용하여 어떤 작업을 수행하려면,
브랜치를 바꾸어주겠다고 말해야 한다.
이 때 사용하는 명령어가 바로 checkout이다.
체크아웃이란, 내가 사용할 브랜치를 지정하는 것을 의미한다.
git checkout <branchname>
와 같이 뒤에 사용할 브랜치 이름을 적으면 된다.
브랜치가 issue1로 변경된 것을 확인할 수 있다.
지금까지의 이력은 다음과 같다.
HEAD가 바뀌었다.
* checkout명령에 -b 옵션을 넣으면 브랜치 작성 + 체크아웃을 할 수 있다.
git checkout -b <branchname>
'issue1'브랜치를 체크아웃한 상태에서 커밋을 수행하면, 'issue1'브랜치에 그 이력이 기록된다.
txt파일을 수정한 후에 커밋해보자.
지금까지의 이력은
이다.
변경하여 새 커밋을 추가한 상태이다.
4. 브랜치 병합하기
issue1브랜치의 변경 사항을 master에 병합해 볼 것이다.
병합은 merge 명령어로 실행한다.
이 명령어에 병합할 커밋 이름을 넣어 실행하면, 지정한 커밋내용이 'HEAD'가 가리키고 있는 브랜치에 넣어진다.
'HEAD'는 현재 사용중인 브랜치에 위치하게 되는데, 위 그림에서는 issue1커밋에 'HEAD'가 위치하고 있다.
master에 issue1를 넣기 위해서는 우선 master에 HEAD가 위치하게 만들어야 한다.
이 때에는 checkout명령어를 이용하여 현재 사용중인 브랜치를 master로 바꾸어야 한다.
한...글...ㅎ.....설정을 나중에 바꾸어야겠다.
무트으으으으으으은
master로 브랜치를 바뀐 것을 확인하고 txt파일을 확인했을 때, 그 내용이 변경되어 있지 않았다.
그 이유는 파일 변경은 issue1브랜치에서 실행했기 때문에, master브랜치로 전환한 지금은 그 내용이 변경되어 있지 않아야 한다.
이제 병합을 시작해보자.
이제 master브랜치가 가리키는 커밋이 issue와 같은 위치로 이동하였다.
이런 방식의 병합을 fast-forward병합이라고 한다.
myfile.txt를 열어 내용을 확인해보면,
바뀐 것을 확인할 수 있었다.
5. 브랜치 삭제하기
issue1브랜치의 내용이 모두 master에 통합되었기 때문에, 이제 더 이상 issue1는 필요가 없다.
브랜치를 삭제하려면
git branch -d <branchname>
을 실행하면 된다.
삭제되고 master만 남은 것을 알 수 있다.
그렇다면 이력은 다음과 같다.
6. 동시에 여러 작업하기
두 개의 브랜치를 생성하여 동시에 여러 작업을 처리해보자.
'issue2'와 'issue3'을 만들어 issue2브랜치로 전환한다.
issue2브랜치의 myfile.txt에 아래와 같이 commit에 대한 설명을 추가하여 커밋해 보자.
그렇다면 이력은 위와 같은 상황이다.
이번에는 'issue3'브랜치로 전환해보자.
issue3으로 전환 후에, myfile.txt를 확인하면 commit 명령의 설명은 추가되어있지 않다.
commit설명 말고, pull명령어를 추가하여 변경 사항을 커밋해보자.
그렇다면 현재까지의 이력은 다음과 같다.
지금까지 issue2엔 commit에 대한 설명을, issue3에는 pull에 대한 설명만 추가한 상태로 커밋하였다.
이처럼 각각의 브랜치에서는 독립적으로 서로 다른 작업을 처리할 수 있다.
파일을 변경한 후에도, 다른 브랜치로 체크아웃을 하면 변경 내용이 추가되어 있지 않아 매우 놀랐다....ㅎ 깃은 신기해애
7. 병합할 때 발생하는 충돌 해결하기
issue2에서 변경한 부분과 issue3에서 변경한 부분을 모두 master에 통합해 보도록 하자.
먼저 master를 체크아웃한 다음 issue2브랜치를 병합한다.
그렇다면 현재 fast-forward병합이 실행된다.
이력은
이다.
이번에는 issue3을 병합해보자.
CONFLICT이라고 나오게 되며, 자동 병합에 실패하게 된다.
앞서 각각의 브랜치에서 변경한 내용이 myfile.txt의 같은 행에 포함되어 있기 때문이다.
실제로 myfile.txt를 확인하면 다음과 같이 변경되어 있다.
what...
충돌이 있는 부분에 Git이 자동으로 위와 같이 충돌 정보를 포함하여 파일 내용을 변경한다.
이 내용을 통해 어떤 브랜치에서 어떤 부분이 충돌되었는지 확인할 수 있다.
충돌이 일어난 부분은 이렇게 일일이 확인해서 수정해주어야 한다.
그럼 아래와 같이 파일 내용을 변경해 보자.
충돌 부분을 모두 수정했으므로, 다시 커밋해보자.
이 시점까지의 이력을 보면 다음과 같다. 이번 병합은 충돌 부분을 수정하였기에 그 변화를 기록하는 병합 커밋이 새로 생성되었다.
그리고 'master'브랜치의 시작이 그 위치로 이동되어있는 것을 확인할 수 있다.
아래와 같은 방법을 non fast-forward병합이라고 한다.
다음엔 rebase로 병합을 해보겠다.
[Reference]
https://backlog.com/git-tutorial/kr/
'기타 딩가딩가 > Github' 카테고리의 다른 글
2] Branch (개념) (0) | 2020.03.09 |
---|---|
1] Git시작하기 (설치, 첫 commit / push / pull / clone) (0) | 2020.02.29 |