본문 바로가기
IT 기술/개발환경_유틸 관련 팁

[GIT] commit message 유지하면서 commit 에 포함된 파일 제거하기

by 땅뚱 2018. 5. 29.

참고 : https://goo.gl/jTWGvS

 

git commit -C option

추가하지 않아야 할 파일을 실수로 add 하여 git commit 까지 한 경우, 기존 commit message 를 유지하면서, 해당 파일만 제거하거나, 수정하고 싶은 경우가 있다.

 

매번 아래 명령을 사용하여 불필요한 파일을 삭제하였으나, 다시 commit 할 경우에 commit message 를 새로 써야해서 불편했다.

# git reset --soft HEAD^

 

# git reset HEAD path/tounwanted_file

또는 파일 수정

 

# git commit

< commit message 새로 작성 >

그런데, 아주 편리한 방법이 있었다.

# git reset --soft HEAD^

 

# git reset HEAD path/tounwanted_file

또는 파일 수정

 

# git commit -c ORIG_HEAD

 

이렇게 하면, reset 명령을 내리기 이전의 commit message 를 불러와서 수정할 수 있게 되어 매.우. 편리하다.

 

git symbolic reference

그럼 ORIG_HEAD 는 어떤 것인지 알아보자

 

우선 git 에서 제공하는 symbolic reference 가 몇가지 있다. HEAD, ORIG_HEAD, FETCH_HEAD, MERGE_HEAD, CHERRY_PICK_HEAD 등. 해당 내용은 $git_dir/ 아래에 존재한다.

# cd .git

# ls

...

HEAD

ORIG_HEAD

MERGE_HEAD

FETCH_HEAD

CHERRY_PICK_HEAD

...

 

# cat HEAD

20d0ef8675314d43fe730dc51234bb2392b3e5b5

https://goo.gl/iyLaFJ 설명을 참고하면, 각 refname 의 의미는 다음과 같다.

 

 

HEAD : working tree 의 최신 commit 을 가리킨다.

FETCH_HEAD : 마지막 git fetch 명령으로 원격 저장소에서 가져온 브랜치의 HEAD 를 가리킨다.

MERGE_HEAD : git merge 를 수행할 때, 브랜치에 merge 할 commit 을 가리킨다

CHERRY_PICK_HEAD : git cherry-pick 수행할 때, 체리픽킹하는 commit 을 가리킨다.

 

*ORIG_HEAD : HEAD 의 위치를 변경하는 위험한 명령(예를 들면 reset)을 수행할 때, 쉽게 이전 HEAD 상태로 돌아오기 위해서 이전 HEAD 의 위치를 가리킨다.

 

실수로 git reset --hard 를 수행한 경우라면 아래와 같이 복구할 수 있다.

 

# git reset --hard ORIG_HEAD

 

현재의 ORIG_HEAD 가 궁금하다면, git show 또는 git log 명령으로 확인할 수 있다.

 

# git show ORIG_HEAD

 

# git log ORIG_HEAD

 

아래와 같은 명령을 사용하면 git commit 에 대한 undo / redo 를 수행할 수 있다.

 

# git commit 

 

# git reset --soft HEAD^

 

# edit

 

# git commit -a -c ORIG_HEAD

git reflog

위와 같이 이미 정의된 symbolic reference 가 아니라, 내가 이전에 수행했던 log 에 대한 reference 를 하고 싶다면, 다음 명령을 사용한다.

# git reflog

위 명령은 local repository 에서 branch 나 reference 를 바꾸는 일이 일어나는 것을 기록한 log 이다. (reference log)

-C 옵션 이후에 사용하고 싶은 reference log 의 hash 값을 넣으면 해당 commit message 를 사용하게 된다.