SVN 유저의 github 사용기
회사에서 처음 배운게 SVN인데, github도 사용법을 익혀놓을 필요성이 있어서 공부한 기록을 해당 페이지에 남겨놓으려 한다.
깃허브의 기본 개념은 다른사람이 정리해놓은 아래의 url을 통해서 공부해보려 한다.
일단 Git은 SVN과 다르게 저장소가 두개이다.(SVN과는 다르게 github의 경우는 분산 저장 시스템이라고 하는데, 해당 글에서는 이런 부분까지 다루지는 않는다.)
SVN에서의 commit이라는 용어는 (Local PC -> 원격 저장소)로의 저장을 의미했다.
그러나, Git에서의 commit은 내 로컬 저장소로의 commit을 의미한다.
즉, 다른사람은 볼 수 없고, 내가 가진 PC 고유의 영역에 작업내용을 저장하는 기능이 Git의 push 이다.
내 로컬 영역에 있는 데이터를 master라고 하고, 원격지에 있는 데이터의 기본 이름은 origin 이다.
더 진행하기전에 아래의 문서 두개를 정독 하고 오자.
- https://cupjoo.tistory.com/6 (Git의 개념과 Git Flow에 대해 다룬다.)
- https://trustyoo86.github.io/git/2017/11/28/git-remote-branch-create.html (Git의 develop Branch 생성 방법)
- https://medium.com/@han7096/git-work-flow%EC%99%80-branch-merge-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-fb05d98428b2 (Git의 develop Branch 실 사용 예)
필자는 SVN의 trunk와 branches를 관리하듯, Git Flow의 Master Branch와 Develop Branch만을 사용해서 개발하고자 한다.
(Git Flow전체의 그림은 아래의 그림과 같이 표현되어 있는데, 개인개발을 할 때에 위를 전부 지킬 필요는 없어보여서이다...)

