Git,GitHub

[Git,GitHub] 깃과 브랜치

코딩하는둥이 2023. 6. 27. 10:56

브랜치란?

독립적으로 어떤 작업을 진행하기 위한 개념

필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행 가능

 

master  VS  main

main 브랜치와 master 브랜치는 이름만 서로 다를 뿐, 깃을 사용할 때 기본이 되는 브랜치라는 개념은 같음
 

브랜치

커밋을 가리키는 포인터와 비슷

기능

기존 파일은 main 브랜치에 그대로 유지하면서, 브랜치에서 기존 파일 내용을 수정하거나 새로운 기능을 추가할 수 있음
 
분기(branch) : main 브랜치에서브랜치를 만드는 것
병합(merge) : 분기했던 브랜치를 main 브랜치에 합치는 것
 
 

실습 만들기

1.터미널 창을 열어 홈 디렉터리에 ‘manual’이라는 새 디렉터리를 만들고 해당 디렉터리로 이동

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  :깃에서 브랜치를 만들거나 확인하는 명령

2. main이라고 나타남(main 브랜치에서 작업하고 있음)
저장소를 만들면 main 브랜치가 기본으로 생성
3. 새로운 브랜치를 만들려면 git branch 명령 다음에 만들려는 브랜치 이름을 적음
고객사인 apple브랜치를 만들기 위해 다음과 같이 입력

4. main 브랜치 위에 apple 브랜치가 추가된 것을 확인할 수 있음(main 브랜치에서 작업하고 있음)
main
앞에 * 가 표시된 것은 여러 브랜치 가운데 현재 작업하는 브랜치를 나타냄

 

5. 브랜치가 추가된 후에는 커밋 로그 화면도 다르게 나타남
git log
명령을 사용해 커밋 로그를 확인해 보면 그동안 커밋 로그를 확인할 때 (HEAD -> main)라고 표시되던 곳에 apple 브랜치가 추가되면서 (HEAD -> main, apple)로 바뀌어 있음
저장소에 mainapple이라는 2개의 브랜치가 있고, HEAD -> main이므로 현재 작업하는 브랜치는 main 브랜치라는 의미

 

6. 앞에서 소개한 방법으로 google 브랜치와 ms 브랜치를 만들고 git branch 명령으로 저장소 안에 있는 모든 브랜치를 확인

 

 

새 커밋 추가하기

 

1.  git log로 확인해 보면 work 3 커밋 해시의 오른쪽에 main 브랜치를 비롯해 ms, google, apple 브랜치가 함께 표시되어 있음
, 이것은 main 브랜치뿐만 아니라 msgoogle, apple 브랜치에도 최신 커밋이 work 3이라는

2. work.txt 파일 안에 ‘main content 4’라는 내용을 추가한 후 ‘main work 4’라는 메시지와 함께 커밋

3. 작업 브랜치를 apple 브랜치로 바꿨을 때 어떤 변화가 생기는지 확인
git log
명령을 사용해서 현재 브랜치의 커밋 로그를 확인

4. apple 브랜치를 만들기 전까지 main 브랜치에 있던 커밋들은 그대로 apple 브랜치에도 적용되었으므로 work 3 커밋까지 표시됨
커밋 해시에서 HEADapple을 가리키는 것도 확인할 수 있음

 

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 명령을 사용해 커밋이 어떻게 저장되었는지 확인

 

5. 첫 번째 줄에 (HEAD -> apple)이라고 되어 있으니 현재 apple 브랜치로 전환한 상태
apple
브랜치의 최신 커밋이 apple work 4라는 걸 알 수 있음

 

 

브랜치와 커밋 관계 알아보기

 

1. git log 명령을 사용할 때 --branches 옵션을 추가하면 브랜치마다 최신 커밋을 한눈에 살펴볼 수 있음
이렇게 하면 main 브랜치에는 없고 apple 브랜치에만 있는 커밋, apple content 4 커밋을 보여줌

 

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

 

3. git log 명령에 --graph를 추가하면 그래프 형태의 브랜치과 커밋 관계를 볼 수 았음
4. 커밋 내역 왼쪽에 수직선(|)커밋과 커밋의 관계를 보여 줌
그래프를 살펴보면 apple 브랜치의 최신 커밋은 apple work 4인데, 점선을 따라 apple work 4 커밋의 부모를 찾아가 보면 work 3 커밋을 만나게 됨
, apple 브랜치에서는 work 3 커밋 다음에 apple work4 커밋이 만들어졌다는 뜻
5. main 브랜치의 최신 커밋은 main work 4이고 대각선을 따라가 부모 커밋을 찾아보면 work 3 커밋임
apple
브랜치의 커밋과 main 브랜치의 커밋이 같은 부모 커밋을 가지고 있음
, main 브랜치나 apple 브랜치는 work 3 커밋까지는 같고 그 이후부터 브랜치마다 다른 커밋을 만들었다는 사실을 알 수 있음

 

 

