안녕하세요 오늘은 자주 사용하는 Git에 간략하게 써보겠습니다.
오늘의 목표는 1. Git의 구조를 설명하고, 2. 이해를 바탕으로 Git을 간단하게 사용해보는 것입니다.
Git??
흔히 Git을 이용해 버전관리를 한다, 협업툴로 좋다, 이런 표현들을 하시는데 왜 그럴까요??
작업한 코드를 서버로 전송, 수신할 수 있도록 하고, 이력을 남겨서 관리할 수 있는 도구입니다.
Git의 구조부터 설명드리면서 어떻게 사용되는지 말씀드리겠습니다.
Git 구조
저장 구조
Git에서는 서버에 저장되기까지 3가지 구조가 존재합니다.
현재 일하고 있는 OS 디렉토리 내에 코드들이 존재할텐데요.
첫째로, 지금 내 PC에서 작업하고 있는 공간을 working directory 라고 합니다.
지금 작업하고 있는 코드를 처음 Git에 업로드 하기 위해선
Git init 명령어를 이용해 지금 디렉토리를 Git에 알려야 합니다.
두번째로 Stage라고 하여, 서버에 올리기 전에 한번 검수하는 단계가 있습니다.
이 단계에서는 변경된 파일들이 무엇인지, 코드는 어느 줄이 바뀌었는지 확인합니다.
세번째로 Repository라고 하여, 레포지토리의 어원을 검색해보면 다음과 같이 나오는데,
Git에서는 서버에 올리기 전이나, stage를 거쳐 저장된 상태를 의미합니다.
보통 git push, pull, clone 등 명령어는 Repository 단위에서 코드가 전송되는 것을 말합니다.
Branch
흔히들 브랜치 파서 작업하라고 할때 많이 쓰는 브랜치가 여기서의 branch 입니다.
Git에서는 Branch, 가지라는 개념을 이용해 현재 일하고 있는 레포지토리를 여러 공간으로 더 나눌 수 있습니다.
서버에 test_project라는 레포지토리가 있고, 두 사람이 같은 공간을 쓰고 있다고 생각해봅시다.
A유저는 A라는 브랜치를 만들어 test_project내 a.cpp 코드를 수정하고,
B유저는 B라는 브랜치를 만들어 test_project내 b.cpp 코드를 수정할 수 있습니다.
여기서 생기는 장점이 협업이 가능하다는 것입니다.
단점으로는 협업할 때 같은 코드를 건드리는 경우 복잡할 수 있는데, 이 부분은 서로 간의 협의가 필요한데,
보통은 pull-request 라고 하여 코드를 업로드할 때 상대방에게 확인받고 올리는 방법으로 해결할 수도 있습니다.
branch를 변경하면서 저장소 안에서 A 폴더에서의 작업을 변경하고, B폴더에서의 작업을 수정하는 것도 가능합니다.
Local, Remote
깃에서는 Local, Remote 라는 개념이 존재합니다.
Local은 현재 작업하고 있는 디렉토리를 의미하고, Remote는 말그대로 원격의 서버를 의미합니다.
제가 작업하고 있는 폴더를 로컬에 올리는 것이 Commit이고,
제가 작업하고 있는 폴더를 리모트 서버에 올리는 것이 push입니다.
commit 을 아무리 해봤자 원격 서버, 우리가 아는 http://www.github.com:my_id/my_project.git 라는 홈페이지에서는 업로드가 되지 않습니다.
처음에 많이 헷갈려하시는 부분이
레포지토리에 올렸을 때 Local인지 Remote에 올렸는지 모르는 것,
현재 작업하고 있는 브랜치가 무엇인지 모르는 것,
단순하게 git branch -a 를 하면 존재하는 branch들을 볼 수 있고, 현재 작업하고 있는 브랜치를 확인할 수 있습니다.
git branch -r 명령어로 원격 서버의 branch를 볼 수도 있습니다.
명령어 사용법
위의 이미지는 사용자 입장에서 여태까지 한 설명들을 그림으로 표현한 것입니다.
하나씩 어떻게 진행해야되는지 설명해보겠습니다.
작업하는 몇 가지의 경우를 먼저 정해보겠습니다.
1. 처음에 작업하고 있는 코드를 올리는 경우
만약, 처음에 코드를 작성하고 있는 directory라면
1. git init을 통해 현재의 작업하고 있는 코드를 저장할 저장소를 생성합니다.
2. git add 명령어로 directory 내 Stage에 올릴 코드를 올립니다.
(전부 올리는 경우 git add . 입니다)
3. git commit 명령어로 로컬 레포지토리에 업데이트합니다.
(주로 git commit -m "업데이트 내용"으로 무슨 내용을 변경했는지 서술합니다)
4. git push 명령어로 업데이트할 리모트할 서버에 업로드합니다.
(git push <remote repository> <local repository>)
- 주의 사항으로 이 때, 원격 레포지토리가 추가되어 있어야합니다.
(없을 경우엔 git remote add <repo name> http://www.github.com:my_id/my_project.git)
2. Git Clone 후, 작업하고 수정하여 올리는 경우
1. git clone 으로 레포지토리를 불러옵니다.
2. 코드를 수정합니다.
3. git add 명령어로 directory 내 수정된 코드를 Stage에 올립니다.
4. git commit 명령어로 로컬 레포지토리에 업데이트합니다.
5. git push 명령어로 업데이트할 리모트할 서버에 업로드합니다.
(git push <remote repository> <local repository> )
- 리모트 내에서도 브랜치가 여럿 있는 경우가 있는데, 이때는 git branch -a 명령어로 확인 후, git checkout <브랜치명> 으로 브랜치를 변경하시면 됩니다.
3. Git pull로 가져온 brach를 수정하고 올리는 경우
1. git pull <원격 branch명> <로컬 branch 명> 명령어로 저장소를 불러옵니다.
2. 코드를 수정합니다.
3. git add 명령어로 directory 내 수정된 코드를 Stage에 올립니다.
4. git commit 명령어로 로컬 레포지토리에 업데이트합니다.
5. git push 명령어로 업데이트할 리모트할 서버에 업로드합니다.
- 만약 다른 브랜치에 올리고 싶다면, 다른 브랜치로 푸쉬합니다.
흔히 겪는 에러
위의 1,2,3으로 코드를 작업하고 올리는 것은 쉽지만 많이 겪는 시행착오 중 하나가
git ahead of master by 1 commit 입니다.
이 원인은 원격에서 가져온 시점과 현재 진행된 사항이 맞지 않아서 생기는 이유로 발생합니다.
해결방법은 아래와 같은데, 상황에 맞게 잘 사용하면 됩니다.
1. git pull로 Local을 remote 상황으로 맞추는 방법
2. git reset 명령어로 remote 서버를 이전 상황으로 되돌리는 방법
3. git push 명령어로 local repository를 remote 서버로 업데이트하는 방법
4. git reset 명령어로 local의 상황을 이전으로 돌리는 방법
주의 사항으로는 충분히 숙지하고 않고 사용하는 경우 코드가 날아가는 경우가 있으니 경우에 따라서 백업해두시는 것을 추천드립니다.
감사합니다.