경우에 따른 Git 명령어 (Git Cheatsheet)


Git은 코딩하는 사람들에겐 매우 요긴한 도구이지만, 난해한 개념 때문에 문제가 생겼을 때 대처하기 어려워하는 경우가 많다. 나 역시 마찬가지여서, 문제가 생겼을 때 해결했던 방법을 이 글에 기록하고자 한다.

먼저 Git을 쓰는 사람이라면 다음 개념은 명확히 알고 있어야 한다. Git을 쓸 때 우리가 다루는 공간은 크게 작업트리(Working Tree), 스테이징 영역(Staging Area), 로컬 저장소(Local Repository), 원격 저장소(Remote Repository) 4가지로 나눌 수 있다. 이 개념부터 명확히 이해해야 한다.



Git이 다루는 공간



- 작업트리(작업공간)는 내가 지금 에디터로 작업하고 있는 그 공간(디렉토리/파일)이다. 작업을 마무리하고 git에 넣어야겠다고 생각하면 git add 명령을 내리면 된다.  이것은 작업트리에서 변경된 내용을 스테이징 영역에 넣는 명령이다. git status 명령을 내리면 작업트리와 스테이징 영역에서 달라진 파일들을 보여주며, 보통 여기에 표시되는 파일들을 add 해주면 된다. (보통은 귀찮아서 git add * 로 함)
- 스테이징 영역은 보통 작업하고 있는 디렉토리 안에 있는 .git 안에 존재한다. 뒤에 소개할 로컬 저장소도 마찬가지이다. 눈에는 보이지 않지만, .git 안에 많은 정보들이 담겨져 있는 것이다. 스테이징 영역은 커밋하게 될 파일들을 차곡차곡 관리하는 것이라 보면 된다. 이 상태에서 git commit 을 실행하면, 변화된 코드가 로컬 저장소로 옮겨간다.
- 로컬 저장소는 말 그대로 여러분의 PC에 있는 소스의 변경관리 목록이다. git log 명령을 내리면 로컬 저장소에 담긴 코드의 역사를 보여주며, git show 명령을 내리면 지정한 커밋에 대한 변경 내역을 볼 수 있다. 로컬 저장소의 변경 내역은 git push 명령으로 원격 저장소에 보낼 수 있다.
- 원격 저장소는 로컬 저장소와 비슷한 역할이지만, 어딘가 다른 서버에 있는 저장소이다. git가 처음 나왔을 때, 기존의 소스관리 툴(svn, cvs 등)과 달랐던 가장 큰 지점은 이 원격 저장소 개념(이중 커밋)이었다. 원격 저장소 덕분에 여러명이 개발할 때, 서로 독립적으로 일할 수 있게 되었다.

이제 반대로 원격 저장소에서 로컬 저장소로 변경 내역을 가려오려면 git fetch 명령을 사용한다. 로컬 저장소의 변경 내역을 작업트리로 옮기려면 git checkout을 사용한다. 이 두 명령을 하나로 합친 것이 git pull 이다. (정확하게는 git fetch + git merge 이다)


원격 저장소에 있는 코드를 로컬 작업공간에 엎어치기 


가장 빈번하게 필요한 경우다. 예를 들어 개발장비에서 개발이 완료된 걸 github에 올리고, 상용장비에서 받아야 하는데... 세상일이 그렇듯, 상용장비에 급하게 땜빵한 변경사항들이 있어 git pull을 하면 merge를 하라고 투덜댈 때. 그냥 원격 저장소 걸로 싹 밀어버리고 싶을 때.. 

$ git fetch --all && git reset --hard origin/master

git fetch는 원격 저장소의 것을 로컬 저장소로 가져온다. 그렇다고 당장 눈에 보이는 소스코드가 변경되는 것은 아니다. 이것을 작업공간의 코드와 어떻게 합칠 것인가를 정해야 한다. 

보통은 git merge로 로컬 리포지토리와 작업공간의 것을 합친다. git pull은 git fetch && git merge 이다.



그런데 이 경우는 merge를 원하지 않기 때문에 그냥 git reset을 쓴다. reset 뒤에는 커밋 번호를 쓸 수 있지만, 안 쓰면 저장소의 HEAD를 쓴다. --hard 옵션은 저장소 뿐 아니라 인덱스와 작업공간까지 모두 HEAD 버전으로 엎어친다. 이게 원하던 바다. 


다른 브랜치로 전환하고 싶을 때 


한 브랜치에서 작업을 하다가, 다른 브랜치로 넘어가는 것은 빈번하게 발생하는 일이다. 간단한 명령이다. 

$ git checkout <브랜치명>


bash 쉘에 브랜치 명 보이게 하기 


제일 많이 하는 실수가 내가 어느 브랜치에서 작업하는지 모르고 삽질하는 거다. 그래서 인싸들은 bash 쉘에 브랜치 명이 보이게 해, 실수를 줄인다. 

여러가지 방법(git_prompt.sh 등)이 있지만, 이게 제일 간단하더라. .bashrc에 다음 내용만 추가하면 된다. 

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "

그러면 이제 git로 관리하는 폴더로 들어가면 다음과 같이 브랜치 명이 표시된다.


Windows에서는 Linux Subsystem for Windows의 Ubuntu Shell을 이용하거나, Power Shell에 돌아가도록 만든 posh-git 을 시도해보기 바란다.

작업하던 브랜치의 내용을 master에 병합하기 


TBD


작업하던 브랜치의 내용대로 master를 엎어치기 



TBD

잘못된 커밋을 건너뛰기 



TBD


Pull 했는데, 쫑나서 안된다고 할 때



TBD






댓글 없음:

댓글 쓰기

인기글