본문 바로가기

Programming/Git

10. Git commit 수정 (실수 고치기)

우리는 Git 으로 소스코드를 버전관리하면서 실수로 작성한 것을 되돌리거나 수정하길 원할 때가 있다.

이러한 일을 하기 위해서 Git 에서는 다양한 방법으로 이런 기능들을 제공한다.

이런 방법은 크게 commit 을 했는지 안했는지, commit 을 공개했는지, 안했는지에 따라 다르다.


1. commit 이 안된 실수를 수정하는 방법

방법은 간단하다. 아래의 명령어로 변경된 내용 혹은 git index 에 있는 내용을 비울 수 있다.


 $ git reset --hard HEAD


이해를 돕기 위해서 간단한 예제를 들어 보았다.


 Kona:test starblood$ cat README.md 

 # Git reset, checkout, revert introduction


README.md 파일에 간단한 내용을 추가

# Git reset, checkout, revert introduction


This is introduction of some basic commands that modifying history.


변경된 내용을 확인하기 위해 git diff 명령어를 사용

Kona:test starblood$ git diff

diff --git a/README.md b/README.md

index 1443214..737d01e 100644

--- a/README.md

+++ b/README.md

@@ -1 +1,3 @@

 # Git reset, checkout, revert introduction

+

+This is introduction of some basic commands that modifying history.


변경된 내용을 git index 에 반영하고 git diff 로 변경된 파일이 있는지 확인. (index 에 들어갔기때문에 없다.)

Kona:test starblood$ git add README.md 

Kona:test starblood$ git diff

Kona:test starblood$ 


변경된 내용이 git index 에 들어갔는 지 확인

 Kona:test starblood$ git diff --cached

diff --git a/README.md b/README.md

index 1443214..737d01e 100644

--- a/README.md

+++ b/README.md

@@ -1 +1,3 @@

 # Git reset, checkout, revert introduction

+

+This is introduction of some basic commands that modifying history.


다시 약간의 내용을 추가하고 변경된 내역을 확인

 Kona:test starblood$ cat README.md 

# Git reset, checkout, revert introduction


This is introduction of some basic commands that modifying history.


 * git-reset - Reset current HEAD to the specified state


Kona:test starblood$ git diff
diff --git a/README.md b/README.md
index 737d01e..17f9bc8 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
 # Git reset, checkout, revert introduction
 
 This is introduction of some basic commands that modifying history.
+
+ *     git-reset - Reset current HEAD to the specified state


git index 의 내용은 어떤 것인지 다시 확인

 Kona:test starblood$ git diff --cached

diff --git a/README.md b/README.md

index 1443214..737d01e 100644

--- a/README.md

+++ b/README.md

@@ -1 +1,3 @@

 # Git reset, checkout, revert introduction

+

+This is introduction of some basic commands that modifying history.


git reset --hard HEAD 명령어가 어떤 일을 수행하는지 확인 해봄.

Kona:test starblood$ git reset --hard HEAD

HEAD is now at c01d76f Initial commit

Kona:test starblood$ git diff

Kona:test starblood$ git diff --cached

Kona:test starblood$ 


이와 같이 git reset --hard HEAD 명령어는 변경된 내용이 staged 된 내용 과 stage 되지 않은 내용 전부 되돌려놓는 일을 수행한다. stage 라는 것은 이전 포스팅에서도 언급했지만, git index 에 변경된 내용을 update 하는 과정을 일컫는다.


한 개의 파일만을 되돌리고 싶을 경우에는 git checkout 이라는 명령어를 사용하면 된다.

 $ git checkout -- README.md

 $ git checkout HEAD README.md


첫 번째 명령어는 README.md 파일을 index 에 기록되어 있는 상태로 되돌린다.

두 번째 명령어는 git reset --hard HEAD 와 같은 일을 수행하지만, 한 개의 파일만을 대상으로 한다는 것에 차이가 있다.


2. commit 이 된 실수를 수정하는 방법


크게 두가지 방법이 있다.

