본문 바로가기
TIL

git checkout .과 git clean 명령어에 대해서

by mazayong 2023. 9. 15.

checkout .와 clean 명령어를 명확하게 말하지 못하는 것 같아서 겸사겸사 정리할 겸 기록해둔다.

 

 

 

<목차>

1. tracked / untracked?

2. git status에서 변경점이 생긴 파일들의 분류

3. 상황별 작업 취소 명령어 정리

4. checkout, reset

5. clean

6. git checkout <filename> vs git clean -f

 

 

 

 

둘 다 git status를 통해 로컬 git 저장소에 변경점이 생긴 파일을 관리할 수 있다.

이 파일들의 종류를 알아보기 위해 우선 tracked와 untracked 상태의 차이를 알아보자.

 

 

 

1. tracked / untracked?

tracked : git에 파일이 등록되어 있는 경우. (파일 삭제/변경시)

untracked : git에 등록되지 않은 경우.

 

이제 tracked와 untracked의 차이를 알았으니 git status를 통해 확인할 수 있는 파일들의 종류들을 알아보자.

 

 

 

2. git status에서 변경점이 생긴 파일들의 분류

2.1. Changes to be committed

- tracking되는 파일.

- stage에 이름이 올라가 있는 파일들

-> commit 명령어 사용시 다음 commit에 포함됨.

2.2. Changes not staged for commit

- tracking되는 파일.

- stage에 이름이 올라가 있지 않은 파일들.

2.3. Untracked files

- untracking인 상태.

- 생성 이후 git에 파일이 등록되어 있지 않음.

 

 

2.1~2.3은 tracked 목록에 올라왔는지 여부를 판단하는 1차 분류이다. 2차 분류는 파일의 생성(Add), 편집(Modified), 삭제(Deleted)로 나뉜다.

status로 해당 사항들을 확인할 수 있지만, 조건을 간략히 보려면 --short / -s옵션을 사용한다.

git status --short
git status -s

//파일명 앞에 A, M, D와 같이 이니셜로 결과 표기

 

 

분명 차이점을 적으려고 했는데..작업 취소 명령어들에 대한 상태들이 다양하기 때문에 우선 작업 상태에 대한 취소 명령어들을 정리해놓으려고 한다.

 

 

3. 상황별 작업 취소 명령어 정리

- 특정 파일의 수정사항 되돌리기 : git checkout <filename>

- 모든 수정사항 되돌리기 : git reset --hard

(hard는 해당 커밋 이후 모든 수정사항, staging된 것들이 폐기되어 권장하지 않는다. 되도록 --soft 사용을 권장.)

- stage 영역의 모든 수정사항 삭제 : git reset --hard <commitId>

- 여러 commit 통합 : git reset <commitId...>

- 이전 commit 수정 / 통합 / 분리 : git rebase --interactive <commitId>

- untracked 파일 포함해 모든 수정사항 되돌리기 : git clean -fd

- 이전 commit 삭제하지만 history 유지 : git revert <commitId>

 

(++원격 저장소에 수정사항이 잘못 올라갔을 때, 강제로 해당 커밋을 없애는 것보다 revert를 사용해 새 커밋을 만들어 반영시키는 것이 낫다.

위 명령어들이 아닌 다른 명령어들은 다른 원격 저장소에 push하지 않았을 때에 사용이 권장되는 명령어들이다.)

 

우선 특정 파일의 수정사항을 되돌리는 checkout, reset부터 살펴보자.

 

 

4. checkout, reset

수정사항이 stage영역 여부에 있는지에 따라 사용하는 명령어가 달라진다.

 

4.1. 수정 사항이 staging되지 않았을 때

- git checkout <filename>

 

4.2. 수정사항이 staging되었을 때

- git reset HEAD <filename>

- git checkout <filename>

--> 가장 최신 커밋에 저장되어 있던 파일의  원래 상태가 복구되어 커밋하지 않았을 때에도 사용할 수 있다.

(++git reset <filename> or <commit>은 파일을 해당 commit 이전으로 되돌릴 수 있기 때문에 상황에 따라 적절히 활용하는 게 좋다.)

 

4.3. reset 옵션

- hard : commit 이후 발생한 모든 수정사항, staging된 수정사항 폐기.

- sort : 파일 수정사항 남아있고, 수정된 파일들이 Changes to be commited 상태가 된다.

- mixed : 파일 수정사항 남아있지만 staging된 수정사항 폐기.

- merge : staging 영역 수정사항은 폐기, commit~head 사이 수정 파일 업데이트, 수정 파일은 staging되지 않음.

- keep : --merge와 비슷, commit때와 head에 다른 파일에 일부 변경 사항이 있으면 reset 중단.

 

그 외 reset 명령어에 대한 이야기, rebase는 다른 게시글로 작성하도록 하겠다.

 

 

 

5. clean

작업 트리를 청소하는 방법이다.

untracked 파일을 아예 없애버리기 : git clean -d

tracking하지 않는 모든 정보 비워버리기 : git clean -fd ( --force)

지워도 되는지 파일 확인 : git clean -d -n

.gitignore에 명시되는 등 무시되는 파일 : git clean -dx

대화형으로 실행하려는 조건 : git clean -di

 

 

 

 

6. 결론적으로 git checkout <filename> vs git clean

git checkout <filename> : staging되지 않은 <filename>의 수정 상태를 되돌린다.

git clean -f : untracking된 파일들의 정보를 폐기한다.