정리 노트

Git(2) 본문

개념 정리

Git(2)

꿈만 꾸는 학부생 2022. 7. 6. 21:05
728x90

이 포스트는 국민대학교X프로그래머스 주관하는 '2022학년도 여름방학 인공지능 온라인 실전 부트캠프'에서 배운 내용을 정리하는 포스트입니다.

또한 포스트를 작성하는 과정에서 전에 배웠던 Git 사용법(학교 교수님의 자료)과 Git Documentation을 참고했습니다.

https://git-scm.com/book/ko/v2/

 

Git - Book

 

이 포스트를 읽기 전에 Git(1)을 읽으시는 것을 추천합니다. -> 2022.07.05 - [개념 정리] - Git(1)


Git의 Branch

학교 교수님의 강의 자료에 따르면 branch는 독립적으로 작업을 진행하기 위한 버전이라고 설명할 수 있습니다. Git은 기본적으로 기본 branch인 'master' branch에서 진행됩니다. 여기서 branch를 새로 생성하면 master branch와 독립적인 하나의 흐름을 만들어낼 수 있고, master branch와 생성된 branch는 각자 독립적으로 자신의 branch 안에서 작업이 가능합니다.

branch가 어떤 녀석인지 알아보기 위해 우선 branch를 하나 새로 만들어봅시다. 여기서부터는 branch의 효과를 잘 볼 수 있기 위해 새로운 폴더에서 commit을 어느 정도 보낸 상태에서 진행했습니다.

user@<your_name>:~/바탕화면/test$ ls
README.md
user@<your_name>:~/바탕화면/test$ git log
commit 9b0dcc10f2b278a2834ac2d0c56c4f10da802a98 (HEAD -> master)
Author: <Your Name> <your@email>
Date:   Tue Jul 5 12:00:49 2022 +0900

    Second Commit

commit 4a6ab4ea25f64e287657eb468c36e83bbdba09cc
Author: <Your Name> <your@email>
Date:   Tue Jul 5 11:59:52 2022 +0900

    First Commit
user@<your_name>:~/바탕화면/test$ cat README.md
# This is First Commit (master)
## This is Second Commit (master)

branch를 새로 생성하려면 아래와 같이 하시면 됩니다. 저는 새 branch의 이름을 'devel'이라 지었습니다. 현재 어떤 branch들이 있는지 확인하려면

-v 옵션으로 확인할 수 있습니다.

user@<your_name>:~/바탕화면/test$ git branch devel
user@<your_name>:~/바탕화면/test$ git branch -v
  devel  9b0dcc1 Second Commit
* master 9b0dcc1 Second Commit

현재 master와 devel, 두 개의 branch가 있다는 것을 확인할 수 있습니다. master 앞에 '*' 표시가 붙어있는 뜻은 현재 master branch에서 작업하고 있음을 의미합니다. branch를 옮겨 작업하려면 아래와 같이 옮길 수 있습니다.

user@<your_name>:~/바탕화면/test$ git checkout devel
'devel' 브랜치로 전환합니다.
user@<your_name>:~/바탕화면/test$ git branch -v
* devel  9b0dcc1 Second Commit
  master 9b0dcc1 Second Commit

이제 devel branch에서 파일을 수정하고 commit을 해봅시다.

user@<your_name>:~/바탕화면/test$ cat README.md
# This is First Commit (master)
## This is Second Commit (master)
### This is Third Commit (devel)
user@<your_name>:~/바탕화면/test$ git log
commit 14c8804a109a78daf637ad78c1a15314972facc1 (HEAD -> devel)
Author: <Your Name> <your@email>
Date:   Wed Jul 6 11:32:19 2022 +0900

    Third Commit

commit 9b0dcc10f2b278a2834ac2d0c56c4f10da802a98 (master)
Author: <Your Name> <your@email>
Date:   Tue Jul 5 12:00:49 2022 +0900

    Second Commit

commit 4a6ab4ea25f64e287657eb468c36e83bbdba09cc
Author: <Your Name> <your@email>
Date:   Tue Jul 5 11:59:52 2022 +0900

    First Commit

저희의 commit이 잘 반영되었음을 볼 수 있습니다. 여기서 master branch로 다시 넘어가면 저희의 세 번째 commit은 사라집니다.

이는 저희의 세 번째 commit은 master branch가 아닌 devel branch에서만 발생했기 때문에 master에는 반영되지 않은 것입니다.

