본문 바로가기
코딩해보니/Git

[Git_17] 스테이지에 등록한(올린) 파일을 취소(삭제)하기(내리기)

by 위시랜 2022. 12. 9.

스테이지에 등록한 파일 내리기
스테이지에 등록한 파일 내리기

다시 조금은 돌아가서,

커밋을 하기까지의 과정을 다시 한번 상기해 보겠습니다.

 

① 워킹 디렉터리에서 파일을 생성 또는 수정 등 작업을 합니다.

② 작업이 완료되면 커밋을 위해 스테이지에 작업한 파일들을 등록(add)해서 커밋할 인덱스(Index)를 구성합니다.

③ 스테이지에 추가한 이후에 추가 수정할 부분이 있을 경우, ①, ②를 반복하게 됩니다.

④ 더 이상 수정할 사항이 없을 경우 커밋(commit)을 진행합니다.

 

위 과정에 있어서 여러 가지 상황이 있을 수 있습니다.

커밋을 하기 위해서는 스테이지에 등록하는 과정을 반드시 거쳐야 합니다.

하지만 커밋할 내용을 다시 구성해야 할 경우가 있을 수 있습니다.

 

그래서 스테이지에 등록한 것을 취소해야 할 경우가 생길 수 있는데,

스테이지에 등록한 파일을 취소하는 것으로

다르게 표현하면 스테이지에 올린 파일을 다시 내린다고 할 수 있습니다.

 

이 부분은 앞서 Git의 3가지 영역을 이해하기 위해 실습을 통해 각 상황을 확인하는 과정에서 잠시 언급되었습니다.

 

스테이지에 등록한 파일을 취소해야 할 경우 소스트리를 사용하면 아주 쉽게 할 수 있습니다.

앞서도 소스트리를 이용해 스테이지에 등록하는 법은 설명을 했습니다.

소스트리(Sourcetree)를 이용해 스테이지에 올리기(등록하기)
소스트리(Sourcetree)를 이용해 스테이지에 올리기(등록하기)

“스테이지에 올라가지 않은 파일” 영역에서

[+] 버튼을 이용해 개별 파일을 선택해서 하나하나 등록할 수도 있으며,

[모두 스테이지에 올리기] 버튼을 클릭하면

나열되어 있는 모든 파일을 한 번에 올릴 수도 있습니다.

반대로, 스테이지에 올라간(등록한) 파일을

취소(내리기) 하기 위해서는

“스테이지에 올라간 파일” 영역에 있는 파일 리스트에 대해

[-] 버튼을 이용해 개별 파일을 선택해서

하나하나 취소할 수도 있으며,

[모두 스테이지에서 내리기] 버튼을 이용

등록되어 있는 모든 파일을 한 번에 내릴(취소할) 수도 있습니다.

소스트리(Sourcetree)를 이용해 스테이지에서 내리기(등록 취소하기)
소스트리(Sourcetree)를 이용해 스테이지에서 내리기(등록 취소하기)

매번 얘기하는 것이지만 소스트리와 같은 GUI 툴을 이용하면 편리합니다.

 

터미널(Git Bash)에서 스테이지에 등록된 파일을 취소하기 위해서는

rm(삭제), restore(복구), reset(리셋) 명령어를 사용할 수 있습니다.

 

rm(삭제) 명령어를 사용할 경우에는

--cached 옵션을 함께 사용하고,

커밋을 한번이라도 하지 않은 상황에서 사용합니다.

rm 명령어는 tracked 상태의 파일을 untracked 상태로 변경합니다.

 

restore(복구) 명령어를 사용할 경우에는

--staged 옵션을 함께 사용합니다.

 

reset(리셋) 명령어는

보통 커밋을 취소하는 용도로 주로 이용됩니다만

staged 상태의 파일을 unstage 상태로 변경하는 데 사용할 수 있습니다.


rm 명령어로 스테이지 등록 취소하기

커밋을 한번도 하지 않은 상황이라면 rm 명령어를 사용해야 합니다.

반대로 한번이라도 커밋을 했던 상황이라면 reset 또는 restore 명령어를 사용합니다.

reset(리셋)은 커밋을 되돌릴 때도 사용하게 되는데 커밋 후 되돌리는 부분은 뒤에서 다시 얘기하겠습니다.

 

저장소에 커밋을 한 번도 하지 않은 상황에서

스테이지에 등록 후 커밋하지 않고

스테이지 영역에서만 등록된 파일을 삭제하기 위해서는

rm 명령어와 --cached 옵션을 함께 다음과 같이 사용합니다.

 

# 커밋을 한번도 하지 않은 경우에
# 스테이지에서 파일 내리기(등록 취소)	
$ git rm --cached <파일명>

다음과 같이 예제 화면을 함께 보겠습니다.

$ git status 로 Git의 상태를 확인한 결과가 다음 화면과 같습니다.

