브랜치란?
독립적으로 어떤 작업을 진행하기 위한 개념
필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행 가능
master VS main
브랜치
기능
실습 만들기
2. manual 디렉터리를 저장소로 만들고 ls -al 명령을 사용해서 .git 디렉터리가 만들어졌는지 확인
3. manual 디렉터리 안에 work.txt 파일을 만들기 위해 터미널에 다음과 같이 입력해서 빔을 열고, ‘content 1’이라는 내용을 입력한 후 저장
4. 이제 work.txt 파일을 스테이지에 올리고 커밋함 커밋 메시지는 간단히 ‘work 1’이라고 함
5. 커밋이 완료되면 git log를 입력해서 커밋 내역을 확인
커밋 해시 오른쪽에 있는 (HEAD -> main)은 HEAD가 현재 main이라는 브랜치를 가리키고 있다는 뜻
(HEAD ->main)이 붙은 커밋이 가장 최신 커밋
( work 1이라는 커밋이 ‘최신 커밋’)
6, work.txt 파일에 ‘content 2’를 추가한 후 ‘work 2’라는 메시지와 함께 커밋
7. 다시 한번 work.txt 파일을 열고 ‘content 3’을 추가한 후 ‘work 3’이라는 메시지와 함께 커밋
여기까지 초기 사용 설명서를 만들고 커밋까지 마침
8. 마지막으로 커밋 로그를 다시 한번 더 확인하기 위해 git log를 입력
3개의 커밋이 만들어졌고, 가장 최신 커밋인 work 3에 (HEAD -> main)가 표시되어 있음
새 브랜치 만들기
1. git branch :깃에서 브랜치를 만들거나 확인하는 명령
저장소를 만들면 main 브랜치가 기본으로 생성
고객사인 apple의 브랜치를 만들기 위해 다음과 같이 입력
4. main 브랜치 위에 apple 브랜치가 추가된 것을 확인할 수 있음(main 브랜치에서 작업하고 있음)
main 앞에 * 가 표시된 것은 여러 브랜치 가운데 현재 작업하는 브랜치를 나타냄
5. 브랜치가 추가된 후에는 커밋 로그 화면도 다르게 나타남
git log 명령을 사용해 커밋 로그를 확인해 보면 그동안 커밋 로그를 확인할 때 (HEAD -> main)라고 표시되던 곳에 apple 브랜치가 추가되면서 (HEAD -> main, apple)로 바뀌어 있음
저장소에 main과 apple이라는 2개의 브랜치가 있고, HEAD -> main이므로 현재 작업하는 브랜치는 main 브랜치라는 의미
6. 앞에서 소개한 방법으로 google 브랜치와 ms 브랜치를 만들고 git branch 명령으로 저장소 안에 있는 모든 브랜치를 확인
새 커밋 추가하기
1. git log로 확인해 보면 work 3 커밋 해시의 오른쪽에 main 브랜치를 비롯해 ms, google, apple 브랜치가 함께 표시되어 있음
즉, 이것은 main 브랜치뿐만 아니라 ms와 google, apple 브랜치에도 최신 커밋이 work 3이라는 뜻
3. 작업 브랜치를 apple 브랜치로 바꿨을 때 어떤 변화가 생기는지 확인
git log 명령을 사용해서 현재 브랜치의 커밋 로그를 확인
4. apple 브랜치를 만들기 전까지 main 브랜치에 있던 커밋들은 그대로 apple 브랜치에도 적용되었으므로 work 3 커밋까지 표시됨
커밋 해시에서 HEAD가 apple을 가리키는 것도 확인할 수 있음
5. cat 명령을 사용해 work.txt 파일의 내용을 확인
6. 최신 커밋이 work 3이기 때문에 content 1부터 content 3까지 3개의 행만 있음
main 브랜치에서 입력했던 main content 4가 없음
main content 4는 apple 브랜치를 분기한 후에 main 브랜치에 추가된 커밋이기 때문에
apple 브랜치에 영향을 미치지 않았다는 것을 알 수 있음
전환한 브랜치에서 커밋하기
1. apple 브랜치에는 브랜치를 분기할 때 가져온 work.txt 파일이 있음
빔에서 이 파일을 열고 ‘apple content 4’라는 텍스트를 추가하고 저장
2. apple 고객사만을 위한 내용이 담긴 apple.txt 문서를 만들고 여기에도 똑같이 apple content 4를 입력하고 저장
3. 수정한 work.txt 파일과 새로 만든 apple.txt 파일을 각각 커밋할 수도 있지만, 여기에서는 2개를 묶어서 한꺼번에 커밋하려고 함
다음 명령을 실행하고 ‘apple work 4’라는 메시지와 함께 커밋
이럴 때 git add 명령 뒤에 한 칸 띈 후 마침표(.)를 붙이면
현재 저장소에서 수정 내용이 있는 파일을 스테이지에 한꺼번에 올릴 수 있음
4. git log 명령을 사용해 커밋이 어떻게 저장되었는지 확인
apple 브랜치의 최신 커밋이 apple work 4라는 걸 알 수 있음
브랜치와 커밋 관계 알아보기
이렇게 하면 main 브랜치에는 없고 apple 브랜치에만 있는 커밋, 즉 apple content 4 커밋을 보여줌