브랜치 사이의 차이점 알아보기

git log 명령에서 브랜치 이름 사이에 마침표 2개(..)를 넣는 명령으로 브랜치 간의 차이를 쉽게 확인할 수 있음

브랜치 이름과 마침표 사이는 공백 없이 입력하며, 마침표 왼쪽에 있는 브랜치를 기준으로 오른쪽 브랜치와 비교

를 들어 apple 브랜치를 기준으로 main와 비교하면 apple 브랜치에는 없고 main 브랜치에만 있는 main work 4 커밋을 보여 줌

 

 

서로 다른 파일 병합하기

1.터미널 창을 열고 홈 디렉터리로 이동
‘manual-2’
라는 디렉터리를 만들고 깃 저장소를 만들 텐데, 2가지 과정을 한꺼번에 처리
git
init 다음에 디렉터리 이름을 입력하면 새로운 디렉터리를 만들고 저장소를 초기화하는 과정을 한꺼번에 처리할 수 있음

2. manual-2 디렉터리로 이동한 후 ls -al 명령을 사용해서 .git/ 디렉터리가 만들어졌는지 확인

 

 

3. 빔에서 work.txt 파일을 만들고 ‘1’을 입력한 후 저장하고 ‘work 1’이라는 메시지와 함께 커밋

4.이제 ‘o2’라는 브랜치를 만듦
 

5.main 브랜치에 main.txt라는 파일을 하나 더 만듦
빔에서 ‘main 2’라고 입력한 후 저장하고 ‘main work 2’라는 메시지와 함께 커밋

6.지금까지 main 브랜치에서 work 1 커밋과 main work 2 커밋을 만들었음
이제 o2 브랜치로 전환
 

 

7.o2 브랜치에서 o2.txt라는 파일을 만들고, ‘2’라는 내용을 입력한 후 저장
이어서 o2.txt 파일은 ‘o2 work 2’라는 메시지와 함께 커밋

8.현재 커밋의 상태를 확인하기 위해 git log 명령을 사용
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 순으로 커밋이 생겼음
9.이제 o2 브랜치에서 작업이 모두 끝났다고 가정하면 o2 브랜치의 내용을 main 브랜치로 병합해야 함
브랜치를 병합하려면 먼저 main 브랜치로 전환해야 함

10.브랜치를 병합할 때는 git marge 명령 뒤에 가져올 브랜치 이름을 적음
main
브랜치를 기준으로 o2 브랜치를 가져와 병합하려면 다음과 같이 입력
11.빔이 자동으로 실행되면서 ‘Merge branch o2’라는 커밋 메시지가 나타남
브랜치를 병합하면서 만들어진 커밋 메시지인데 커밋 메시지를 수정할 수도 있고 그대로 사용해도 됨
{{ Esc }}
를 누르고 :wq를 입력해 내용을 저장한 후 편집기를 종료

 

12.ls -al 명령을 사용해 확인해 보면 o2 브랜치에 있던 o2.txt 파일이 main 브랜치에 합쳐짐

 

13.git log 명령으로 브랜치와 커밋이 어떻게 병합되었는지 확인할 수도 있음
o2 work 2
커밋이 main 브랜치에 병합되면서 ‘Merge branch o2’라는 커밋이 새로 생겼음
브랜치에서 서로 다른 파일을 병합하는 경우 이렇게 깃에서 간단히 해결할 수 있음

 

 

브랜치 병합하기

서로 다른 브랜치에서 한 문서의 다른 부분을 수정했을 때 병합하기 – (1)

 

1.홈 디렉터리로 이동한 후 ‘manual-3’이라는 깃 저장소를 만들고, manual-3 디렉터리로 이동

 

2.work.txt 파일을 만들고 오른쪽 그림과 같이 입력
나중에 work.txt 문서를 수정하고 병합할 것이므로 중간에 공백을 두 줄 둠
3.방금 만든 work.txt를 스테이지에 올리고 커밋
커밋 메시지는 ‘work 1’이라고 함

4.o2’라는 새로운 브랜치를 만듦
이제 main 브랜치와 o2 브랜치에는 모두 work 1 커밋이 있게 됨

 
5.양쪽 브랜치 모두 work.txt가 있는 상태에서 우선 main 브랜치에서 문서를 수정하기 위해 빔 편집기에서 work.txt 문서를 엶

 
6.work.txt 문서에는 #titlecontent가 각각 2개씩 있음
그중에서 첫 번째 content 다음 줄에 ‘main content 2’라고 입력한 후 저장

