Git 일반적인 사용법

2023년 9월 18일 수정

이 글은 Git의 일반적인 사용법, 다르게 말해서 기본적인 사용 방법을 정리한다. 이 외의 약간 고급(?) 기능을 살펴보고 싶다면 Git의 특별한 사용법 글을 참고하자.

저장소 만들기

현재 디렉터리를 Git 저장소로 만드려면 init 커맨드를 사용한다.

git init

이렇게 하면 .git 를 비롯해 상황에 따라 여러 숨겨진 디렉토리가 생겨난다.

보관용 저장소 만들기

보관용 저장소는 작업용 저장소가 아니라 보통 remote 용도로 사용되는 저장소를 의미한다. 아래와 같이 --bare 옵션을 추가하면 만들 수 있다.

git init --bare

상황 보기(Status)

status 명령을 이용하면 현재 저장소의 상태를 확인할 수 있다.

git status

아마도 Git 사용 시 가장 많이 사용하게 될 커맨드다. 현재 저장소에서 일어나고 있는 일들을 정리해서 보여 준다.

만약 다른 유틸리티 등에 파이프로 넘기기 위해 간략한 정보만 알고 싶다면 --porcelain 옵션을 줘보자.

git status --porcelain

이러면 아래와 같이 이상한 문구들 다 집어치우고 간략한 status를 보여 준다.

 M foo.txt
 M bar.txt
?? other.txt

참고로 위의 예에서 M 표기는 modified, ?? 는 untracked 상태의 파일이다.

파일 스테이지(Stage) 하기

특정 변경된 파일을 스테이지 하려면 add 명령을 사용한다.

git add path/to/file

디렉터리를 인자로 넘길 경우 해당 디렉터리 아래의 모든 변경 파일을 스테이지 한다. 예를 들어 현재 저장소의 모든 변경된 파일을 스테이지 하려면 아래와 같이 할 수 있다.

git add .

스테이지 취소하기

add 명령으로 스테이징 한 특정 파일을 스테이지 취소하려면 reset 명령을 사용할 수 있다.

git reset -- path/to/file

reset 까지만 적을 경우 모두 스테이지 취소된다.

커밋(Commit)

변경된 내용을 저장소에 올릴 때 커밋을 한다.

git commit

저장소에 소속된 파일들이 스테이지 되지 않은 상태에서 아래처럼 하면 몽땅 스테이징 해서 커밋할 수도 있다.

git commit -a

다만 -a 옵션은 저장소에 추가되지 않은 파일(untracked file)은 커밋되지 않으니 주의하자. 이런 파일은 수동으로 add 해야 한다.

-m 옵션을 사용하면 커밋 메세지를 간단히 작성할 수 있다.

git commit -m "Update several files"

커밋 내역(Log)

아래 커맨으로 커밋 내역을 볼 수 있다.

git log

한 줄 단위로 좀 더 단순하게 보기 위해서 --oneline 옵션을 사용할 수 있다.

git log --oneline

브랜치 그래프를 확인하기 위해 --graph 옵션도 사용할 수 있다.

git log --oneline --graph

커밋 취소하기

마지막 커밋을 취소하고 해당 수정 내역을 unstaged로 돌릴 때는 아래 커맨드를 사용한다.

git reset HEAD^

여러 커밋을 취소하려면 당연하게 오프셋을 넣어주면 된다. 예를 들어 아래 명령은 최근 2개의 커밋을 취소하고 unstaged 상태로 돌려놓는다.

git reset HEAD~2

커밋은 취소하고 스테이지 상태로 놔뒤기 위해서는 --soft 옵션을 추가한다.

git reset --soft HEAD^

원격과 연결하기

원격 저장소를 특정 보관용 저장소와 연결하고 싶을 때 아래와 같이 할 수 있다.

git remote add origin somegit://foo.bar/address

origin 이라는 원격 저장소를 현재 저장소에 알려 주는 커맨드다.

위의 커맨드는 그냥 예제일 뿐이고 실제로 동작하지 않는다. 뒤의 somegit으로 시작하는 주소는 실제로 연결하려는 원격 서비스(github)에서 제공하는 주소를 입력해야 한다.

물론 원격 저장소 대신 로컬의 다른 보관용 저장소(bare repository)의 디렉토리를 지정하는 것도 가능하다.

푸시(Push)

아래 커맨드는 origin 이라는 이름의 원격 저장소에 master 라는 브랜치 이름으로 푸시한다.

git push origin master

굉장히 자주 사용하게 될 커맨드다.

추가로 -u 옵션으로 원격 브랜치와 로컬 브랜치를 연결시킬 수도 있다.

git push -u origin master

이후 이제는 푸시만 하면 자동으로 연결된 원격 브랜치로 푸시된다.

git push

