git mv, rm - 파일의 삭제, 이동을 git에게 정확하게 알려주기

김동규·2023년 4월 23일
0

Git

목록 보기
4/15

파일의 이동을 git에게 정확하게 알려주기

나는 파일을 삭제하지 않았는데 git은 삭제했다고 받아들일 때가 있습니다. 예를 들어 작업 중 파일을 다른 디렉토리로 옮겨야 하는 상황이 있을 겁니다.

이 때 마우스로 드래그&드롭 하거나 mv 명령을 통해 파일을 이동시켰다면, 파일이 외부에서 조작된 것이기 때문에 git은 그 변화를 제대로 추적할 수 없습니다.

git의 관점에서는 그저 한 곳에서 파일이 삭제되었고 다른 곳에서 아직 추적하지 않는 파일이 하나 추가된 상황이기 때문입니다.

이렇게되면 어떤 문제가 생길 수 있을까요?

!주의하기: 파일을 이동했을 뿐인데 어느 순간부터 양쪽 디렉토리 모두에 파일이 보여요

다른 팀원이 작업을 위해 git 외부를 통해 이동시킨 파일을 필요로 하는 상황이라 가정해봅시다.

deleted와 untracked를 각각 다른 커밋에 반영해 처리했다면 그 팀원은 파일이 사실 삭제된 것이 아니라 이동되었을 뿐이라는 사실을 깨닫기 어렵습니다. 때문에 삭제된 파일을 복구하기 위해 restore, revert등의 명령을 사용했습니다.

실제로 그런 일이 일어나면, 같은 파일의 다른 버전이 이동하기 전의 경로에도 공존하게 됩니다. 팀원이 자신의 업무를 진행하며 커밋을 추가할 경우 다음과 같은 상황이 벌어집니다.

  1. 이동시킨 경로에서 본인이 작업중이던 파일 A
  2. 이동시키기 전의 경로에서 팀원이 작업한 파일 B

때문에 문제를 눈치챈 시점에서 발견자는 추가적으로 필요없는 경로의 파일을 통합, 삭제하고 커밋하여 원격 저장소에 그 커밋을 반영하는 귀찮은 절차를 거쳐야 합니다.

git mv는 이런 문제를 예방하기 위해 사용할 수 있는 명령입니다.

git mv를 통해 파일을 이동시킬 경우 git은 같은 파일이 자리를 옮겼을 뿐이라는 사실을 정확하게 추적할 수 있습니다.

굉장히 작은 단위로 history를 관리하는 사람이 사용하더라도 해당 변화는 무조건 하나의 커밋 내에 반영됩니다. 진행 상황을 모르는 다른 팀원이 보더라도 파일이 이동했을 뿐이라는 사실이 명확합니다.

파일의 삭제를 git에게 알려주기

사실 git rm의 경우 mv/git mv의 차이처럼 문제발생의 여지가 크지는 않습니다. 어차피 remote repository에 파일 삭제사실을 반영하는 과정에서 add와 commit, push가 일어나기 때문이죠.

다만 git rm명령을 활용하면 삭제한 즉시 삭제한 사실을 index까지 반영해줍니다. 삭제와 add까지 마친 상태이기 때문에 즉시 commit 가능하여 명령 단계를 줄일 수 있습니다.

/* rm 혹은 직접 파일을 삭제한 경우 <pathspec>에는 파일 경로를 입력 */
git add <pathspec>
git commit 
git push

/* git rm으로 파일을 삭제한 경우 */
git commit 
git push

로컬에 실제 파일은 남겨두고 git의 추적 대상에서만 제외하기

--cached옵션을 활용하면 실제 파일 자체는 로컬에 남겨두면서 git에게만 파일이 삭제된 것처럼 취급할 수 있습니다.

git rm --cached <pathspec>

이렇게 되면 index에 삭제된 파일과 Untracted상태의 파일이 보입니다.

  1. 이제 삭제한 사실을 반영하기 위해 commit합니다. 원격 저장소까지 반영해야 한다면 push까지 진행합니다.
  2. Untracked로 표시된 로컬 파일은 .gitignore에 추가하거나 다른 곳에 보관해둡시다.
profile
공식문서를 사랑하는 프론트엔드 주니어 개발자

0개의 댓글

관련 채용 정보