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을 사용하게 될것입니다)
Leave a comment