필자는 위의 3가지 url 중에 마지막 url을 참고하여 origin/master branch(원격에 있는 master branch)로부터 develop branch를 생성하는 이해했다.
위의 url에서는 다음과 같은 명령어를 이용하여 branch를 생성한다.
- $>git checkout -b <생성하고자 하는 branch 이름>"
어디로부터 branch를 생성하는지 어떻게 시스템이 아는거지? 라는 의문이 들어서 git checkout 창에 대한 terminal help 창을 찾아보니아래와 같은 결과를 찾을 수 있었다.
$> git checkout --help
git checkout <branch>
To prepare for working on <branch>, switch to it by updating the
index and the files in the working tree, and by pointing HEAD at
the branch. Local modifications to the files in the working tree
are kept, so that they can be committed to the <branch>.
If <branch> is not found but there does exist a tracking branch in
exactly one remote (call it <remote>) with a matching name, treat
as equivalent to
$ git checkout -b <branch> --track <remote>/<branch>
위는 git checkout에 대한 terminal help 창인데, 확인해 보면 "git checkout <사용자가 생성하고자 하는 branch명>" 명령만으로 branch를 생성할 수 있는 것을 확인했다.
결론은 시스템의 원격지에 master branch가 하나 뿐이라면, 알아서 다음과 같은 형태로 바꾸는 듯 하다.
- git checkout -b <branch> --track <remote>/<branch>
즉 사실 다음의 명령어를 입력하는게 훨씬 직관적이고 좋을 것 같다.
$> git checkout -b mydevbranch --track origin/master
그리고 만약, remote에 이미 있는 branch를 이쪽으로 복사하고자 한다면 다음과 같이 checkout받을 수 있다.
$> git checkout -b feature/ai --track remotes/origin/feature/ai
# 참고로 branch 이름의 경우, remote에 있는것과 이름이 다르다면, git push 명령어로 작업이 안된다.
# 예를들어 만약 remote에 있는 ai라는 이름의 feature branch를 다음과 같이 brnach를 생성했다고 하자.
$> git checkout -b ai --track remotes/origin/feature/ai
# 이렇게 돼면 local에서 ai branch에 작업 후 commit한 다음 해당 commit을 push하려고 하려고
# 다음과 같은 명령어를 입력하면 아래와 같은 오류가 발생한다.
(HEAD가 ai branch에 있다고 가정) $> git push
[대략적인 오류내용: local에 있는 branch와 remote의 branch의 이름이 맞지 않다.
push 하고자 한다면, 다음과 같이 해라.
$> git push origin HEAD:feature/ai]
# 즉 위는 현재의 HEAD를 feature/ai라는 이름으로 강제로 치환해서 push하는 것이다.
# 위와 같은 기교를 부리기 싫으면 애초에 branch type(feature, develop 등등...)이름을 잘 주어서
# branch를 생성하도록 한다.
remote에 어떤 branch들이 생성돼있는지 확인하기 위해서는 다음의 명령어를 이용할 수 있다.
$> git branch -a
# 위의 출력결과로 remote와 local에 있는 모든 branch 목록을 보여준다.
# remote에 있는 master는 remotes/origin/master로 표기해주는 등, local과 구분되도록 보여준다.
위의 checkout 명령은 사실 바라보는 branch를 바꾸는 명령이다. 그런데 여기서는 -b 옵션을 이용하여서 없으면 branch를 생성해서 그 branch를 보도록 하고 있는 것이다.
현재 사용하고 있는 branch가 어떤것인지 알고 싶으면 "$> git branch"를 입력하면 된다.
어쨌든 위의 입력 "$> git checkout -b mydevbranch --track origin/master" 결과로 mydevbranch라는 branch가 생성되면서, 해당 branch에서 작업하는 것이 된다.
이제 여기서 생성한 mydevbranch에 대해 작업 하고 commit하고, 또 그 내용을 push하면 해당작업은 master branch가 아닌 생성된 mydevbranch에 반영되게 된다.
참고로, mydevbranch를 push하려면 다음과 같이 하면 된다.
$> git push origin mydevbranch
그리고 mydevbranch의 작업 내용을 origin/master에 반영하고 싶다면, 다음과 같이 작업하면 된다.
# master branch로 제어를 변경한다.
$> git checkout master
# master에서 mydevminio와의 머지명령을 내린다.
$> git merge mydevbranch
merge가 되고 나면 이제 branch를 제거해주어야 하는데, 로컬에 남아있는 branch와 remote repo의 branch를 모두 지워줘야 한다.
아래와 같은 명령어로 제거하면 된다.
# 로컬에 있는 branch가 제거된다.
git branch -d mydevbranch
# 원격지에 있는 branch를 제거한다.
git push origin --delete mydevbranch
마지막으로 꽤 많이 쓰이는 프로젝트 클론해오기.
$> git clone git@github.com:brachio/minio-with-mc.git
위의 git@github.com:brachio/minio-with-mc.git는 github 주소로부터 얻을 수 있다.
ubuntu에서 git 사용을 위한 UI 툴
아래의 명령어를 이용하여 RabbitVCS Git을 이용하길 바란다.
여러 툴이 있겠지만, 이 툴이 제법 편하다.
CLI와 ui를 하이브리드로 같이 쓰면 상당히 편하다.
CLI에서 답이 안나올 땐 ui를 이용하고, ui를 쓰면 답이 안나올 땐 CLI를 이용하자.
sudo add-apt-repository ppa:rabbitvcs/ppa
sudo apt-get update
sudo apt-get install rabbitvcs-nautilus
git에서 실수를 저질렀을 때 되돌리는 방법
아래에 만화그림으로 재밌게 설명을 해놓은 것이 있다.
reset과 revert에 대해 재밌게 그려봤으니, git을 이용해서 실수를 복구해야 하는 상황이 있다면 이걸 보고 잘 해결해보자.
git에서 파일을 실수로 지웠을 때 복구하는 방법

참고로 "$> git checkout" 명령어만 쳐봐도 사라진 파일이 나온다.
git의 revert과 reset을 기막히게 그림으로 설명해준 만화가 있다.
http://www.devpools.kr/2017/01/31/%EA%B0%9C%EB%B0%9C%EB%B0%94%EB%B3%B4%EB%93%A4-1%ED%99%94-git-back-to-the-future/
추가정보
SVN을 사용할 때, 다른 사람의 변경사항이 있을 수 있기 때문에, svn update를 받아서, 최신 변경사항을 받은 이후에 커밋하도록 권장한다.
이처럼 github를 사용할 때도, commit하기 전에 git pull 명령어를 통해서 remote로부터 local의 갱신상태를 최신화하는게 좋다.
그리고 git status를 입력하면 modify된 파일, 추가된 파일, 지워진 파일 등의 정보를 얻을 수 있다.
git tag 조회 추가 삭제 방법
http://minsone.github.io/git/git-addtion-and-modified-delete-tag