커밋을 한번도 하지 않았으며 스테이지에 등록한 경우의 Git 상태 확인
커밋을 한번도 하지 않았으며 스테이지에 등록한 경우의 Git 상태 확인

No commits yet이라는 메시지가 확인됩니다.

이는 저장소를 초기화한 이후 커밋을 한 번도 하지 않았다는 것입니다.

이럴 경우 스테이지의 파일을 내리려면 rm 명령어를 사용해야 합니다.

 

그래서 아래 use “git rm –cached <file>...” to unstage라고 안내하고 있는 것입니다.

 

reset과 restore 명령어는 HEAD를 기반으로 동작합니다.

HEAD는 한번이라고 커밋을 해야만 생기는 값이기 때문에

커밋을 한번도 하지 않은 상황에서는 사용할 수 없는 것입니다.


[상황 1] 한 번이라도 커밋한 이력이 있는 상황에서 rm 명령을 사용하면 어떻게 될까요?

커밋 이력이 있는 상황에서 fileb.html 파일을 수정 후 $ git status를 통해 상태를 확인합니다.

한번이라도 커밋한 이후의 Git 상태 확인
한번이라도 커밋한 이후의 Git 상태 확인

fileb.html 파일은 modified 상태인 것을 알 수 있습니다.

 

$ git add를 통해 스테이지에 등록합니다.

한번이라도 커밋한 이후의 스테이지에 파일 등록 후 Git 상태 확
한번이라도 커밋한 이후의 스테이지에 파일 등록 후 Git 상태 확

위와 같이 스테이지에 등록된 것을 알 수 있습니다.

커밋을 한번도 하지 않은 상황에서는 unstage 하려면 rm을 사용하라고 안내하던 것과는 달라졌습니다.

이제는 “git restore --staged <file>...”와 같이 하라고 안내하고 있습니다.

 

그럼에도 rm 명령으로 삭제해 보겠습니다.

$ git rm --cached 명령으로 fileb.html 파일을 삭제한 후 Git 상태를 확인한 화면이 다음과 같습니다.

한번이라도 커밋을 했던 상황에서 rm 명령을 사용한 경우의 파일 상태
한번이라도 커밋을 했던 상황에서 rm 명령을 사용한 경우의 파일 상태

rm(삭제) 명령으로 인해 fileb.html은 Untracked 상태의 파일이 되어 버렸습니다.

이는 Git이 추적을 더 이상 하지 않는 상태이기에,

저장소 입장에서는 저장소에 커밋되어 있던 fileb.html 이 삭제되었다고 변경 사항으로 인식하게 됩니다.

 

이 상태에서 커밋을 하게 되면

저장소에 커밋되어 있던 fileb.html 은 삭제되고,

워킹 디렉토리에 fileb.html은 최초 파일을 생성했던 상태와 같아집니다.

 

따라서, 한번이라도 커밋을 했던 상황에서는

저장소에서 파일 정보를 삭제하지 않는 한 rm 명령어는 사용하지 않습니다.

 

CLI로 Git을 다룬다는 것은 쉬운 일은 아닙니다.

소스트리를 이용하면 이러한 사항을 굳이 몰라도 될 수 있습니다.

하지만 Git의 동작을 상세히 이해하기 위해서는 한 번은 알아 두면 좋겠습니다.


[상황 2] 한 번도 커밋한 이력이 없는 상황이고,
스테이지에 등록한 상태에서 파일을 추가 수정했습니다.
이런 상황에서 스테이지에 등록되어 있는 파일을 내리면 Git은 어떤 반응을 보일까요?

 

사실 이런 경우엔 스테이지에 추가로 올리면 되는 상황입니다.

그래도 충분히 있을 수 있는 경우이기에 확인해 보겠으며,

먼저 스테이지에 등록한 상태에서 파일을 추가 수정한 상황을 만들어 보겠습니다.

fileb.html을 수정해서 스테이지에 등록하고,

또 수정한 다음 Git의 상태를 확인한 것이 다음의 화면입니다.

커밋 이력이 없는 상황에서 스테이지에 등록 후 파일 수정한 Git 상태
커밋 이력이 없는 상황에서 스테이지에 등록 후 파일 수정한 Git 상태

이 상태를 소스트리에서 확인하면 다음과 같습니다.

커밋 이력이 없는 상황에서 스테이지에 등록 후 파일 수정한 후의 소스트리의 파일 상태
커밋 이력이 없는 상황에서 스테이지에 등록 후 파일 수정한 후의 소스트리의 파일 상태

앞서도 얘기했지만 이런 경우는 다시 스테이지에 올리면 되지,

굳이 올라가 있는 것을 내리려고 할 필요는 없습니다.


하지만, 이런 경우에도 다음과 같이 노란색 박스로 표시한 메시지를 보면

커밋 이력이 없는 상황에서 스테이지에 등록 후 파일 수정한 Git 상태
커밋 이력이 없는 상황에서 스테이지에 등록 후 파일 수정한 Git 상태

