Git 커밋되지 않은 변경 사항 제거

Stewart Nguyen 2023년1월30일
  1. git checkout을 사용하여 Git에서 커밋되지 않은 변경 사항 제거
  2. git reset을 사용하여 Git에서 커밋되지 않은 변경 사항 제거
  3. git stashgit stash를 사용하여 Git에서 커밋되지 않은 변경 사항 제거
Git 커밋되지 않은 변경 사항 제거

이 문서에서는 로컬 저장소에 대한 커밋되지 않은 변경 사항을 취소하는 방법을 안내합니다.

기능으로 작업할 때 먼저 새 파일을 만들고 기존 파일에 변경 사항을 추가한 다음 일부 파일을 삭제할 수 있습니다. 결국 우리는 그것이 모두 잘못되었다는 것을 깨닫고 이전 커밋으로 돌아가야 합니다. 우리는 무엇을 해야 합니까?

$ echo 'Add new implementation' > feature.txt
$ echo 'Enhance exising feature' >> file.txt
$ git add file.txt
$ rm deprecated_feature.txt
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   file.txt

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

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

우리는 그것을 달성하는 몇 가지 방법이 있습니다.

git checkout을 사용하여 Git에서 커밋되지 않은 변경 사항 제거

이 명령은 추적된 파일에 대한 커밋되지 않은 변경 사항을 되돌립니다. 추적 파일은 일반적으로 git add에 의해 추가된 후 git이 알고 있는 파일입니다.

$ git checkout .
Updated 2 paths from the index
$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

nothing added to commit but untracked files present (use "git add" to track)

git add를 통해 파일이 이미 스테이징 영역에 추가된 경우 git checkout이 작동하지 않습니다.

$ echo 'Enhance exising feature' >> file.txt
$ git add file.txt
$ git checkout file.txt
Updated 0 paths from the index
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   file.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

위의 예에서 file.txt에 대한 변경 사항은 이 파일이 준비 영역에 있기 때문에 되돌려지지 않습니다.

git reset을 사용하여 Git에서 커밋되지 않은 변경 사항 제거

스테이징 영역에서 커밋되지 않은 변경 사항을 제거하려면 다음 단계를 수행해야 합니다.

  1. git reset을 사용하여 스테이징 영역에서 파일을 스테이징 해제합니다.
  2. git checkout을 사용하여 변경 사항을 실행 취소합니다.
$ git reset file.txt
Unstaged changes after reset:
M	file.txt
$ git checkout file.txt
Updated 1 path from the index
$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

nothing added to commit but untracked files present (use "git add" to track)

git reset을 사용하여 커밋되지 않은 변경 사항을 제거하는 또 다른 방법은 --hard 옵션과 HEAD 매개변수를 사용하는 것입니다.

$ git reset --hard HEAD
HEAD is now at 1e087f5 Make some change to file.txt
$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

nothing added to commit but untracked files present (use "git add" to track)
  • --hard 옵션은 Git이 현재 상태와 마지막 인수의 커밋 사이의 모든 변경 사항을 처리하도록 지정합니다. 이러한 이유로 이 명령은 위험한 것으로 간주되며 작업 파일을 확인하기 위해 git status를 실행한 후에 사용해야 합니다.
  • 최신 커밋에 대한 HEAD 별칭.

git stashgit stash를 사용하여 Git에서 커밋되지 않은 변경 사항 제거

git checkoutgit reset의 단점은 추적되지 않은 파일을 제거할 수 없다는 것입니다. feature.txt는 해당 명령을 실행한 후에도 유지됩니다.

첫 번째 예를 고려하십시오.

$ echo 'Add new implementation' > feature.txt
$ echo 'Enhance exising feature' >> file.txt
$ git add file.txt
$ rm deprecated_feature.txt
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   file.txt

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

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

준비된 파일, 추적되었지만 준비되지 않은 파일 및 추적되지 않은 파일을 포함하여 커밋되지 않은 모든 변경 사항을 제거합니다. 우리는 git stash에 깔끔하게 접근하여 사용할 것입니다.

git stash를 사용하면 변경 사항을 저장할 수 있지만 git commit이 필요하지 않습니다. 커밋되지 않은 파일의 임시 저장소 역할을 합니다.

임시 저장소에 변경 사항을 추가한 후 Git에 저장된 내용을 drop하도록 지시합니다. 따라서 커밋되지 않은 모든 변경 사항이 사라집니다.

$ git add .
$ git stash
Saved working directory and index state WIP on main: 16b9767 deprecated_feature.txt
$ git stash drop
Dropped refs/stash@{0} (aebeb2cbdcec917331f5793ef1238f5a525d29ec)
$ git status
On branch main
nothing to commit, working tree clean

요약하면 커밋되지 않은 변경 사항을 제거하는 몇 가지 접근 방식이 있습니다.

  1. git checkout은 파일이 준비 영역에 없을 때만 유용합니다.
  2. git reset은 스테이징 영역에 있는 변경 사항에 유용하지만 추적되지 않은 파일의 변경 사항을 제거할 수 없으며 git checkout과의 조합이 필요합니다.
  3. git reset --hard HEAD는 위보다 짧을 수 있지만 잠재적으로 위험합니다.
  4. git stashgit add . 추적되지 않은 파일을 포함하여 모든 것을 제거할 수 있습니다.

관련 문장 - Git Commit