기본 사용법 정리
git 사용법
프로젝트를 git
으로 관리하기 시작하면 모든 파일들은 4가지 상태(life cycle
)가 된다.
untracked
Unmodified
Modified
Staged
Untracked
추적(버전관리)되지 않는 파일을 의미한다. git
으로 관리하는 프로젝트에서 Untracked
의 상태를 갖는 파일은 보통 새로 만들어진 파일을 의미한다. 구태여 Untracked
상태로 내버려둘 필요가 없기 때문이다. 만약 해당 파일을 추적하고 싶지 않다면 .gitignore
를 이용한다.
Unmodified
추적 되고 있는 파일이면서 마지막 커밋을 기준으로 아직 수정이 되어있지 않은 상태다. 해당 상태는 git status
명령어를 입력해도 아무것도 볼 수 없다.
Modified
추적 되고 있는 파일이 직전 커밋을 기준으로 수정이 되고 새롭게 stage
로 올라가지 않은 상태.
Staged
추적되고 있지 않은 파일을 추적하기 위해 또는 추적 되고 있지만 변경 사항이 있을 때 add
명령어를 통해 Staged
상태로 만든다. Staged
되어있는 상태에서 commit
이 되면 해당 파일의 상태는 Unmodified
가 된다. commit
가 된다는 것은 버전을 새롭게 한다는 것을 의미한다. git log
명령어를 입력하면 commit
이력을 확인할 수 있다.
위 4가지 상태를 이해하고 기본 명령어 및 사용법을 알아보자.
기본 명령어
init
프로젝트를
git
으로 버전관리를 시작한다.
add
Untracked
파일을Staged
상태로 만든다.Modified
파일을Staged
상태로 만든다.
commit
Staged
된 파일에 버전을 준다.commit
된 파일들은Unmodified
상태가 된다.
branch
git 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 develop
git 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
클리어 해줌)
release
master
에서 출시 할 수 있는 버전이 있으면release
로 만든다.출시된 버전이 없다면
release
브랜치는 없어도 된다.
임시 브랜치
feat/...
,fix/...
임시로 만들어지는 브랜치들은 브랜치 이름으로 브랜치의 목적을 명확히 알 수 있게 만든다.
Last updated