7.수정한 work.txt를 커밋하고 커밋 메시지는 ‘main work 2’라고 함

8.이제 o2 브랜치의 work.txt 파일도 수정하기 위해 먼저 o2 브랜치로 전환하고 work.txt 파일을 불러옴
9.이번에는 두 번째 content 다음 줄에 ‘o2 content 2’라고 입력하고 저장
10.수정한 work.txt 파일을 커밋하고 커밋 메시지는 ‘o2 work 2’라고 함
11.main 브랜치와 o2 브랜치 양쪽에서 work.txt 파일을 수정했지만 문서 안의 수정 위치는 다름
이 상태에서 병합하기 위해 o2 브랜치를 main 브랜치에 합치기 위해 main 브랜치로 전환

12.git merge 명령을 사용해 o2 브랜치를 main 브랜치로 끌어옴
13.빔이 자동으로 실행되면서 커밋 메시지가 나타남
메시지를 수정할 수도 있고 그대로 사용할 수도 있음
원하는 메시지를 작성하고 저장한 후 편집기를 종료
14.터미널 창에는 Auto-merging work.txt로 시작하는 병합 완료 메시지가 나타남
o2
브랜치의 work.txtmain 브랜치의 work.txt와 어떻게 병합되었는지 보려면 cat 명령을 사용해 work.txt 파일을 확인
15.main 브랜치의 수정 내용과 o2 브랜치의 수정 내용이 자연스럽게 하나의 파일에 합쳐진 것을 볼 수 있음
이렇게 같은 문서로 서로 다른 위치를 수정했을 경우 자동으로 합쳐 주는 기능이 있어 깃은 더욱 강력한 도구가 됨

 

브랜치 병합하기

서로 다른 브랜치에서 한 문서의 같은 부분을 수정했을 때 병합하기 – (2)

 

1.홈 디렉터리로 이동한 후 ‘manual-4’라는 깃 저장소를 만들고, manual-4 디렉터리로 이동
2.빔에서 work.txt 파일을 만들고 오른쪽 그림과 같이 입력
나중에 work.txt 문서의 같은 위치를 수정하기 위해 두 내용 사이에 빈 줄을 하나만 둠
3.방금 만든 work.txt를 스테이지에 올리고 커밋하고 커밋 메시지는 ‘work 1’이라고 함
4.이제 o2라는 브랜치를 만들면 o2 브랜치는 main 브랜치의 최신 커밋을 가져옴
, 브랜치 양쪽에 work.txt가 있음
5.현재 브랜치인 main 브랜치에서 work.txt를 수정
 
6.work.txt 문서에는 #titlecontent가 각각 2개씩 있음
첫 번째 content 다음 줄에 ‘main content 2’라고 입력한 후 저장

7.수정한 work.txt를 커밋하고 커밋 메시지는 ‘main work 2’라고 함

8.이제 o2 브랜치로 전환하고 work.txt 파일을 엶
9.main 브랜치에서 추가 내용을 입력했던 위치와 같은 곳에 ‘o2 content 2’라고 입력하고 저장
10.수정한 work.txt 파일을 커밋하고 커밋 메시지는 ‘o2 work 2’라고 함

11.main 브랜치와 o2 브랜치 양쪽에서 work.txt 파일을 수정했는데 공교롭게도 문서 안의 수정 위치가 같음
o2
브랜치를 main 브랜치에 병합하기 위해 먼저 main 브랜치로 전환한 후, git merge 명령을 사용해 o2 브랜치를 병합

12.이전에 git merge 명령을 실행했을 때처럼 빔이 자동으로 열리지 않고 경고 메시지가 나타남
이 메시지는 work.txt를 자동 병합하는 동안 충돌이 발생했다는 뜻
13.충돌이 생긴 문서는 자동으로 병합될 수 없으므로 사용자가 충돌 부분을 직접 해결한 후 커밋해야 함
충돌이 생긴 work.txt는 어떻게 되어 있는지 확인하기 위해 빔에서 work.txt를 열어 봄
14.main 브랜치에서 수정한 내용과 o2 브랜치에서 수정한 내용이 한꺼번에 나타남
<<<<<<< HEAD
와 가운데 가로줄(=======) 사이의 내용은 현재 브랜치, main 브랜치에서 수정한 내용
가로줄(=======)>>>>>>> o2 사이의 내용은 o2 브랜치에서 수정한 내용
양쪽 브랜치의 내용을 참고하면서 내용을 직접 수정해야 함
15.{{ A }}를 눌러 work.txt의 내용을 원하는 형태로 수정함
수정이 끝나면 문서에 있던 <<<<<<<< HEAD>>>>>>> o2, 가로줄(=======)을 삭제
문서를 저장하고 편집기를 종료
16.이제 수정한 work.txt를 스테이지에 올리고 커밋하면 됨
커밋 메시지는 merge o2 branch로 함
이렇게 해서 o2 브랜치에서 병합한 work.txt의 충돌을 해결하고 커밋을 끝냈음
17.git log 명령을 사용하면 지금까지 만든 브랜치와 커밋의 관계를 한눈에 확인

 

