git?

개발은 보통 팀으로 진행한다. 여러 사람이 동시에 개발할 경우 가장 문제가 되는 것은 코드에 손대는 사람이 여럿이라는 점이다. 각자가 자신이 맡은 부분의 코드를 진행시키고 여러 코드가 담긴 파일들이 연결되다 보면 남이 써놓은 코드를 지워버리거나 변경사항을 제대로 반영하지 못해 꼬이는 등의 여러가지 문제점이 발생할 수 있다. 그리고 이것은 시간을 포함한 비용의 낭비를 가져온다. 이를 방지하기 위해 만들어진 것이 git과 같은 버전관리 시스템이다.
git에서는 소스 코드가 변경된 이력을 쉽게 확인할 수 있고 특정 시점에 저장된 버전과 비교하거나 특정 시점으로 되돌아갈 수도 있다. 또 내가 올리려는 파일이 누군가 편집한 내용과 충돌한다면 서버에 업로드 할 때 경고 메시지가 발생되어 수정할 기회를 충분히 준다.

git repository는 말 그대로 파일이나 폴더를 저장해 두는 곳을 의미한다. 이것이 제공하는 좋은 점 중 하나는 파일이 변경 이력 별로 구분되어 저장된다는 점이다. 비슷한 파일이라도 실제 내용 일부 문구가 서로 다르면 다른 파일로 인식하기 때문에 파일을 변경 사항 별로 구분해 저장할 수 있다.
git은 원격 저장소와 로컬 저장소 두 종류의 저장소를 제공한다. 처음 들으면 repository라고 했을때 둘 중 어느걸 가르키는지 잘 모르겠고 이게 헷갈리면 또 멘붕이니 잘 알아두어야 한다.

remote Repository: 파일이 원격 저장소 전용 서버에서 관리되며 여러 사람이 함께 공유하기 위한 저장소
local Repository: 내 PC에 파일이 저장되는 개인 전용 저장소

평소에는 내 PC의 로컬 저장소에서 작업하다가 작업한 내용을 공유하고 싶을 때에는 원격 저장소에 업로드한다. 물론 원격 저장소에서 다른 사람이 작업한 파일을 로컬 저장소로 가져올 수도 있다.

git 사용법

1. 로컬저장소 만들기

$ mkdir project
$ cd project
$ git init

project라는 폴더를 만든다.
-> project라는 폴더에 들어간다.
-> project라는 폴더를 git의 저장소로 등록하겠다.

2. 파일 커밋하기

$ git status
$ gid add <file>  // 특정파일 등록
$ git add .  // 모든파일 등록

git status: git의 관리 하에 있는 폴더의 작업트리와 인덱스 상태를 확인.
git add: 파일을 인덱스에 등록.

$ git status
$ git commit -m "커밋메시지"
$ git log // 저장소의 변경이력 확인

git commit: 로컬 저장소에 저장. 커밋메시지 없이는 저장되지 않음.

3. 원격저장소에 푸쉬하기

이 앞 과정까지가 로컬저장소에서의 과정이라고 하면 여기서부터는 원격저장소를 이용하여 로컬 저장소의 변경 이력을 공유하는 방법이다.

내 PC의 로컬 저장소에서 변경된 이력을 원격 저장소에 공유하려면 로컬 저장소의 변경 이력(commit까지의 과정)을 원격 저장소에 업로드해야 한다.

웹 상의 원격 저장소로 변경된 파일을 업로드하는 것을 push라고 한다. push 를 실행하면, 원격 저장소에 내 변경 이력이 업로드되어, 원격 저장소와 로컬 저장소가 동일한 상태가 된다.

이 경우 같은 원격저장소를 공유하는 팀원들이 나의 결과물을 공유할 수 있게 된다.

일단 원격 저장소를 추가하려면, remote 명령어를 사용한다. <name>은 등록명, <url>은 원격 저장소의 URL을 지정한다.

$ git remote add <name> <url>

이때 url은 github 홈페이지에서 복사해오는 것이 일반적이다.

$ git remote add <name> <url>
$ git push -u origin master

저장소를 push 하려면, push 명령어를 사용한다. <repository>는 push 경로의 주소, <refspec>은 push 할 브랜치를 지정한다.
실행 옵션에서 한번 -u를 지정하면 이후에는 그 브랜치명 지정을 생략할 수 있다. 단, 비어있는 원격 저장소에 최초로 push했을 때는 원격 저장소명과 브랜치명을 생략할 수 없다.

4. 원격저장소 복제하기

다른 사람들과 함께 작업할 경우 처음에 초기작업된 전체 레이아웃을 모두가 똑같이 복제해와 시작할 수 있다.
이 경우 원격저장소 내용을 지정한 폴더에 복제한다.

$ git clone <repository> <directory>

5. 원격저장소에 저장된 내용 땡겨오기

$ git pull <repository> <refspec>...

이 경우 다른 사람들이 원격저장소에 push,merge한 내용들을 끌어와 업데이트할 수 있다.

6. merge conflict 발생시 해결

  <<<<<<< HEAD
commit 인덱스의 상태를 기록하기
=======
pull 원격 저장소의 내용을 가져오기
>>>>>>> 4c0182374230cd6eaa93b30049ef2386264fe12a

push를 했는데 내 코드의 내용과 다른 사람이 작성한 코드가 충돌하여 둘 중 어느 것을 선택할지 알 수 없을 때 merge conflict 신호가 발생한다. 이때는 당황하지 않고 코드를 직접 본 후 수정하면 되는데, 살릴 부분을 살리고 지울 부분은 지우고 나머지 쓸데 없는 기호들 역시 지우면 된다.
그리고 이후, 다시 add, commit, push의 과정을 거치면 된다.
다만 이때 유의할 점은 github 홈페이지가 아닌 에디터(like VS code)에서 수정한다는 것이다. github홈페이지에서 직접 수정할 경우 에디터에서 재수정을 거쳐야 된다. 쓸데없이 일을 두번하게 될 것이다. 경험담이다.

git을 사용한 작업에서 빠질 수 없는 브랜치는 다음 글에 적도록 하겠다.