첫 번째는 실수한 commit 을 수정하여 다시 새로운 commit 을 만든느 것

두 번째는 실수한 commit 자체를 수정하는 방법.

두 번째 방법은 실수한 commit 이 이미 다른 사람들에게 공개를 했다면, 사용하지 말아야 한다.


실수를 수정하는 첫 번째 방법은 아래와 같다.

아래의 명령어는 실수한 commit 을 commit 하기 전의 상태로 돌려놓고 새로운 commit 을 만들도록 한다.

 $ git revert HEAD


예제:

 Kona:test starblood$ git log

commit c01d76f766b5d79c53e740530db5611dba5368e8

Author: Gyuhang Shim <plto001@gmail.com>

Date:   Fri Aug 5 11:04:48 2011 +0900


    Initial commit


새로운 내용을 추가 한다. (잘 못된 내용이 추가되었다.)

 Kona:test starblood$ cat README.md 

# Git reset, checkout, revert introduction


akjdslkfjlasjdfklajsdfljslkdfjkl


실수로 commit 한 것이 보인다. (Wrong commit)

 Kona:test starblood$ git log

commit 545f640838d5cd84f9f737f6e47619040c62626e

Author: Gyuhang Shim <plto001@gmail.com>

Date:   Fri Aug 5 13:05:37 2011 +0900


    Wrong commit


commit c01d76f766b5d79c53e740530db5611dba5368e8

Author: Gyuhang Shim <plto001@gmail.com>

Date:   Fri Aug 5 11:04:48 2011 +0900


    Initial commit


이 실수로 한 commit 에 해당하는 변경내역을 제거하고 이전의 commit 내용과 같은 내용으로 새로운 commit 을 만든다.

아래의 내용을 보면, 새로운 Wrong commit 이 추가되었음을 알 수 있다.

 Kona:test starblood$ git revert HEAD

[master 809e862] Revert "Wrong commit"

 1 files changed, 0 insertions(+), 2 deletions(-)

Kona:test starblood$ git log

commit 809e862882a768897f51784e3713fb60f719ee4e

Author: Gyuhang Shim <plto001@gmail.com>

Date:   Fri Aug 5 13:08:37 2011 +0900


    Revert "Wrong commit"

    

    This reverts commit 545f640838d5cd84f9f737f6e47619040c62626e.


commit 545f640838d5cd84f9f737f6e47619040c62626e

Author: Gyuhang Shim <plto001@gmail.com>

Date:   Fri Aug 5 13:05:37 2011 +0900


    Wrong commit


commit c01d76f766b5d79c53e740530db5611dba5368e8

Author: Gyuhang Shim <plto001@gmail.com>

Date:   Fri Aug 5 11:04:48 2011 +0900


    Initial commit


정말 잘못된 내용이 제거되었는지 확인해보자. 정말 asdf ... 이런 잘못된 내용이 제거되었다. :)

Kona:test starblood$ cat README.md 

# Git reset, checkout, revert introduction


전전 상태로 돌리고 싶다면 아래와 같은 형태로 명령어를 입력할 수도 있다.

 $ git revert HEAD^


commit 자체를 수정하여 실수를 수정하는 방법

git commit --amend 명령어를 사용하여 수정할 수 있다.

이 명령어는 현재의 git index 에 있는 내용을 기준으로 하여 마지막에 수행된 commit 을 수정하게 해주는데, 파일의 추가, commit 메시지 수정할 수 있도록 해준다.

또 다른 방법으로는 git rebase 가 있는데, 이것은 git merge 와 유사한 기능을 수행하도록 해주는 명령어인데, 이에 관련해서는 다음 branch 관련 글을 포스팅하면서 자세히 다루도록 할 예정이다. :)

'Programming > Git' 카테고리의 다른 글

gitolite admin 계정 변경  (0) 2012.12.27
Setting the default git branch in a bare repository  (0) 2012.01.10
9. github 계정설정  (0) 2011.07.03
8. github 소개  (0) 2011.07.03
7. Git 기본 지식  (0) 2011.07.03