개발은 보통 팀으로 진행한다.
이 경우 가장 문제가 되는 것은 코드에 동시에 손대는 사람이 여럿이라는 점이다.
각자 자신이 맡은 부분의 코드를 진행하고 여러 파일들이 연결되다 보면 남의 코드를 지워버리거나 변경사항을 제대로 반영하지 못해 꼬이는 등의 여러 문제점이 발생할 수 있다. 그리고 이는 시간 및 비용의 낭비를 가져온다.
이를 방지하기 위해 만들어진 것이 git과 같은 버전관리 시스템이다.
git에서는 소스 코드가 변경된 이력을 쉽게 확인할 수 있고 특정 시점에 저장된 버전과 비교하거나 특정 시점으로 되돌아갈 수도 있다.
또 내가 올리려는 파일이 누군가 편집한 내용과 충돌한다면 서버에 업로드 할 때 경고 메시지가 발생되어 수정할 기회를 충분히 준다.
git repository는 말 그대로 파일이나 폴더를 저장해 두는 곳을 의미한다.
여기에는 파일이 변경 이력 별로 구분되어 저장된다.
비슷한 파일이라도 일부 문구가 서로 다르면 다른 파일로 인식하여 파일을 변경 사항 별로 구분해 저장할 수 있다.
git은 원격 저장소와 로컬 저장소 두 종류의 저장소를 제공한다.
처음 들으면 repository라고 했을때 둘 중 어느걸 가르키는지 잘 모르겠고 이게 헷갈리면 또 멘붕이니 잘 알아두어야 한다.
기업 협업 나가서 팀장님이 이거에 대한 질문 하셨는데 몰라서 한참 어버버거렸다.
평소에는 내 PC의 로컬 저장소에서 작업하다가 작업한 내용을 공유하고 싶을 때에는 원격 저장소에 업로드한다.
물론 원격 저장소에서 다른 사람이 작업한 파일을 로컬 저장소로 가져올 수도 있다.
$ mkdir project //project라는 폴더를 만든다.
$ cd project //project라는 폴더에 들어간다.
$ git init //project라는 폴더를 git의 저장소로 등록하겠다.
$ git status
$ gid add <file> // 특정파일 등록
$ git add . // 모든파일 등록
$ git commit -m "커밋메시지"
$ git log // 저장소의 변경이력 확인
요 커밋메시지를 잘 쓰는 것 또한 매우 중요한데 여기에 대해서는 나중에 따로 포스팅 할거다!!
이 전까지는 로컬저장소에서의 과정이고 여기서부터는 원격저장소를 이용하여 로컬 저장소의 변경 이력을 공유하는 방법이다.
내 PC의 로컬 저장소에서 변경된 이력을 원격 저장소에 공유하려면 로컬 저장소의 변경 이력(commit까지의 과정)을 원격 저장소에 업로드해야 하는데 이를 push라고 한다. push를 하면 원격 저장소에 내 변경 이력이 업로드되어 원격 저장소와 로컬 저장소가 동일한 상태가 된다. 그러면 같은 원격저장소를 공유하는 팀원들이 내 결과물을 공유할 수 있게 된다.
$ git remote add <name> <url>
$ git remote add origin https://github.com/CHAI53/example
일단 원격 저장소를 추가하려면, remote 명령어를 사용한다.
git remote가 바로 원격 저장소를 관리할 수 있는 명령어이다.
(cf. 만약 origin이라는 원격 저장소를 지우고 싶다면 git remote remove origin)
은 원격저장소 명칭, 은 원격 저장소의 URL을 지정한다.
위의 예에서 보면 origin이라는 이름으로 https://github.com/[이름]/gitExample라는 원격 저장소 주소를 등록하는 것이다. URL은 보통 github 홈페이지에서 복사해온다.
이렇게 하면 origin이라는 이름을 사용하여 내가 만든 저장소에 접속할 수 있다.
이때 이름은 굳이 origin이라고 안 하고 다르게 써도 되지만 보통 이렇게들 쓴다.
$ git push -u <branchName> <repository>
$ git push -u origin master
저장소를 push 하려면, push 명령어를 사용한다.
는 push 경로의 주소, 은 push 할 브랜치를 지정한다.
실행 옵션에서 한번 -u를 지정하면 이후에는 그 브랜치명 지정을 생략할 수 있다.
단, 비어있는 원격 저장소에 최초로 push했을 때는 원격 저장소명과 브랜치명을 생략할 수 없다.
팀으로 작업할 경우 보통 한명이 초기세팅을 모두 하고 그 레이아웃을 모두가 똑같이 복제해서 시작하는 경우가 많다.
이 경우 원격저장소 내용을 지정한 로컬 폴더에 복제하는 과정이 필요하다.
$ git clone <repository> <directory>
$ git pull <repository> <branchName>...
는 원격저장소 경로의 주소, 은 땡겨올 브랜치를 지정한다.
이 경우 다른 사람들이 원격저장소에 push,merge한 내용들을 끌어와 업데이트할 수 있다.
<<<<<<< HEAD
commit 인덱스의 상태를 기록하기
=======
pull 원격 저장소의 내용을 가져오기
>>>>>>> 4c0182374230cd6eaa93b30049ef2386264fe12a
push를 했는데 내 코드의 내용과 다른 사람이 작성한 코드가 충돌하여 둘 중 어느 것을 선택할지 알 수 없을 때 merge conflict 신호가 발생한다.
이때는 당황할 필요 없이 코드를 직접 본 후 수정하면 되는데, 살릴 부분을 살리고 지울 부분은 지우고 나머지 쓸데 없는 기호들 역시 지우면 된다. VSCODE의 경우 클릭 한번으로 선택도 가능하다.
그리고 이후, 다시 add, commit, push의 과정을 거치면 된다.
다만 이때 유의할 점은 github 홈페이지가 아닌 에디터(like VSCODE)에서 수정한다는 것이다.
github 홈페이지에서 직접 수정할 경우 에디터에서 재수정을 거쳐야 된다.
쓸데없이 일을 두번하게 될 것이다. 경험담이다.
git을 사용한 작업에서 빠질 수 없는 브랜치는 다음 글에 적도록 하겠다.