브랜치 병합하기

병합이 끝난 브랜치 삭제하기 – (1)

 

1.git branch 명령을 사용하면 현재 저장소에 어떤 브랜치가 있는지 확인할 수 있음
앞의 브랜치 병합 실습을 따라왔다면 지금 위치는 manual-4 디렉터리일 것이고, 여기에는 main 브랜치와 o2 브랜치가 있음
현재 브랜치는 main이므로 main 브랜치 앞에 * 표시가 되어 있음

 

2.저장소의 기본 브랜치는 main이므로 브랜치를 삭제하려면 main 브랜치에서 해야 함
현재 브랜치가 main 브랜치가 아니라면 main 브랜치로 전환
3.브랜치를 삭제할 때는 git branch 명령에 -d 옵션을 추가한 후 그 뒤에 삭제할 브랜치 이름을 사용
다음과 같이 o2 브랜치를 삭제

4.Deleted branch o2처럼 메시지가 나타나면 브랜치 삭제를 성공한 것
삭제한 브랜치는 같은 이름으로 다시 브랜치를 만들면 예전에 작업했던 내용이 그대로 나타남
, 브랜치를 삭제한다는 것은 저장소에서 완전히 없애는 것이 아니라 깃의 흐름 속에서 감추는 것

 

 

브랜치 병합하기

cherry-pick으로 병합하기 – (1)

1.홈 디렉터리에 cherry-pick 디렉터리를 깃 저장소로 만들고, cherry-pick 디렉터리로 이동
2.우선 새로운 브랜치를 만들기 전에 버전을 만들기 위해 init.txt 파일을 만든 후 스테이징해서init이라는 메시지와 함께 커밋
터미널에서는 세미콜론(;)으로 구분해서 여러 개의 명령을 한꺼번에 처리할 수 있음
그리고 명령어 중 touch는 빈 파일을 만듦
우리는 파일 내용을 수정하는 것이 아니라 버전이 필요하기 때문에 빈 파일을 만들고 스테이징과 커밋을 진행
3.이 상태에서 새로운 브랜치 topic을 만듦
그리고 깃 로그를 확인해 보면 init이라는 버전이 maintopic 브랜치 양쪽에 있는 것을 볼 수 있음
여기에서 –-all 옵션은 최신 커밋 뿐만 아니라 모든 커밋을 다 보여주기 위한 옵션
4.이제 main 브랜치에 m1m2라는 2개의 버전을 더 만들고 git log로 확인
main
브랜치는 최신 버전 m2를 가리키고 있고, topic 브랜치에는 init 버전 상태인 것을 볼 수 있음

5.topic 브랜치로 전환한 후, 앞에서와 같은 방법으로 t1, t2, t3 버전을 만듦

 
6.git log로 확인해 보면 main 브랜치는 init 버전부터 시작해서 m1, m2 버전으로 연결되어 있고, topic 브랜치는 init 버전부터 시작해서 t1, t2, t3 버전으로 연결
7.현재 2개의 브랜치가 있는데, topic 브랜치의 t2 버전에서 적용했던 내용을 main 브랜치에도 적용하고 싶을 때 사용하는 것이 바로 cherry-pick으로 topic 브랜치의 여러 버전 중 하나를 골라와서 병합하는 것
cherry-pick
을 사용하려면 우선 병합될 브랜치인 main 브랜치로 전환해야 함

8.topic 브랜치의 t2 버전만 병합하려면, cherry-pick 명령 다음에 t2에 해당하는 커밋 해시를 알려주면 됨
9.cherry-pick 후에 main 브랜치에 어떤 파일이 있는지 살펴보면
기존에 main 브랜치에 있던 init.txt, m1, m2 다음에 t2가 합쳐진 것을 볼 수 있음
10.그리고 깃 로그를 확인해 보면, topic 브랜치에서 t2가 있고, main 브랜치에도 t2가 추가되어 있음