원격 저장소를 통해 디렉토리의 버전을 백업하고 관리해주는 서비스. 대표적으로 github와 gitlab이 있다. github는 가장 많이 사용하는 서비스로, public Repository는 무료이지만 private Repository는 유료이다.(과금주의) 반면, gitlab은 public, private Repository 둘 다 무료이다.
- git remote add origin 원격저장소 주소 : github에서 만든 원격 저장소(Remote Repository)와 작업 환경 저장소(Local Repository)를 연결한다. +origin이 들어가는 자리는 원래 원격저장소의 별칭을 저장하는 자리인데, 통상적으로 원격저장소를 origin이라 부른다.
- git remote -v : Local Repository와 연결된 원격저장소의 주소를 출력한다.
- git push origin 브랜치명 : Local Repository에 있는 모든 파일을 Remote Repository에 저장한다.
------------------push가 완료되면 github의 Remote Repository에 업로드 된다.-------------------
+아래와 같이 github에서 Local repository에서 commit한 모든 버전들을 확인할 수 있다.
- git clone 원격저장소 주소 : 현재 위치한 디렉토리에 Remote Repository를 복제하여 Local Repository를 만든다.
- git pull origin 브랜치명 : 원격저장소 해당 브랜치에 저장된 버전을 Local Repository에 가져와 병합한다.
- git branch : 현재 원격저장소의 어떤 branch와 연결되어 있는지 출력한다. (기본: master)
- git branch 브랜치명 : 현재 원격 저장소에 브랜치를 생성한다. 이때, Local Repoeitory의 버전을 저장하고 있다.
- git log --all --oneline : commit된 보든 버전을 보기 쉽게 보여준다.
+아래 사진을 보면 HEAD는 master branch를 가리키고 있고(현재 작업중인 branch가 master이고), master, ms, google, apple branch에 work3 버전이 저장되어 있음을 알 수 있다.
+새로운 버전 work4를 commit한 후에는 현재 작업중인 master branch에 새로운 버전 work4가 저장되었음을 알 수 있다.
+여기서 git checkout apple 명령어를 통해 master branch에서 apple branch로 이동하면, 버전이 work3로 바뀌면서 work.txt의 내용이 바뀜을 알 수 있다. (브랜치 이동을 통한 버전 변경)
- git log --all --oneline --graph : log의 모든 정보를 한줄로 그래프 형태로 출력해준다. (버전의 부모자식 관계 알 수 있다) -> 평행우주와 같은 느낌
정리: branch를 이동하며 버전을 관리할 수 있다. 또한, branch를 이용하면 버전간에 부모자식 관계가 생긴다.
두 개의 branch를 비교하여 병합한다.
?부분은 깃이 해결할 수 없으니, 사용자가 직접 무엇을 채택할 지 지정해야 한다.
1. 서로 다른 파일 merge
- git merge 병합할 branch : 현재 위치한 branch에 병합하여 새로운 버전을 만든다.
+위 사진 실행 순서 : master branch에 work 1을 commit -> another branch를 생성 -> master branch에 master work 2를 commit -> another branch로 이동 후 another work 2를 commit -> master branch로 이동 -> git merge another 명령어를 이용하여 master branch에 another branch 병합 -> master work 2와 another work 2를 조상으로 갖는 새로운 merge commit이 일어난다. (다른 파일들이 모두 합쳐져 새로운 버전이 형성된다. )
2. 같은 파일 다른 부분 merge
- git merge 병합할 branch
아래 사진은 another branch의 work.txt
아래 사진은 master branch의 work.txt
아래 사진은 병합된 branch의 work.txt (두 파일의 다른 부분을 자동으로 합쳤음)
3. 같은 파일 같은 부분 merge
git merge 병합할 branch(X)
깃은 두 개의 branch가 같은 이름의 파일에서 같은 부분이 수정된 파일을 병합할 때, conflict(충돌)이 일어난다.
아래 사진은 another branch의 work.txt
아래 사진은 master branch의 work.txt
이 상태에서 병합 하게되면 아래와 같은 메세지가 출력되면서 merge에 실패한다.
그 상태로 work.txt에 들어가보면 1은 현재 HEAD가 가리키는 branch의 수정된 부분, 2는 another branch의 수정된 부분으로, 깃이 자동으로 병합할 수 없으니, 사용자가 해결해야 한다고 알려주고 있다.
나는 여기서 아래와 같이 수정하고 nano를 빠져나와 commit을 한다.
master|MERGING을 보면 현재 merge를 master branch에서 진행하고 있음을 알 수 있다.
commit을 한 후에는 병합이 성공했음을 알 수 있다.
cat work.txt를 이용해 병합한 work.txt를 확인해 보면 아까 위에서 병합 중에 내가 수정한 대로 병합되었음을 알 수 있다.
병합할 두 branch의 공통의 조상(base)과 두 branch를 비교하여 병합한다.
base와 비교하여 수정된 파일을 병합에 채택한다.
예제
이 상태에서 here branch와 there branch를 merge
HEAD와 branch, checkout에 관한 영상들 (생활코딩)
https://youtu.be/6WDDeSDZcwM
https://youtu.be/8npBGfy47y0