Git – 유용한 명령어 알아보기!

본 포스팅은 Git – 브랜치(Branch) 다루기와 이어집니다!

이번에는 git의 추가 지식 및 유용한 명령어에 대해 알아보겠습니다.


git revert (push한 커밋을 이전으로 복귀하는 방법)

현재 필자의 커밋 히스토리는 다음과 같습니다.

ID가 ‘0309’인 커밋을 만들고 push까지 한 상태입니다!

이 상태에서 로컬, 리모트 둘 다 이전 버전(nver_1)으로 복귀하려고 합니다.

git reset이라는 방법이 있지만 이는 치명적인 단점이 있습니다.

리모트 레포지토리가 로컬 레포지토리보다 최신 커밋이라면 push는 진행되지 않는다는 점입니다!

이럴 때 사용하는 것이 revert 명령어입니다.

git revert (commit한 커밋)을 이용하면, 로컬 레포지토리는 (commit한 커밋의) 이전 커밋 내용으로 새롭게 커밋됩니다.
워킹 디렉토리도 이전 커밋 내용으로 적용됩니다!

즉 nver_1 커밋과 같은 내용을 가지는 새로운 커밋이 생성됩니다!

이후 push를 하면 이전 커밋으로 복귀한 것과 같은 효과를 지닙니다!


여러 커밋을 하나의 커밋으로 만들기

This image has an empty alt attribute; its file name is image-431.png

필자의 커밋 히스토리 (3~1)를 보면 (nver_1 커밋 -> 0309 커밋 -> nver_1 커밋 내용을 지닌 9fa3 커밋)으로 기록되어 있습니다!

0309 커밋 내용을 추가했다가 삭제한 것으로 최신 커밋 (nver_1 커밋 내용을 지닌 9fa3 커밋) 하나만 기록돼도 큰 문제가 없습니다.

이럴 때, 여러 커밋을 하나로 만드는 방법이 있습니다!

바로 git reset을 응용하는 것입니다!

위에서부터 n개의 커밋을 하나의 커밋으로 만들려면
git reset –soft (n+1번째 커밋 해시/태그) 를 한 다음 git add . 명령을 하고 다시 커밋을 진행합니다.

soft옵션을 진행하면 Repository 내용만 변경되고 Working Directory와 Index는 최신 상태입니다.
즉 최신 상태를 유지하는 Working Directory 내용을 staging area에 넣고 이를 다시 repository에 넣는 과정을 진행하는 것입니다.

만일 위 작업을 하기 전에 push를 한 상태라면, 일반적인 방법으로 push가 불가능할 것입니다.
하나의 커밋으로 변경된 것을 모르는 Remote는 더 최신 상태의 커밋을 지니고 있다고 착각하기 때문입니다.

이런 경우 어쩔 수 없이 push –force 옵션을 사용해서 강제 push를 할 수 밖에 없습니다!


git stash 활용하기 (잘못된 브랜치에서 작업한 경우)

A 브랜치에서 해야 될 작업을 B 브랜치에서 작업한 경우 해결 방법을 소개합니다.

master브랜치에서 hello.py 파일을 다음과 같이 수정 후 커밋해야 되는데, novice브랜치에서 수정했다고 가정하겠습니다.

git stash최근 커밋 이후로 작업했던 내용은 모두 스택에 옮겨지고, working directory 내부는 다시 최근 커밋의 상태로 초기화시키는 명령어입니다.

먼저 git stash 명령을 하고 현재 브랜치를 master로 전환합니다.
이후 git stash list 명령을 하면 스택에 저장된 내용이 나오는데, apply stash@{0} 명령을 하면 가장 최근에 저장한 내용이 master브랜치의 Working Directory, Staging Area에 저장됩니다!

그런데 상황에 따라 CONFLICT가 발생할 수 있습니다.

사실 stash를 하면 ‘최근 커밋 이후로 작업한 내용’ 뿐 만 아니라 ‘Staging Area에 있던 내용’까지 스택에 저장됩니다.

따라서 apply를 하면 master브랜치에 없던 hello_novice.py까지 불러오게 되는데, stash는 merge가 아니다 보니 사용자에게 이 파일을 어떻게 하면 좋을지 물어보는 것입니다.

이런 경우, 문제되는 파일을 add하거나 remove(rm)해서 추가 or 삭제하겠다는 의사를 밝힙니다.

이후 커밋을 하면 사용자가 원하는대로 master브랜치가 업데이트됩니다!


(추가)
git stash drop <삭제하고 싶은 작업내용 id> : 스택에서 해당되는 작업 내용 삭제
git stash pop <삭제하고 싶은 작업내용 id> : stash apply도 하면서 작업 내용 삭제하기


git cherry-pick으로 특정 커밋을 불러와 커밋하기

B브랜치에서 진행한 특정 커밋을 A브랜치에 커밋하고 싶을 때 어떻게 하는지 소개합니다.

novice브랜치에서 커밋 두 번을 하고 커밋(1)을 master브랜치에 커밋해보겠습니다.
novice브랜치에서 커밋을 할 때는 아래 이미지와 같이 hello.py파일만 수정하였습니다!

커밋을 두 번하고 커밋 히스토리를 본 결과입니다!

이후 현재 브랜치를 master로 바꾸고 git cherry-pick (특정 커밋) 명령을 하였습니다.
필자는 커밋(1)에 해당하는 ‘7d07’ 커밋으로 적용하였습니다!

master브랜치에도 있는 동일 파일(hello.py)을 수정해서 커밋하는 것이기 때문에
CONFLICT가 발생하였습니다.

이런 경우 적용할 텍스트만 빼고 지우면 됩니다!

이후 git add를 하고 commit을 하면 완료됩니다!


지금까지 GIT에 대해 알아 보았습니다!

감사합니다!

Git에 관한 게시물은 CodeIt의 강의 내용을 정리한 글입니다. 강의 이미지나 내용 자체를 업로드하지는 않습니다!!

Leave a Reply

Your email address will not be published. Required fields are marked *