스테이지에 등록된 것을 취소하려면 rm을 사용하라고 안내하고 있습니다.

안내와 같이 $ git rm --cached fileb.html을 실행해 보겠습니다.

git rm 명령 실행
git rm 명령 실행

실행 결과 오류가 발생하고 내릴 수 없음을 알 수 있습니다.

안내에도 나와 있지만,

그럼에도 불구하고 삭제하려면 -f 옵션을 추가

강제로 삭제할 수 있습니다.

 

소스트리에서도 삭제해 보겠습니다.

[스테이지에 올라간 파일] 영역에 있는 fileb.html 파일 오른쪽에 [-] 버튼을 클릭합니다.

소스트리(Sourcetree)에서 스테이지에 올라간 파일 내리기
소스트리(Sourcetree)에서 스테이지에 올라간 파일 내리기

다음과 같이 오류가 발생하고 내릴 수 없음을 알 수 있습니다.

소스트리(Sourcetree)에서 스테이지에 올라간 파일 내릴 경우 오류 메시지
소스트리(Sourcetree)에서 스테이지에 올라간 파일 내릴 경우 오류 메시지


reset 명령어로 스테이지 등록 취소하기

reset 명령어는 커밋이 한 번이라도 되어서 HEAD 포인터를 가지고 있는 경우에 사용이 가능합니다.

 

$ git reset <파일명> 형식으로 사용할 수 있습니다.

# 커밋을 한번이라도 한 경우에 스테이지에서 파일 내리기(등록 취소)
$ git reset <파일명>

다음 예제는 reset(리셋) 명령어

스테이지 영역에 등록된 filea.html을 취소하는 것을 보여줍니다.

 

reset 명령어로 스테이지에 등록된 파일 내리기
reset 명령어로 스테이지에 등록된 파일 내리기

filea.html 파일을 스테이지에 등록 후 reset 명령어를 사용해 내리면,

Unstaged changes after reset:

M filea.html

이라는 메시지가 출력되는 것이 확인되면,

정상적으로 Unstaged 된 것입니다.


restore 명령어로 스테이지 등록 취소하기

마지막으로 restore 명령어를 사용하는 방법으로 --staged 옵션을 함께 이용해야 합니다.

$ git restore --staged <파일명> 형식으로 사용할 수 있습니다.

# 커밋을 한번이라도 한 경우에 스테이지에서 파일 내리기(등록 취소)	
$ git restore --staged <파일명>

먼저 새로 생성한 fileb.html 파일을 스테이지에 올리고 Git 상태를 확인한 결과입니다.

파일 생성 후 Git 상태 확
파일 생성 후 Git 상태 확

git status 한 결과에도 unstage 하는 방법이

git restore --staged <file>…”라고 알려주고 있는 것을 볼 수 있습니다.

한번 실행하고 상태를 다시 확인해 보겠습니다.

 

그전에 이 상태에서 소스트리도 한번 확인해 보겠습니다.

커밋 이력이 있는 상황에서 스테이지에 등록 후 파일 수정한 후의 소스트리의 파일 상태
커밋 이력이 있는 상황에서 스테이지에 등록 후 파일 수정한 후의 소스트리의 파일 상태

fileb.html 파일이 “스테이지에 올라간 파일” 영역에 포함되어 있는 것을 볼 수 있습니다.

이제 restore 명령어로 내려보도록 하겠습니다.

restore 명령어로 스테이지에 등록된 파일 내리기
restore 명령어로 스테이지에 등록된 파일 내리기

fileb.html 파일이 다시 Untracked 되었음을 확인할 수 있습니다.

filea.html 는 한번 커밋했던 파일이었고,

fileb.html 파일은 새로 생성해서

한 번도 커밋하지 않았던 파일이라 restore 한 결과가 다르게 표현됩니다.

 

소스트리에서도 이를 구분해 볼 수 있습니다.

다음이 위 결과를 소스트리로 확인한 결과입니다.

restore 명령어로 내린 후 소스트리(Sourcetree)에서 파일 상태 확인
restore 명령어로 내린 후 소스트리(Sourcetree)에서 파일 상태 확인

“스테이지에 올라가지 않은 파일” 영역의 파일을 잘 보기 바랍니다.

 

filea.html과 fileb.html 앞에 표시되고 있는 아이콘이 다름을 알 수 있습니다.

표시는 커밋을 한 번이라도 했던 파일인데, 수정이 발생했다는 표시이고,

표시는 커밋을 한 번도 하지 않았고 Untracked 상태의 파일이라는 표시로 이해할 수 있습니다.

 

여기까지 스테이지에 등록한(올린) 파일을 취소(삭제) 하는 방법을

여러 가지 측면에서 살펴봤습니다.

 

다음에는 커밋한 이후 커밋을 취소하거나 되돌리는 방법을 살펴보겠습니다.

 

감사합니다.

댓글