이 부분을 보면 해당 커밋이 어떤 브랜치에서 만든 것인지 구별할 수 있음
(HEAD -> apple)이라고 되어 있으니 현재 브랜치는 apple 브랜치고, 최신 커밋은 apple work 4
main 브랜치의 최신 커밋은 main work 4이고, ms 브랜치와 google 브랜치의 최신 커밋은 work 3

그래프를 살펴보면 apple 브랜치의 최신 커밋은 apple work 4인데, 점선을 따라 apple work 4 커밋의 부모를 찾아가 보면 work 3 커밋을 만나게 됨
즉, apple 브랜치에서는 work 3 커밋 다음에 apple work4 커밋이 만들어졌다는 뜻
apple 브랜치의 커밋과 main 브랜치의 커밋이 같은 부모 커밋을 가지고 있음
즉, main 브랜치나 apple 브랜치는 work 3 커밋까지는 같고 그 이후부터 브랜치마다 다른 커밋을 만들었다는 사실을 알 수 있음
브랜치 사이의 차이점 알아보기
git log 명령에서 브랜치 이름 사이에 마침표 2개(..)를 넣는 명령으로 브랜치 간의 차이를 쉽게 확인할 수 있음
예를 들어 apple 브랜치를 기준으로 main와 비교하면 apple 브랜치에는 없고 main 브랜치에만 있는 main work 4 커밋을 보여 줌
서로 다른 파일 병합하기
‘manual-2’라는 디렉터리를 만들고 깃 저장소를 만들 텐데, 2가지 과정을 한꺼번에 처리
git init 다음에 디렉터리 이름을 입력하면 새로운 디렉터리를 만들고 저장소를 초기화하는 과정을 한꺼번에 처리할 수 있음

빔에서 ‘main 2’라고 입력한 후 저장하고 ‘main work 2’라는 메시지와 함께 커밋




이제 o2 브랜치로 전환

이어서 o2.txt 파일은 ‘o2 work 2’라는 메시지와 함께 커밋
work 1 커밋은 main 브랜치와 o2 브랜치가 똑같이 가지고 있음
이어서 main 브랜치에는 main work 2 커밋이 생겼고 o2 브랜치에는 o2 work 2 커밋이 생겼음
main 브랜치 입장에서 main work 1 → main work 2 순으로 커밋이 생겼고
o2 브랜치 입장에서 main work 1 → o2 work 2 순으로 커밋이 생겼음

브랜치를 병합하려면 먼저 main 브랜치로 전환해야 함
main 브랜치를 기준으로 o2 브랜치를 가져와 병합하려면 다음과 같이 입력

브랜치를 병합하면서 만들어진 커밋 메시지인데 커밋 메시지를 수정할 수도 있고 그대로 사용해도 됨
{{ Esc }}를 누르고 :wq를 입력해 내용을 저장한 후 편집기를 종료
o2 work 2 커밋이 main 브랜치에 병합되면서 ‘Merge branch o2’라는 커밋이 새로 생겼음
두 브랜치에서 서로 다른 파일을 병합하는 경우 이렇게 깃에서 간단히 해결할 수 있음
브랜치 병합하기
서로 다른 브랜치에서 한 문서의 다른 부분을 수정했을 때 병합하기 – (1)



나중에 work.txt 문서를 수정하고 병합할 것이므로 중간에 공백을 두 줄 둠


커밋 메시지는 ‘work 1’이라고 함
이제 main 브랜치와 o2 브랜치에는 모두 work 1 커밋이 있게 됨
그중에서 첫 번째 content 다음 줄에 ‘main content 2’라고 입력한 후 저장