만약 푸시 후 커밋 내용을 바꾸거나 rebase 하는 등의 커밋 히스토리의 변동이 일어났다면 일반적인 푸시는 에러가 날 수도 있다. 이럴 때는 강제로(forcely) 푸시해야만 한다.

git push --force origin master

하지만 master 브랜치 같은 기본 브랜치에 이런 강제 명령은 사용하지 말자. 협업 중인 저장소라면 다른 사람들에게 민폐를 끼칠 수도 있다.

풀(Pull)

아래 커맨드는 origin 이라는 이름의 원격 저장소의 master 라는 브랜치의 내용을 가져와서 로컬 master 브랜치에 합쳐(merge)준다.

git pull origin master

위는 아래의 두 커맨드를 하나로 합쳐놓은 것과 비슷하다.

git fetch origin master
git merge origin/master

비교(diff)

커밋 하기 전 수정된 내역을 보려면 diff 커맨드를 사용한다.

git diff

특정 브랜치와 비교하는 것도 가능하다.

git diff some_branch

브랜치 만들기

현재 브랜치에서 가지를 쳐서 다른 브랜치를 자유롭게 만들 수 있다.

git switch -c branch_name

어느 순간 새로 생긴 커맨드인 switch 를 활용하는 방법이다. 물론 checkokut 을 이용한 예전 방식도 아직 통용된다.

git checkout -B branch_name

브랜치는 작업(task)의 단위로도 자주 활용되기 때문에 GitHub 등에서 오픈소스 프로젝트에 기여한다면 굉장히 자주 사용하게 된다.

작업 브랜치 변경하기

switch 명령으로 작업 브랜치를 변경할 수 있다.

git switch branch_name

참고로 switch 는 최근에 추가된 명령이다. 만약 자신이 옛날 사람이라면 checkout 커맨드도 사용할 수 있다는 것을 알 것이다.

git checkout branch_name

브랜치 조회하기

아래의 커맨드로 로컬의 브랜치 목록을 볼 수 있다.

git branch

원격을 보기 위해서는 -r 옵션을 추가해야 한다.

git branch -r

브랜치 삭제하기

아래 커맨드로 로컬의 브랜치를 삭제할 수 있다.

git branch -D branch_name

원격 브랜치를 삭제할 때는 아래 방법을 쓸 수 있다.

git push origin --delete REMOTE_BRANCH_NAME

하지만 원격 브랜치를 로컬에서 직접 삭제할 일은 별로 없을 것 같다.

임시 저장(stash)

편집 중이던 내용을 임시로 저장해놓고 수정 전 상태로 돌리고 싶다면 stash 명령을 사용할 수 있다.

git stash

저장된 내용은 list 커맨드로 파악할 수 있다.

git stash list

저장된 내용을 확인하려면 show 커맨드를 사용할 수 있다.

git stash show stash_name

다시 수정하던 내용으로 복구 시키기 위해 pop 명령을 사용할 수 있다.

git stash pop

pop 의 경우 작업 내역이 복구되면서 stash 되었던 기록이 당연히 사라지는데, 만약 작업 내역을 복구하지만 stash 자체는 그대로 남겨두고 싶다면 대신 apply 커맨드를 사용할 수 있다.

git stash apply

필요 없을 때는 drop 으로 삭제할 수 있다.

git stash drop stash_name

임시 저장(stash)과 비교(diff)해보기

아래와 같이 stash 된 내용이 현재 내용과 어떻게 다른지 파악할 수 있다.

git stash show -p

작업 내역 취소하기

특정 파일의 작업 중인 내역을 취소하기 위해서도 checkout 커맨드를 사용할 수 있다.

git checkout -- file_path

아래의 커맨드도 가능하다.

git checkout HEAD file_path

스테이지 된 것만 취소하기 위해선 reset 커맨드를 쓸 수도 있다.

git reset -- file_path

아예 수정된 내역 전체를 날리기 위해선 아래처럼 할 수도 있다.

git reset --hard HEAD

위 명령은 되돌릴 수 없으니 조심해서 사용하자.

커밋을 없애기 위해서도 reset 을 사용할 수 있다.

git reset commit_id

다만 위 커맨드는 해당 커밋 ID 시점부터 시작해서 가장 최근의 커밋 내역까지 몽땅 날아가니 주의하자.

파일 지우기

아래 커맨드는 로컬과 저장소에서 파일을 삭제한다.

git rm FILE_PATH

삭제된 내역은 add 등으로 삭제 되었다고 스테이지 해줘야 커밋 시 반영된다.

내 컴퓨터의 파일은 놔두고 저장소에서만 파일을 지우고 싶을 때는 아래 커맨드를 이용할 수 있다.

git rm --cached PATH

이후 .gitignore 에 등록하지 않으면 untracked file 로 분류가 된다.