1. 개요


설명에 앞서 일반적으로 git을 사용할 때 사용하는 명령어들의 흐름을 정리하면 다음과 같습니다.

$ git init // git 초기화

$ git remote add origin [원격 저장소명] // 원격 저장소 연결

$ git add [파일명]              // 해당 파일을 staged한다. (스테이징)
$ git restore --staged [파일명] // staged된 파일을 unstaged한다. (add 명령어 되돌리기)
$ git restore [파일명]          // 파일 수정한 내용을 되돌린다. (ctrl+z 효과)

$ git commit -m "message"     // staged된 파일을 로컬 저장소에 commit한다.
$ git reset HEAD^             // 가장 최신의 commit을 되돌린다.
$ git reset --hard [커밋 해시값] // 특정 커밋으로 되돌린다. (그 이후 커밋 이력은 모두 삭제된다.)

$ git log // commit 로그 확인

$ git push origin master // 로컬 저장소에 commit된 내용을 원격 저장소로 push한다.

기본은 아래 그림과 같습니다.

[그림 1] git 흐름

자, 그럼 처음부터 git 명령어를 사용하는 순서와 상황을 살펴보겠습니다.

먼저 git init {디렉토리명} 으로 git 저장소를 생성합니다.

그러면 아래 그림처럼 나올거에요. (test.go 파일은 테스트용으로 별도 생성한 것입니다. 🙂 )

[그림 2] git init 후 상태

그런 다음 test.go 파일을 스테이징(staged 상태) 하기 위해 git add 명령어를 사용합니다.

stage는 무대를 의미하는데요, 파일을 이 무대 위에 올려서 감시 혹은 추적을 하겠다는 의미입니다.

[그림 3] git add 후 상태

이제 test.go 파일은 staged 상태(=스테이징 한다)가 되어, git이 추적(track)하는 파일이 되었습니다. 

더 이상 수정할 내용이 없는 듯하군요. 그럼 이제 commit을 해야겠죠?

[그림 4] git commit 후 상태

commit이 잘된거 같으니 git log 명령어를 이용해 한 번 확인해보겠습니다.
아래의 그림에 노란색으로 commit 옆에 나오는 값은 해당 commit의 해시값입니다.(각각의 commit을 구분하기 위함)

[그림 5] git log 후 상태

첫 번째 버전은 잘 완료된 듯 하네요!

이제 test.go에 새로운 기능을 넣었다 가정하고(파일 수정), 다시 git add 명령어를 통해 staged 상태로 만들자어볼까요?

[그림 6] 수정 후 다시 git add 명령어 수행한 상태

음.. 그런데 git add로 스테이징하고보니 잘못 수정한거 같아요 ㅜ

git restore --staged 명령어로 staged 상태를 다시 unstaged 상태로 되돌리자.(git add 명령어 되돌리기)

[그림 7] git restore --staged 명령어로 unstaged 상태로 되돌리기

unstaged 상태로 만들었으니, git restore 명령어로 수정한 작업 자체도 되돌리겠습니다. (이전 커밋 상태로 test.go 파일 내용을 롤백)

[그림 8] git restore 명령어로 파일에서 수정한 내용 모두를 되돌리기

그 이후로, 작업을 계속해서 여러 번 commit을 하여 이력을 계속 쌓았네요. 그런데, 그냥 첫 번째 commit으로 되돌아가고 싶어요..(저런)

[그림 9] git reset 명령어로 commit 이력 리셋하기

2. 잘못 push한 원격 저장소 디렉토리 삭제


$ git rm [파일 및 디렉토리명]

$ git rm -rf [파일 및 디렉토리명] // 만약 디렉토리 안에 파일이 들어있다면 강제로 remove

$ git rm -rf --cached [파일 및 디렉토리명] // 원격 저장소의 디렉토리는 삭제, 로컬 저장소에는 보존

3. 원격 저장소에 강제로 push하기


원격 저장소에 update된 파일이 있다면 로컬에서 push 하기 전에 pull로 당겨와야합니다. 

하지만, 이런 저런 문제들로 push가 되지 않을때 강제로 push할 수도 있습니다.(물론 좋은 방법은 아닙니다. 😅 )

$ git push origin +master // 브랜치명 앞에 + 문자를 추가해준다.

4. git stash - 작업 중이던 코드를 임시로 저장하기


develop 브랜치로 어떤 기능을 작업하고 있다고 해보겠습니다.

아직 기능을 다 만들지는 못 했지만, 지금까지 작업했던 코드를 저장해놓고 싶어요. 예를 들면, 지금하던 작업을 멈추고 브랜치를 변경해서 다른 작업을 하고 싶을 수 있겠죠. 원래라면 다른 브랜치로 변경하려고하면 기존에 작업한 내용을 커밋하라고 에러 메시지를 내뱉습니다.
작업한 내용을 저장은 해놔야하는데 커밋할 정도로 작업을 해논건 아니라 커밋하기가 애매할때 git stash 명령어로 임시 저장을 합니다.

$ git stash // 아직 마무리하지 않은 작업을 별도의 임시 공간에 저장한다.

여러 가지 유용한 stash 명령어 관련 옵션으로는 다음과 같은 것들이 있습니다. 🙂

$ git stash -u // 새롭게 추가한 파일도 같이 stash 공간에 저장한다.

$ git stash save [작업명] // stash로 저장할때 명칭을 주어 저장한다.

$ git stash list // stash들 목록 보기 

$ git stash apply // 가장 최근에 저장한 stash 복원하기.

$ git stash apply stash@{숫자} // stash@{숫자}의 임시 저장이 복원된다.

$ git stash drop // 가장 최근에 저장한 stash 삭제하기.

$ git stash drop stash@{숫자} // stash@{숫자}의 임시 저장이 삭제된다.

$ git stash clear // stash 기록이 모두 삭제된다.

5. 참고자료


[1] http://jmlim.github.io/git/2020/01/30/use-git-stash/

'VCS' 카테고리의 다른 글

[SourceTree] 소스트리 Gitlab 연동하기  (0) 2022.01.29
[VCS/Git] Git-flow 전략  (0) 2020.02.20