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 파일도 수정이 반영된 것을 알 수 있습니다.