이 상태에서 병합하기 위해 o2 브랜치를 main 브랜치에 합치기 위해 main 브랜치로 전환

메시지를 수정할 수도 있고 그대로 사용할 수도 있음
원하는 메시지를 작성하고 저장한 후 편집기를 종료
o2 브랜치의 work.txt가 main 브랜치의 work.txt와 어떻게 병합되었는지 보려면 cat 명령을 사용해 work.txt 파일을 확인

이렇게 같은 문서로 서로 다른 위치를 수정했을 경우 자동으로 합쳐 주는 기능이 있어 깃은 더욱 강력한 도구가 됨
브랜치 병합하기
서로 다른 브랜치에서 한 문서의 같은 부분을 수정했을 때 병합하기 – (2)



나중에 work.txt 문서의 같은 위치를 수정하기 위해 두 내용 사이에 빈 줄을 하나만 둠

즉, 브랜치 양쪽에 work.txt가 있음


첫 번째 content 다음 줄에 ‘main content 2’라고 입력한 후 저장



o2 브랜치를 main 브랜치에 병합하기 위해 먼저 main 브랜치로 전환한 후, git merge 명령을 사용해 o2 브랜치를 병합
이 메시지는 work.txt를 자동 병합하는 동안 충돌이 발생했다는 뜻
충돌이 생긴 work.txt는 어떻게 되어 있는지 확인하기 위해 빔에서 work.txt를 열어 봄
<<<<<<< HEAD와 가운데 가로줄(=======) 사이의 내용은 현재 브랜치, 즉 main 브랜치에서 수정한 내용
가로줄(=======)과 >>>>>>> o2 사이의 내용은 o2 브랜치에서 수정한 내용
양쪽 브랜치의 내용을 참고하면서 내용을 직접 수정해야 함
수정이 끝나면 문서에 있던 <<<<<<<< HEAD나 >>>>>>> o2, 가로줄(=======)을 삭제
문서를 저장하고 편집기를 종료
커밋 메시지는 merge o2 branch로 함
이렇게 해서 o2 브랜치에서 병합한 work.txt의 충돌을 해결하고 커밋을 끝냈음


브랜치 병합하기
병합이 끝난 브랜치 삭제하기 – (1)
앞의 브랜치 병합 실습을 따라왔다면 지금 위치는 manual-4 디렉터리일 것이고, 여기에는 main 브랜치와 o2 브랜치가 있음
현재 브랜치는 main이므로 main 브랜치 앞에 * 표시가 되어 있음
현재 브랜치가 main 브랜치가 아니라면 main 브랜치로 전환
다음과 같이 o2 브랜치를 삭제
삭제한 브랜치는 같은 이름으로 다시 브랜치를 만들면 예전에 작업했던 내용이 그대로 나타남
즉, 브랜치를 삭제한다는 것은 저장소에서 완전히 없애는 것이 아니라 깃의 흐름 속에서 감추는 것
브랜치 병합하기
cherry-pick으로 병합하기 – (1)

터미널에서는 세미콜론(;)으로 구분해서 여러 개의 명령을 한꺼번에 처리할 수 있음
그리고 명령어 중 touch는 빈 파일을 만듦
우리는 파일 내용을 수정하는 것이 아니라 버전이 필요하기 때문에 빈 파일을 만들고 스테이징과 커밋을 진행

그리고 깃 로그를 확인해 보면 init이라는 버전이 main과 topic 브랜치 양쪽에 있는 것을 볼 수 있음
여기에서 –-all 옵션은 최신 커밋 뿐만 아니라 모든 커밋을 다 보여주기 위한 옵션

main 브랜치는 최신 버전 m2를 가리키고 있고, topic 브랜치에는 init 버전 상태인 것을 볼 수 있음
cherry-pick을 사용하려면 우선 병합될 브랜치인 main 브랜치로 전환해야 함

기존에 main 브랜치에 있던 init.txt, m1, m2 다음에 t2가 합쳐진 것을 볼 수 있음

'Git,GitHub' 카테고리의 다른 글
[Git, GitHub] sourcetree로 add, commit push, pull하기 (0) | 2025.01.10 |
---|---|
[Git, GitHub] sourcetree 사용하기 (0) | 2025.01.10 |
[Git, GiHub] Git 알아보기 (0) | 2025.01.07 |
[Git, GitHub] SSH 원격 접속하기 (0) | 2023.06.29 |
[Git, GitHub] 깃이란? (0) | 2023.05.23 |