1) 복제하기 Clone/ Cloning
$ git clone 복사한 주소 복제할 디렉터리
: 복사한 주소 (원격 저장소)를 복제할 디렉터리 (지역 저장소)로 복사하는 것
하나의 원격저장소를 kim과 jeong이 함께 이용한다고 가정해보겠습니다.
우선 원격저장소인 doit-git 을 지역저장소인 kim , jeong 에 복사해보겠습니다.
깃허브에서 복사할 원격저장소인 doit-git 에 들어간 후, clone or download 를 선택합니다.
그리고 복사하기 버튼을 눌러서 복사합니다.
(이때, ssh로 하고 싶으신 분은 Use SSH 를 선택하시면 됩니다.)
원격저장소 'doit-git'
$ git clone 복사한 주소 복제할 디렉터리 명령어를 이용해서 kim과 jeong에 복제합니다.
git clone은 '복제할 디렉터리'가 없다면 자동으로 생성한 후 복제합니다.
참고)
$ git clone 복사한 주소 .
: 원격저장소를 현재 디렉터리( . )에 복제
git clone
지역저장소 jeong과 kim에 같은 내용(doit-git)이 복제되었는지 확인해보겠습니다.
kim의 git log
$ cd ..
: 상위 디렉터리로 이동
현재 kim 디렉터리에 있는데, jeong으로 이동하기 위해서는 kim의 상위 디렉터리로 이동해야합니다.
따라서 상위디렉터리로 이동 후 jeong으로 이동합니다.
jeong의 git log
이 둘을 비교해보면 3개의 커밋이 일치하다는 것을 알 수 있습니다.
또한, 원격 저장소를 복제하면 자동으로 지역저장소와 원격저장소가 연결됩니다.
$ git remote -v 명령어로 연결된 원격저장소를 확인 할 수 있습니다.
지역저장소(jeong)와 원격저장소(doit-git)가 연결됨
지역저장소 kim 디렉터리의 hello.txt에 'kim_first'라는 문구를 추가했습니다.
그리고 commit -am을 통해 스테이징과 커밋을 함께 했습니다.
(한 번 커밋된 적이 있어서 스테이징&커밋 한 번에 가능)
$ git push를 통해 수정한 내용을 원격저장소인 doit-git에 push했습니다.
kim의 hello.txt 수정 후 원격저장소에 push
깃허브의 원격저장소인 doit-git에 들어가서 commits를 클릭하면
다음과 같이 지역저장소인 kim에서 커밋한 'add kim-first'가 적용된 것을 알 수 있습니다.
원격저장소(doit-git)의 커밋이력
2) 원격저장소에서 지역저장소로 내려받기
지역저장소 jeong 입장에서는 원격저장소 doit-git이 초기에 복제했던 상태와 달라졌습니다.
그래서 원격저장소의 새 커밋을 가져와야합니다.
$ cd ~/jeong
: $ cd ~ 과 $ cd jeong 을 합친 명령어
지역저장소 jeong으로 이동
$ git pull
: 원격저장소 -> 지역저장소
원격저장소(doit-git)에서 지역저장소(jeong)으로 가져옴
$ vim hello.txt 명령어로 jeong 내부에 있는 hello.txt가 어떻게 바뀌었는지 확인해보았습니다.
kim에서 수정한 'kim_first'가 추가되어있는 것을 확인 할 수 있습니다.
pull 후 jeong의 hello.txt
※ 이렇게 하나의 원격 저장소 에 둘 이상의 지역저장소 를 연결해서 이용한다면
항상 시작할 때 pull 을, 수정 후 push 를 하는 것을 습관화 하는 것이 좋습니다.
3) 지역저장소, 원격저장소 최종 커밋
우선 지역저장소 kim으로 이동합니다.
지역저장소 kim
$ git log --oneline 명령어를 통해 커밋 상태를 확인해보았습니다.
이 때, 최종커밋인 add kim-first 앞에 있는 문구는 (HEAD -> master , origin/master , origin/HEAD)입니다.
여기서 HEAD->master 는 지역저장소의 최종 커밋 을,
origin/master 는 원격저장소의 최종 커밋 을 의미합니다.
아까 add kim-first를 지역저장소인 kim에서 만들고, 원격저장소로 pull했으니 둘의 최종 커밋이 add kim-first겠죠?
커밋상태 확인
kim에 새로 'create hello 3'라는 커밋을 추가하자 HEAD->master가 가리키는 것을 알 수 있습니다.
그리고 아직 push하지 않았으므로 원격저장소의 최종 커밋은 여전히 'add kim-first'임을 알 수 있습니다.
지역저장소 kim에 create hello 3커밋 추가
$ git status 명령어로 깃의 상태를 확인해보니,
지역브랜치가 원격브랜치보다 1 commit 앞서있으므로, "git push"를 이용해서 푸쉬 하라는 메시지가 나타납니다.
git status
$ git push 명령어로 원격저장소에 올려주면
다음과 같이 HEAD->master (지역)와 origin/master (원격) 둘 다 create hello 3커밋을 가리키는 것을 알 수 있습니다.
push 후 커밋로그
4) 원격 브랜치의 정보만 가져오기
$ pull 명령어는 원격저장소의 커밋을 바로 지역저장소에 합쳐줍니다.
하지만 합치기 전에 원격저장소에 어떤 변화가 있었는지 확인하는게 더 좋겠죠?
이 때 사용하는 명령어가 fetch(가져오다) 입니다.
$ git fetch
: 원격 저장소의 정보를 가져옴
위의 예시들을 잘 따라왔다면 현재 kim과 원격에는 'create hello 3'커밋이 있지만,
jeong에는 없는 상태 일 것 입니다.
jeong디렉터리로 이동 후 $ git fetch 명령어로 원격저장소 doit-git에서 가져옵니다.
그리고 ls -al로 상세 내역을 봅니다.
원격저장소에 hello3.txt파일을 올렸지만, 나타나지 않습니다
더보기
[ jeong에서 확인한 git log ]
$ git log 로 확인을 해보면 지역저장소의 최신 커밋인 HEAD -> master만 있는 것을 알 수 있습니다.
즉, 아직 jeong에 합치지 않아 원래 jeong에 있던 것만 나타납니다.
$ git staus를 통해 확인해보면 origin/master(원격)에 비해 1 commit 뒤처져 있으니
"git pull"을 통해 원격저장소에서 가져오라는 메시지가 나타납니다.
$ git checkout FETCH_HEAD
: FETCH_HEAD 브랜치로 이동
fetch로 가져온 최신 커밋 정보는 FETCH_HEAD에 있습니다.
따라서 FETCH_HEAD로 이동 후 git log로 확인해보겠습니다.
FETCH_HEAD로 이동
origin/master, origin/HEAD가 표시된 'create hello 3' 커밋이 원격브랜치의 최신 커밋임을 알 수 있습니다.
이렇게 fetch를 통해서 원격브랜치의 상태를 확인 할 수 있습니다.
확인 후 원격브랜치의 최신 커밋을 현재 브랜치에 합치고 싶으면
$ git merge FETCH_HEAD 명령어로 FETCH_HEAD의 커밋을 병합 할 수 있습니다.
우선 master브랜치로 이동 후 FETCH_HEAD 브랜치를 병합합니다.
다시 jeong의 git log를 확인해보면 다음과 같이 create hello 3에 HEAD->master, origin/master가 가리키는 것을 알 수 있습니다.
jeong의 git log
※ $ git pull
= $ git fetch + $ git merge FETCH_HEAD
즉, git pull 명령어를 이용하면
원격브랜치를 가져오기(git fetch)와 병합하기(FETCH_HEAD)를 한 번에 할 수 있습니다.
---------------------------------------------------------------------------------------------------
본 글은 Do it! 깃&깃허브 입문 책을 참고하여 작성하였습니다.
https://book.naver.com/bookdb/book_detail.nhn?bid=15910099