기본 사용법 정리
git 사용법
프로젝트를 git 으로 관리하기 시작하면 모든 파일들은 4가지 상태(life cycle)가 된다.
untrackedUnmodifiedModifiedStaged
Untracked

추적(버전관리)되지 않는 파일을 의미한다. git 으로 관리하는 프로젝트에서 Untracked 의 상태를 갖는 파일은 보통 새로 만들어진 파일을 의미한다. 구태여 Untracked 상태로 내버려둘 필요가 없기 때문이다. 만약 해당 파일을 추적하고 싶지 않다면 .gitignore 를 이용한다.
Unmodified
추적 되고 있는 파일이면서 마지막 커밋을 기준으로 아직 수정이 되어있지 않은 상태다. 해당 상태는 git status 명령어를 입력해도 아무것도 볼 수 없다.
Modified
추적 되고 있는 파일이 직전 커밋을 기준으로 수정이 되고 새롭게 stage 로 올라가지 않은 상태.
Staged
추적되고 있지 않은 파일을 추적하기 위해 또는 추적 되고 있지만 변경 사항이 있을 때 add 명령어를 통해 Staged 상태로 만든다. Staged 되어있는 상태에서 commit 이 되면 해당 파일의 상태는 Unmodified 가 된다. commit 가 된다는 것은 버전을 새롭게 한다는 것을 의미한다. git log 명령어를 입력하면 commit 이력을 확인할 수 있다.
위 4가지 상태를 이해하고 기본 명령어 및 사용법을 알아보자.
기본 명령어
init프로젝트를
git으로 버전관리를 시작한다.
addUntracked파일을Staged상태로 만든다.Modified파일을Staged상태로 만든다.
commitStaged된 파일에 버전을 준다.commit된 파일들은Unmodified상태가 된다.
branchgit branch <branch>새로운 브랜치를 생성한다.생성된 브랜치는 현재 브랜치의 형상을 그대로 가지는 브랜치가 생성된다.
git branch -d <branch>브랜치를 삭제한다.git branch -D <branch>브랜치를 강제로 삭제한다.
checkout브랜치를 변경한다.
git checkout -b <branch>를 통해 브랜치 생성, 이동을 동시에 할 수 있다.
remote원격 저장소와 관련된 명령어.
git remote add <name> <url>원격저장소를name으로 추가함주로
git remote add origin <url>처럼origin으로 사용하는 경우가 많음이렇게 이름을 지정해서 추가할 수 있다는 건 하나의 로컬 저장소에 여러 개의 원격 저장소를 추가할 수 있다는 이야기가 됨
git remote update로 원격저장소의 정보를 업데이트 한다.git fetch와 기본적으로 동일하다.fetch는 현재 브랜치만을 업데이트 한다면remote update는 모든 브랜치를 대상으로fetch를 해온다.
push현재 로컬의 커밋 내용을 원격저장소에 올린다.
git push <원격저장소이름> <브랜치명>으로 올림‼️
push을 할 때는 먼저 원격저장소의 브랜치가 내 로컬 저장소의 브랜치보다 앞서 있는지를 확인해야한다.팀원이 같은 브랜치에 먼저
push를 해놓은 상태면 내 로컬과 맞지 않는 상태가 되어서 문제가 발생할 수 있기 때문이다.만약 원격저장소가 앞서 있다면, 먼저
pull을 이용해 로컬 브랜치를 최신화 하는 작업이 필요하다.
⚡
git push origin —-delete <branch>로 원격저장소의 브랜치를 삭제할 수 있다!
pull원격 저장소에 있는 내용을 로컬 저장소로 가져온다.
git pull <원격저장소이름> <브랜치명>‼️ 원격저장소가 내 로컬 저장소와 차이가 있을 때
conflict가 발생할 수 있다.pull은fetch + merge다.
fetch원격 저장소에 있는 내용을 가져온다.
‼️ 가져오기만 하지 병합하지는 않는다.
이 말은 원격 저장소에 있는 내용을 현재 저장소로 가져오지만,
pull과는 다르게 현재의 내용에 원격 저장소의 내용을 덮어 씌우지는 않는다는 것이다.
git log HEAD origin/<branch>를 통해서 현재 로컬의 브랜치와 원격 저장소 브랜치의 차이를 확인할 수 있다.
test4브랜치는 현재 원격 저장소가 로컬 저장소보다 앞서있다.
git diff HEAD origin/<branch>명령어를 통해 그 차이를 터미널로 확인할 수 있다.git merge origin/<branch>를 통해 원격 저장소의 내용을 병합할 수 있다.‼️
pull과 마찬각지로confilct가 발생할 수 있다.
merge원격 저장소 브랜치와 병합, 로컬 브랜치 사이의 병합에 사용된다.
주로 특정 기능을 추가할 때 로컬에서
feat/Comment와 같은 브랜치를 만들고 해당 브랜치에서 작업을 한뒤commit까지 마무리하면 다시 이전의 브랜치로 돌아와서git merge feat/Comment로 작업사항을merge한다.
stash마지막 커밋을 기준으로 변경된 사항을 잠시 어딘가에 저장하고 싶을 때 사용할 수 있다.
git stash를 이용하면Modified,Staged상태의 변경사항을 스택에 저장한다.‼️
Untrakced파일은 스택에 저장하지 않는다.
그러면 언제
stash를 주로 사용하는가?현재 브랜치에서 어떤 작업을 하고 있는데, 현재의 작업을 마무리하지 않은 상태로 다른 브랜치의 작업을 해야하는경우.
stash를 이용해서 현재의 작업 내용을stash스택에 저장하면 현재 브랜치는 마지막 커밋의 상태로 돌아가게 된다. 변경사항만stash스택에 저장되게 된다.
git stash list를 통해stash리스트에 저장된 내용들을 볼 수 있다.git stash pop를 통해 가장 마지막으로stash스택에 들어온 내용을 가져올 수 빼올 수 있다.‼️
stash로 스택에 변경사항을 push 한 저장소와pop하는 브랜치가 달라도 된다
rebase커밋의
base를 다시 정하는 작업이다.일반적으로
git merge명령어로 두 브랜치를 병합하게 되면log가 꼬여버리는 상황이 발생한다.그동안 쌓아왔던 내 브랜치의
commit로그 중간중간merge된 브랜치의 커밋 로그가 들어옴
rebase를 사용하면 깔끔한 커밋 히스토리를 남길 수 있게 된다.사용법
develop브랜치와 새로운 기능을 추가한feat/comment브랜치가 있다고 하자. 이feat/comment브랜치 작업이 마무리 되서develop브랜치에 합쳐야 하는 상황.git rebase <병합 목적 브랜치> <병합 시킬 브랜치>으로rebase를 시킨다.git rebase develop feat/comment
git checkout developgit merge feat/comment이렇게 깔끔한 히스토리가 만들어지게 된다.
원리
git rebase develop feat/comment명령어를 입력하면 아래와 같은 동작이 실행된다.git checkout feat/comment를 통해 HEAD를feat/comment로 이동시킨다.develop브랜치와feat/comment브랜치의 공통 조상이 되는 커밋부터feat/comment브랜치의 모든 커밋에 대해diff를 하고 그 차이(변경사항) 을 로컬에 저장한다.이 결과로
develop브랜치의 앞에는feat/comment에서의 변경사항이 추가되게 된다.fetch와 비슷하게 명목상으로 된 상태고 병합은 아직 되지 않은 상태다.
git checkout develop && git merge feat/comment를 하면 병합이 되고 히스토리가 깔끔하게 한줄로 만들어짐
커밋 변경
커밋 변경은 아래와 같은 상황에서 사용할 수 있다.
커밋에 포함되어야 하는 변경사항을
add하지 않은 상태에서commit한 경우commit메세지를 잘못 작성한 경우 등...
커밋 변경은 크게 바로 직전 커밋과 직전이 아닌 커밋 변경으로 나누어진다.
직전의 커밋을 수정
commit메세지 만을 수정git commit --amend
변경사항을 추가
git add <file> && git commit --amend
직전이 아닌 특정 커밋을 수정할 경우
git log를 통해 수정하고 싶은 커밋의 이전 커밋의id를 복사한다.git rebase -i <commit id>를 입력하자.
무엇을 어떻게 해야하는지에 대한 설명이 간략하게 나와있다.
변경하고 싶은 커밋을 찾고
pick을edit으로 바꾼뒤wq로 저장하고 나오자여러 커밋을
edit해도 된다.
edit으로 설정된 커밋 중에서 가장 오래전 커밋부터 수정하면 된다.수정사항을 추가한 뒤
git add ... && git commit --amend로 커밋을 하자.이후에는
git rebase --continue명령어로 다음edit으로 가면된다. 만약 마지막edit이었다면 기존에 작업중이던 브랜치로 돌아오게 된다.
깃 브랜칭 전략
큰 틀로써 master, develop, release 세 브랜치가 존재한다. 그리고 개발자들은 자신이 맡은 기능에 따라 임시로 브랜치를 만들고 관리하게 된다.
master한 스프린트가 끝나면 각 스프린트의 내용을
master에 합친다.다음 스프린트는
master브랜치에서develop을 따고 시작한다.
develop실제 개발을 진행하는 브랜치.
스프린트가 끝나면
develop브랜치에 머지한다.깃허브의 기능을 이용하기 위해서는 해당 브랜치를 디폴트 브랜치로 설정하는게 좋다.(자동으로
issue클리어 해줌)
releasemaster에서 출시 할 수 있는 버전이 있으면release로 만든다.출시된 버전이 없다면
release브랜치는 없어도 된다.
임시 브랜치
feat/...,fix/...임시로 만들어지는 브랜치들은 브랜치 이름으로 브랜치의 목적을 명확히 알 수 있게 만든다.
Last updated