user@<your_name>:~/바탕화면/test$ ls
README.md
user@<your_name>:~/바탕화면/test$ git log
commit 9b0dcc10f2b278a2834ac2d0c56c4f10da802a98 (HEAD -> master)
Author: <Your Name> <your@email>
Date:   Tue Jul 5 12:00:49 2022 +0900

    Second Commit

commit 4a6ab4ea25f64e287657eb468c36e83bbdba09cc
Author: <Your Name> <your@email>
Date:   Tue Jul 5 11:59:52 2022 +0900

    First Commit
user@<your_name>:~/바탕화면/test$ cat README.md
# This is First Commit (master)
## This is Second Commit (master)

Branch 간의 병합 - Fast Forward

devel branch의 commit을 master에도 반영시키려면 branch를 병합해야 합니다. 병합을 통해 master branch에게 "devel branch가 네 앞에 이미 몇 개의 commit을 더 만들었어!"라고 알려주는 거라 생각하면 이해하기 쉬울 것입니다.

이러한 경우, 갱신해야하는 branch(여기서는 master)로 넘어가서 진행해야 합니다.

user@<your_name>:~/바탕화면/test$ git checkout master
'master' 브랜치로 전환합니다
user@<your_name>:~/바탕화면/test$ git merge devel
업데이트 중 9b0dcc1..14c8804
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)
 user@<your_name>:~/바탕화면/test$ cat README.md
# This is First Commit (master)
## This is Second Commit (master)
### This is Third Commit (devel)
user@<your_name>:~/바탕화면/test$ git log
commit 14c8804a109a78daf637ad78c1a15314972facc1 (HEAD -> master, devel)
Author: <Your Name> <your@email>
Date:   Wed Jul 6 11:32:19 2022 +0900

    Third Commit

commit 9b0dcc10f2b278a2834ac2d0c56c4f10da802a98
Author: <Your Name> <your@email>
Date:   Tue Jul 5 12:00:49 2022 +0900

    Second Commit

commit 4a6ab4ea25f64e287657eb468c36e83bbdba09cc
Author: <Your Name> <your@email>
Date:   Tue Jul 5 11:59:52 2022 +0900

    First Commit

이러한 병합 방식을 'Fast-forward' 방식이라고 부릅니다. 그림으로 표현하자면 아래와 같습니다.

Fast Forward 예시

Branch 간의 병합 - 3-Way Merge

병합 방식은 이거 말고도 '3-Way' 방식도 존재합니다.

3-Way 방식을 실습해보기 위해 master, devel branch에서 각각 README.md 파일에 서로 다른 한 줄씩 추가해서 각 branch에서 commit을 해봅시다.

user@<your_name>:~/바탕화면/test$ git log
commit c18d32592193cdc7516fddfb60713f2d53b80286 (HEAD -> master)
Author: <Your Name> <your@email>
Date:   Wed Jul 6 20:12:56 2022 +0900

    Fourth Commit

commit 14c8804a109a78daf637ad78c1a15314972facc1 (devel)
Author: <Your Name> <your@email>
Date:   Wed Jul 6 11:32:19 2022 +0900

    Third Commit

commit 9b0dcc10f2b278a2834ac2d0c56c4f10da802a98
Author: <Your Name> <your@email>
Date:   Tue Jul 5 12:00:49 2022 +0900

    Second Commit

commit 4a6ab4ea25f64e287657eb468c36e83bbdba09cc
Author: <Your Name> <your@email>
Date:   Tue Jul 5 11:59:52 2022 +0900

    First Commit
user@<your_name>:~/바탕화면/test$ cat README.md
# This is First Commit (master)
## This is Second Commit (master)
### This is Third Commit (devel)
#### This is Fourth Commit (master)
user@<your_name>:~/바탕화면/test$ git checkout devel
'devel' 브랜치로 전환합니다
user@<your_name>:~/바탕화면/test$ git log
commit cc2fa5427d19210483b3908a97f752acabfb66da (HEAD -> devel)
Author: <Your Name> <your@email>
Date:   Wed Jul 6 20:13:29 2022 +0900

    Fifth Commit

commit 14c8804a109a78daf637ad78c1a15314972facc1
Author: <Your Name> <your@email>
Date:   Wed Jul 6 11:32:19 2022 +0900

    Third Commit

commit 9b0dcc10f2b278a2834ac2d0c56c4f10da802a98
Author: <Your Name> <your@email>
Date:   Tue Jul 5 12:00:49 2022 +0900

    Second Commit

