local git 이든, github 든 git 을 사용하다가 특정 commit 을 삭제하고자 하는 경우, 어떻게 해야 하는지를 설명해보고자 합니다. 흔한 일은 아니지만, 이런일이 발생하면 잘 기억이 나지 않아 해메는 경우가 있으므로, 메모해 둡니다. 추가로 git 사용하는데 쓸만한 내용들을 추가로 정리하겠습니다.

되돌리기

특정 commit 으로 되돌아가기

아래 명령어를 이용하여 뒤로 이동합니다. ^ 문자의 개수에 따라 뒤로 몇 칸 이동할 것인지가 결정됩니다.

$ git reset HEAD^

만약 뒤로 세칸 이동하고자 한다면 git reset HEAD^^^ 과 같이 입력하면 됩니다.

git 은 변경점에 대한 이력을 저장해주기 때문에 뒤로 세 번째 것 을 삭제할 수는 없습니다. 만약 그렇게 하기를 원하면 뒤로 세칸을 모두 삭제하고 변경한 커밋과 그 뒤 두 커밋을 다시 커밋해줘야 합니다. 가급적 빨리 인지하는 것이 좋을 것입니다.

다시 변경하기

이제 다시 작업을 해줍니다. 아마도 해당 커밋에 넣었던 파일들이 다 unstaged 상태로 남아 있을 것입니다. 이제 잘못 커밋한 파일을 수정해 주고, 다시 commit - push 해주면 됩니다.

staging 에서 확인하기

staging 이란 git add 작업을 이야기 합니다. 보통 git 을 사용한다면 add → commit → push 의 과정을 거지게 되는데 일반적인 명령어만으로는 어떤 파일들이 add 되고 commit 되는지 확인할 수가 없다. 따라서 이런 경우에는 git add 명령어 뒤에 -p 옵션을 주어 수정사항을 확인하고 staging 여부를 판별할 수 있다.

git add -p 옵션을 넣은 경우 수정사항이 화면에 보여지고, 이를 staging 할건지 여부를 물어보고 있다. 그러면 문자로 y, n 등을 입력하면서 넣을지 말지를 판단해줘야 하는데, 이 목록들에 대해서는 다음과 같이 정리할 수 있다.

 jonghunpark@Jonghun-mbpw  ~/dev/git/linkeverything.github.io   master  git add -p .
diff --git a/_posts/infra/git/2020-07-20-git-reset.markdown b/_posts/infra/git/2020-07-20-git-reset.markdown
index 3b9ad27..0000000
--- a/_posts/infra/git/2020-07-20-git-reset.markdown
+++ /dev/null
deleted file mode 100644
@@ -1,32 +0,0 @@
----
-title: "git 에서 특정 커밋 삭제하기"
-excerpt: "How to delete specific commit(push) with Git"
-categories:
-  - "infra"
-  - "git"
-tag:
-  - "git"
-  - "reset"
-last_modified_at: 2020-07-20
----
-
-> local git 이든, github 든 git 을 사용하다가 특정 commit 을 삭제하고자 하는 경우, 어떻게 해야 하는지를 설명해보고자 합니다. 흔한 일은 아니지만, 이런일이 발생하면 잘 기억이 나지 않아 해메는 경우가 있으므로, 메모해 둡니다.
-
-#### 특정 commit 으로 되돌아가기
-
-아래 명령어를 이용하여 뒤로 이동합니다. `^` 문자의 개수에 따라 뒤로 몇 칸 이동할 것인지가 결정됩니다.
-
-```sh
-$ git reset HEAD^
-```
-
-만약 뒤로 세칸 이동하고자 한다면 `git reset HEAD^^^` 과 같이 입력하면 됩니다.
-
-git 은 변경점에 대한 이력을 저장해주기 때문에 뒤로 세 번째 것 ****을 삭제할 수는 없습니다. 만약 그렇게 하기를 원하면 뒤로 세칸을 모두 삭제하고 변경한 커밋과 그 뒤 두 커밋을 다시 커밋해줘야 합니다. 가급적 빨리 인지하는 것이 좋을 것입니다.
-{: .notice--danger}
-
-#### 다시 변경하기
-
-이제 다시 작업을 해줍니다. 아마도 해당 커밋에 넣었던 파일들이 다 unstaged 상태로 남아 있을 것입니다. 이제 잘못 커밋한 파일을 수정해 주고, 다시 commit - push 해주면 됩니다.
-
-
(1/1) Stage deletion [y,n,q,a,d,?]?
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

아마도 가장 많이 사용하는 것은 y, n, a 정도 될 것 같습니다.

stash 로 임시저장하기

이 기능은 잘 사용해보지 않은 기능인데 출처에 잘 정리되어 있어 차용해서 적습니다.

이미 수정사항을 add → commit 한 상태로 둔 채로, 다음 수정사항을 막 작업하고 있는 도중에 급하게 기존 commit 한 내용까지를 push 해야할 일이 발생합니다. (바로바로 push하는 습관을 들이면 잘 있지 않은 일이지만, 공동작업을 하는 경우 다른 쪽 개발이 완료되지 않았으면 개발만 해두고 다음 작업을 바로 시작할 수도 있습니다.)

git stash save -u

이 때에 위와 같이 명령어를 호출하면 현재 작업중인 파일을 모두 저장(백업)하고 워킹트리를 비워둡니다. 즉 앞서 개발하고 add → commit 한 그 직후로 돌아가게 되는 것입니다. (commit 이후가 working tree 에 남아 있는 것입니다.)

여기서 -u 옵션은 unstaging 파일까지 다 백업하라는 의미입니다

이제 앞서 commit 한 시점까지 왔으므로, pull & push 하면 기존 작업을 commit 할 수 있습니다.

그러고 나서 원래 하던 작업으로 돌아오려면, apply 옵션으로 호출합니다.

git stash pop

pop을 넣으면 저장(백업)한 내용을 복구하고 stash 내역에서 삭제하여 비워놓게 되고, apply를 넣어서 호출하면 저장(백업)한 내용을 복구하지만 stash 내역에서는 삭제하지 않는 결과를 보입니다. 상황에 따라 적절히 활용하면 됩니다. (아마 거의 pop을 사용하게 될것입니다)

출처 및 참고자료


Tags: ,

Categories:

Updated:

Leave a comment