본문 바로가기
기타/Git

[Git] 되돌리기

by 코딩하는 랄로 2023. 12. 27.
728x90

git commit --amend

Git은 버전 관리 시스템으로, Git으로 관리되는 모든 파일은 이전의 커밋 상태로 되돌릴 수 있다. 하지만 이 글에서 다룰 커밋 되돌리기는 직전에 진행된 커밋을 없는 상태로 되돌리고 새로운 커밋으로 덮어씌우는 것을 뜻한다.

 

만약 커밋한 후, 커밋 메세지를 잘못 입력했음을 알게 되었거나 파일 하나를 빼먹었는 등의 실수가 일어났을 때에 해당 커밋을 되돌리고( 없애고 ) 다시 새로운 커밋 개체로 덮어씌울 수 있는 것이다.

 

Git은 이를 위해 git commit 명렁어의 --amend 옵션을 제공한다. 커밋 메세지를 잘못 입력한다고 하였을 때 이 명렁어를 이용하여 다음과 같이 커밋을 되돌릴 수 있다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git commit -m "addd fil1"
[master 5b87642] addd fil1
 1 file changed, 1 insertion(+)
 create mode 100644 file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git commit --amend
[master 1626cce] added file1
 Date: Wed Dec 27 21:16:01 2023 +0900
 1 file changed, 1 insertion(+)
 create mode 100644 file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log --format=oneline
1626ccea1f95008cac2fd2aa6c50663a535379ad (HEAD -> master) added file1

 

git commit --amend를 입력하게 되면 커밋 메세지를 입력하는 vi 편집기가 실행이 되면서 되돌리기한 커밋 메시지를 보여준다. 원하는 커밋 메세지로 수정 후(수정하지 않아도 됨) 편집기를 종료시키면 위와 같이 커밋 메세지가 바뀐 커밋 개체를 볼 수 있다.

 

만약 파일을 추가하는 것을 깜빡했다면 어떻게 해야할까? 아래의 예제를 살펴보자.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ echo "new file" > file2.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ echo "third file" > file3.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git add file2.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git commit -m "new file added"
[master d528be8] new file added
 1 file changed, 1 insertion(+)
 create mode 100644 file2.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git add file3.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git commit --amend
[master ce8d1ca] new file added
 Date: Wed Dec 27 21:21:19 2023 +0900
 2 files changed, 2 insertions(+)
 create mode 100644 file2.txt
 create mode 100644 file3.txt

 

file2.txt, file3.txt를 생성하고 커밋할 때, 실수로 file3.txt를 빼먹어 커밋한 후에 다시 add를 해준 후, --amend 옵션을 통해 커밋 개체를 되돌린 후 새로 생성하여 준 것을 볼 수 있다.

 

위의 예제들을 통해, git commit --amend 옵션에 대해서 몇 가지 알 수 있는게 있다. 먼저, --amend 옵션은 명령 실행 시에 staging area를 사용하여 커밋을 진행한다는 점이다. 그렇기 때문에 만약 staging area가 변한게 없다면 이 전의 커밋과 모든 것이 같게 된다.

 

하지만, 모든 것이 같을 뿐 두 개의 커밋이 같은 커밋은 절대 아니다!!(내용이 같기 때문에 SHA-1 해시 키가 같을 순 있어도) --amend 옵션은 이전의 커밋을 아예 없던 것으로 되돌리고 새로운 커밋을 생성하여 덮어씌우기 때문에 두 개의 커밋 개체는 다른 커밋 개체이다.

 

그렇기 때문에, 해당 옵션을 통해 커밋을 되돌리시 다시 복구할 수 있는 방법은 없으므로 조심하여 사용하여야 한다. Git은 되돌리는 것은 복구할 수 없음을 주의하여야 한다!!

 

 

 

git restore

Git은 커밋을 위한 snap shot을 생성하기 위해 add 명렁어를 통해 unstaged 상태의 파일(untracked, modified)을 staged 상태로 만들고 후에 commit을 통해 unmodified 상태로 만들게 된다.

 

이 때에, 커밋을 되돌릴 수 있었던 것처럼 add를 통해 파일을 staged 상태로 변경했던 것 또한 unstaged 상태로 되돌릴 수 있다. 파일을 unstaged 상태로 만드는 방법은 git add를 한 후 git status를 상태를 보게 되면 다음과 같은 문구를 많이 보았을 것이다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ echo "change file" > file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git add file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   file1.txt

 

메세지를 잘 뜯어보면, 현재 커밋을 위해 staging area에 수정된 file1.txt가 올라왔고 이를 unstage 하기 위해서는 git --restore --staged 명렁어를 사용하라고 친절히 알려주고 있다.

 

git이 친절히 알려주는 것처럼, git restore --staged 명렁어를 통해 staged 상태의 있는 파일은 unstaged 파일로 변경할 수 있고, 이 때 직접 파일을 지정해 줄 수 있기 때문에 필요한 파일만을 변경하는 것도 가능하다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git restore --staged file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   file1.txt

no changes added to commit (use "git add" and/or "git commit -a")

 

modified 상태의 file1.txt가 staged 상태에서 unstaged 상태로 변경된 것을 확인 할 수 있다. 여기서 더 나아가서 modified 상태 조차 되돌리고 싶다면 어떻게 해야 할까?

 

이에 대한 답 또한 위의 git status에서 Git이 친절히 알려주고 있다. 해당 상태를 자세히 보면 git restore를 사용하면 working directory 내에서 일어났던 변화들을 discard 할 수 있음을 알려주고 있다. 해당 명렁어를 통해 modified 상태를 되돌려 보겠다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git restore file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

 

modifed 상태가 이전 상태인 unmodified 상태로 변경되면서 git status 시에도 상태가 깨끗한 것을 확인 할 수 있다. 

 

 

 

 

 

 

reference : pro git

 

728x90

'기타 > Git' 카테고리의 다른 글

[Git] branch 생성  (1) 2024.01.02
[Git] remote  (1) 2023.12.31
[Git] log  (1) 2023.12.20
[Git] mv  (0) 2023.12.20
[Git] rm  (0) 2023.12.14