git error : the following untracked working tree files would be overwritten by checkout: 파일명

2021. 3. 24. 14:34git

728x90

git에서 branch를 변경하려다 (git checkout 브랜치명) 이런 에러가 발생했습니다.

$ git fetch --all
$ git reset --hard origin/main

이 두가지 명령으로 해결했습니다.


1. git fetch 

원격 저장소 내용을 가져와 local에 자동으로 병합 작업을 실행하는 git pull 명령과 달리, fetch는 원격 저장소의 내용을 확인만 하고, local data와의 병합은 실행하지 않습니다.

fetch 실행 시 원격 저장소의 최신 이력을 확인하고, 최신 commit 이력은 이름 없는 branch로 local에 가져옵니다. (FETCH_HEAD라는 이름으로 checkout가능)

 

밑의 그림은 fetch시 local에 남는 이력에 대해 보여줍니다. B에서 진행된 commit이 있는 상태에서 fetch진행시, local의 master에는 D의 상태가 남아있고, origin master에서의 commit이력들은 FETCH_HEAD라는 이름 없는 branch에 남게 되는 것이죠.

https://backlog.com/git-tutorial/kr/stepup/stepup3_2.html

만약 이 이 후에 원격 저장소 내용을 local 의 master에 통합하고 싶다면, FETCH_HEAD 를 merget하거나 pull을 다시 실행해주면 다음 그림과 같이 됩니다. ( fetch + merge = pull )

https://backlog.com/git-tutorial/kr/stepup/stepup3_2.html



2. git reset hard origin/main

git은 크게 보았을 때, 마지막 commit의 snapshot이자 다음 commit의 부모 commit인 HEAD, 다음에 commit할 snapshot인 Index, 샌드박스 역할의 working directory 세가지를 관리합니다.

(샌드박스는 외부로부터 받은 파일을 바로 실행하지 않고 보호된 영역에서 실행시켜 봄으로써 외부로부터 들어오는 파일과 프로그램이 내부 시스템에 악영향을 주는 것을 방지하는 기술입니다.)

 

HEAD: 현 브랜치 가리키는 포인터. 현재 브랜치 마지막 commit의 snapshot

 

Index: Staging area라고 칭하는 git commit을 실행시 git이  처리할 것들이 있는 곳의 개념이라 생각하면 된다.

working directory에서 마지막으로 checkout한 branch의 파일 목록과, 내용으로 채워지며, 변경작업을 한 후 변경한 내용으로 index를 업데이트 할 수 있으며 이 업데이트 이후 git commit을 실행하면 Index는 새 commit으로 변환된다.

 

working directory: sandbox의 역할, commit 전에는 staging area에 올려놓은 후 얼마든지 변경 가능

 

이 세가지를 이용해 다음 그림과 같이 더 나은 상태로 프로젝트 snapshot을 지속적으로 저장한다.

https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0

이제 본격적으로 Reset에 대해 설명하자면

reset --soft ~~ reset명령에 commit을 넘기고 실행하면, ~~가 가리키는 commit을 최신commit으로 바꿉니다.
reset --mixed ~~ Index update ~~가 가리키는 commit으로 index를 업데이트
(정확하게 이해한건지 모르겠네용...) 이후 staging area를 비워주어서 git commit과 git add명령까지 되돌려준다.
reset --hard ~~ working directory까지 모두 업데이트
reset 명령을 통해 git add  git commit 명령으로 생성한 마지막 커밋을 되돌린다.  워킹 디렉토리의 내용까지도 되돌린다.
--hard 옵션은 되돌리는 것이 불가능하다. 

reset 명령은 정해진 순서대로 세 개의 트리를 덮어써 나가다가 옵션에 따라 지정한 곳에서 멈춘다.

  1. HEAD가 가리키는 브랜치를 옮긴다. (--soft 옵션이 붙으면 여기까지)
  2. Index를 HEAD가 가리키는 상태로 만든다. (--hard 옵션이 붙지 않았으면 여기까지)
  3. 워킹 디렉토리를 Index의 상태로 만든다.
728x90