commit 4a6ab4ea25f64e287657eb468c36e83bbdba09cc
Author: <Your Name> <your@email>
Date:   Tue Jul 5 11:59:52 2022 +0900

    First Commit
user@<your_name>:~/바탕화면/test$ cat README.md
# This is First Commit (master)
## This is Second Commit (master)
### This is Third Commit (devel)
#### This is Fifth Commit (devel)

이제 이 상황에서 master branch에게 devel branch의 상태로 따라가라는 의미로 master branch에서 merge를 실행해보면 충돌이 발생합니다. 이 상황이 저희가 3-Way 병합 방식을 사용해야 하는 이유입니다.

user@<your_name>:~/바탕화면/test$ git merge devel
자동 병합: README.md
충돌 (내용): README.md에 병합 충돌
자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.

이럴 때, 충돌된 부분을 텍스트 편집기 등을 통해 수정하려 할 때 아래와 같이 보입니다. 저 같은 경우는 vi 에디터를 사용합니다.

# This is First Commit (master)
## This is Second Commit (master)
### This is Third Commit (devel)
<<<<<<< HEAD
#### This is Fourth Commit (master)
=======
#### This is Fifth Commit (devel)
>>>>>>> devel

HEAD라 표시된 부분의 밑줄이 현재 branch에서 작성한 부분이고, devel이라 표시된 부분의 윗 줄이 devel branch에서 작성한 부분입니다. 이 두 문장이 서로 충돌하여 병합이 일어나지 않았습니다. 그래서 둘 중 하나를 골라야 합니다. 저는 master branch에서 썼던 문장을 골랐습니다.

user@<your_name>:~/바탕화면/test$ cat README.md
# This is First Commit (master)
## This is Second Commit (master)
### This is Third Commit (devel)
#### This is Fourth Commit (master)

이제 이 수정 사항을 commit 하면 충돌 상황이 해결되었습니다. 이 과정을 3-Way 병합 방식이라 합니다.

user@<your_name>:~/바탕화면/test$ git log
commit 0cae060d53cc0660f34d3b1d707d330f653b4959 (HEAD -> master)
Merge: c18d325 cc2fa54
Author: <Your Name> <your@email>
Date:   Wed Jul 6 20:28:38 2022 +0900

    Sixth Commit

commit cc2fa5427d19210483b3908a97f752acabfb66da (devel)
Author: <Your Name> <your@email>
Date:   Wed Jul 6 20:13:29 2022 +0900

    Fifth Commit

commit 14c8804a109a78daf637ad78c1a15314972facc1
Author: <Your Name> <your@email>
Date:   Wed Jul 6 11:32:19 2022 +0900

    Third Commit

commit 9b0dcc10f2b278a2834ac2d0c56c4f10da802a98
Author: <Your Name> <your@email>
Date:   Tue Jul 5 12:00:49 2022 +0900

    Second Commit

commit 4a6ab4ea25f64e287657eb468c36e83bbdba09cc
Author: <Your Name> <your@email>
Date:   Tue Jul 5 11:59:52 2022 +0900

    First Commit

3-Way 병합을 그림으로 표현하자면 아래와 같습니다.

3-Way Merge 예시

3-Way 병합은 저도 아직 완벽하게 잡히지 않는 방식이라 정확한 설명은 아래의 사이트를 참고하길 바랍니다.

https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%99%80-Merge-%EC%9D%98-%EA%B8%B0%EC%B4%88

Branch 삭제

이제 branch를 더 이상 사용할 일이 없는 경우, branch를 삭제할 수 있습니다.

user@<your_name>:~/바탕화면/test$ git branch -d devel
devel 브랜치 삭제 (과거 cc2fa54).
user@<your_name>:~/바탕화면/test$ git branch -v
* master 0cae060 Sixth Commit

Github을 이용하고 싶으신 분들은 아래의 글을 읽어보시길 바랍니다.

2022.07.06 - [환경 설정 및 설치] - Github 원격 저장소 생성 및 로컬 저장소와 연결

728x90

'개념 정리' 카테고리의 다른 글

영상 처리에서의 edge 검출  (0) 2022.10.09
영상 처리의 세 가지 기본 연산  (2) 2022.09.21
Git(1)  (0) 2022.07.05
Python의 list, tuple, dictionary, set  (0) 2022.07.02
wsgiref 모듈과 같이 WSGI 알아보기(Python)  (0) 2022.06.25