Git 뿌수기

03. [Git 뿌수기] 3주차 내용 정리 (pull, clone, branch, merge, conflict)

drizzle0925 2021. 9. 2. 00:06
728x90

pull

파일 다운로드

원격 저장소에서 로컬 저장소로 업데이트하려면 풀(pull)을 실행합니다.

pull을 실행하면, 원격 저장소에서 최신 변경 이력을 다운로드하여 내 로컬 저장소에 그 내용을 적용합니다.

 

로컬 저장소에 pull 한 데이터가 어떻게 반영되는지 아래 그림을 참고합니다.

아래 그림에서 윗 그림 내용을 pull 하면 fast-forward병합이 이루어집니다.

 

그림 속에 master는 로컬 저장소의 master 브랜치, origin/master는 원격 저장소 origin의 master브랜치를 나타냅니다.

 

그러나 원격 저장소의 master 브랜치와 로컬 저장소의 master 양쪽에 변경 사항이 생긴 경우는 충돌이 발생하고 수동으로 통합할 필요가 있습니다. 

$ git pull <원격저장소 이름> <원격저장소 브랜치이름>

// 예시
$ git pull origin master

clone

원격 저장소 복제하기

원격 저장소를 복제하려면 클론(clone)이라는 조작을 수행합니다.

복제란 원격 저장소의 내용을 통째로 다운로드 하는것을 말합니다. 복제한 저장소를 다른 pc에서 로컬 저장소로 사용할 수 있게 됩니다.

 

원격저장소 내용을 다운로드할 폴더 이름은 생략이 가능하며, 생략할 경우 원격 저장소에 저장된 이름으로 로컬 컴퓨터에 다운로드됩니다.

$ git clone <원격저장소 url> <원격저장소 내용을 다운로드할 폴더이름>

 


branch

브랜치 생성하기

브랜치는 branch란 명령어로 만들 수 있습니다.

$ git branch <branchname>

 

google이라는 브랜치를 만들어 보겠습니다.

$ git branch google

그랬더니 Not a valid object name: 'master'라는 에러가 발생됩니다.

한 번도 commit 한 적 없는 브랜치라서 그럽니다.

아무 파일이나 commit 하고 다시 한번 브랜치를 작성해보겠습니다.

 

 

파일을 생성하고 커밋합니다.

 

다시한번 google 브랜치를 생성합니다.

$ git branch google

 

 

브랜치 목록보기

옵션을 지정하지 않고 branch 명령어를 입력하면 브랜치 목록 전체를 확인할 수 있습니다. 앞부분에 *이 붙어있는 것이 현재 선택된 브랜치입니다. 현재 선택된 브랜치는 master입니다.

$ git branch

 

브랜치 전환하기

브랜치를 사용하여 어떤 작업을 수행하려면, 이 브랜치를 사용하겠다고 명시적으로 지정해 주어야 합니다. 이때 사용하는 명령어가 바로 checkout입니다. 체크아웃(checkout)이란, 내가 사용할 브랜치를 지정하는 것을 의미합니다.

 

다음과 같이 checkout 명령어 뒤에 사용할 브랜치 이름을 입력하면 됩니다.

$ git checkout <branch>

 

google 브랜치로 전환해 보겠습니다.

$ git checkout google

 

브랜치 생성과 전환을 동시에 하기

checkout에 -b 옵션을 지정해주면 브랜치를 생성과 동시에 전환까지 같이 해줍니다.

$ git checkout -b <branchname>

 

master브랜치에서 naver브랜치를 생성해보겠습니다.

git checkout -b naver

 

브랜치 삭제하기

브랜치를 삭제하려면 branch 명령에 -d 옵션을 지정하여 실행하면 됩니다.

$ git branch -d <branchname>

 

naver 브랜치를 삭제해보겠습니다.

우선 브랜치를 삭제할 때는 해당 브랜치에 있어서는 안 됩니다.

master 브랜치로 변경합니다.

 

아래 명령어를 입력합니다.

$ git branch -d naver

naver 브랜치가 삭제된 것을 확인할 수 있습니다.

 

브랜치 병합하기

브랜치 병합은 merge 명령어로 실행합니다. 

$ git merge <commit id>
$ git merge <branch name>

이 명령어에 병합할 커밋 이름을 넣어 실행하면, 지정한 커밋 내용이 HEAD가 가리키고 있는 브랜치에 넣어집니다. HEAD는 현재 사용 중인 브랜치에 위치하게 됩니다.

google 브랜치에 google.txt를 생성 후 master 브랜치에 병합해보겠습니다.

 

google 브랜치로 전환합니다.

$ git checkout google

 

google.txt 파일을 생성하고 add, commit 합니다.

$ vim google.txt
$ git add google.txt
$ git commit -m "google 1"

google 1 커밋이 생성되었습니다.

 

병합(merge)할 브랜치로 이동합니다.

master 브랜치로 이동하겠습니다.

$ git checkout master

 

log를 확인합니다.

$ git log --oneline --all --graph

 

merge 명령어를 입력합니다.

merge 명령어는 커밋 아이디를 입력해도 되고 브랜치 이름을 입력해도 됩니다. 

$ git merge d5f8baa
$ git merge google

커밋 아이디로 병합한 경우

google.txt 파일이 추가되었습니다.

 

log를 다시 한번 확인해보면 커밋 위치가 google과 같은 것을 알 수 있습니다.

 

파일도 잘 추가되었습니다.

 

브랜치 이름으로 병합한 경우

커밋 아이디와 동일하게 잘 병합되는 것을 확인할 수 있습니다.


conflict

충돌

같은 파일에 변경사항이 생겼을 경우에는 충돌이 발생할 수 있습니다.

git은 충돌이 발생한 경우에 한해서 수동으로 병합할 것을 요구합니다.

google 브랜치와 master 브랜치에 있는 common.txt 파일을 수정하여 충돌을 일으켜 보겠습니다.

 

master브랜치의 common.txt에는 2라는 내용을 추가합니다.

 

google 브랜치의 common.txt에는 3이라는 내용을 추가합니다.

 

그리고 다시 master로 이동하고

 

병합(merge)을 실행합니다.

common.txt에서 CONFLICT(충돌) 발생해서 자동 병합에 실패했다는 메시지가 나옵니다.

그리고 브랜치 이름이 적힌 곳에 MEGING이라고 문자가 추가되어 있습니다.

 

상태를 확인해보니 둘 다 변경되었다는 both modified가 적혀있습니다.

$ git status

 

파일 안 내용을 확인해보겠습니다.

<<<<<HEAD가 현재 내 브랜치에서 적용되어있는 내용을 가리킵니다.

그 아래로 ====라는 경계선이 있고

>>>>>google이라고 표시된 부분이 병합할 곳의 적용되어 있는 내용을 가리킵니다.

필요 부분을 수정하여 add, commit 하면 충돌을 해결할 수 있습니다.

1, 2, 3을 전부 반영하도록 하겠습니다.

 

-m 옵션을 주지 않고 commit 까지면 입력하면 기본으로 설정된 에디터가 열리면서 commit 내용을 입력할 수 있게 됩니다.

$ git commit

 

Merge branch 'google'인 상태로 커밋하도록 하겠습니다.

에디터를 닫습니다.

 

log를 확인해보면 merge 된 커밋을 확인할 수 있습니다.

common.txt 파일도 수정이 반영된 것을 알 수 있습니다.

728x90