이번시간에는 Git이 추적하지 않은 untracked file을 어떻게 관리해야 되는지를 중심으로 알아보자 .
Git으로 프로젝트를 관리하다 보면 untracked 파일이 쌓이는 경우가 종종 있다. 브런치를 따로 파서 기능별로 개발을 하면서, a 브랜치에서 쓰는 파일을 b 브랜치에서 쓰고 싶지 않은 경우도 있고 각 브랜치마다 파일을 독립적으로 보관하고 싶을 때가 있다.
혹은 remote 저장소에 넣을 파일은 아니지만, 테스트용으로 로컬에서 임시로 만들었다거나 이미지 등의 파일을 추가하려고 프로젝트 밑에 추가했거나 하는 경우가 생길 것이다. 이런 경우에 어떻게 깃을 활용할지에 대해 알아보자.
Git은 자기 폴더에 있는 파일을 크게 보면 Tracked, Untracked 이 두 가지의 상태로 분류해서 관리한다.
- Tracked: Git이 관리해주는 상태( 넌 관리 대상이야!)
- Untracked: Git이 관리하지 않는 상태(넌 관리대상 아님!)
Tracked File은 깃이 추적하고 관리하는 상태를 말하며, Git은 관리하는 파일(tracked file)을 다시 한번 3개의 상태로 세분화해서 관리를 해준다.
그 4가지의 상태는 지난 시간의 깃의 stage상태를 참조하자. Git의 workflow 이해
지난 시간에 우리는 Git은 파일을 크게는 Commited, Modified, Staged 세가지 상태로 관리한다고 배웠다.
git의 플로우로 보면 untracekd, unmodified, modified와 staged, commited로 나눠 볼 수 있다.
깃에서 Tracked file은 3가지 상태로 나누어진다.
이러한 세분화된 상태들을 보고 우리는 파일을 상태를 알 수 있다.
파일의 상태가
Untracked File은 앞서 말했듯이 git 저장소안에 파일은 있지만( 즉 현재는 working directory에서 작업을 하고 있는 상태이고) 이 파일이 Git 저장소에는 있지만 Git에 의해서 관리되고 있지 않은 파일입니다 라고 친절하게 깃이 우리게에 알려주는 상태 메세지 같은 것이라 할 수 있다.
즉, Tracked는 한 번이라도 커밋을 한 파일의 수정 여부를 계속 추적하는 상태라고 할 수 있고, untracked는 한 번도 깃에서 버전 관리를 하지 않았기 때문에 수정사항 내역을 추적하지 않는 상태라고 할 수 있다.
먼저 우리가 개인이 아닌 협업을 하는 프로젝트를 하는 과정이라고 생각해보고 진행해보자.
처음 우리는 저장소를 git clone
을 통해 초기 셋팅을 다같이 받을 것이다. 처음 clone
하면 모든 파일은 tracked이면서 unmodified 상태가 된다. 파일은 클론받고 브랜치를 생성한다. 처음 git branch <만들 브랜치이름>
후
그 브랜치로 이동(git checkout 만든 브랜치이름
)하면, 파일은 아무런 수정 변동사항이 없었기 때문에 unmodified 상태이다. 그 이후 우리가 어떤 파일을 수정하게 되면, git은 그 파일을 modified상태로 인식한다.
git stauts
의 명령어를 통해 상태를 확인 가능하다.
최초 클론 후나 마지막 커밋이후 전혀 건든 내역이 없다면, nothing to commit, working tree is clean 이런 메세지가 나오고 untracekd / tracked 등 아무런 파일 상태가 나타나지 않을 것이다.
파일을 을 새로 만들고 git status시에는 untracked fileds에 포함될 것이다.
git add
의 명령어를 통해 깃에게 버전관리를 시작해! 라고 알려주고 파일을 추적시킬 수 있다.이 명령은 파일 or 디렉토리를 받는다. 그래서 디렉토리를 받는다면 그 하위에 모든 파일들까지 관리명단에 추가시킨다.
git add . <-- 모든 파일 add
git add -a <--위와 동일함(-all option임)
파일을 추가 하고 git add후 git status를 해보면, untracked -> tracked 로 변경되었고
changed to be comitted 에 파일이 들어가 있어서 staged(커밋 직전 단계) 상태인 것을 알 수 있다.
혹시 git add후 커밋을 안하고 그 파일을 다시 수정한다면, 그 파일은 staged에서 unstaged로 간것을 확인 할 수 있다?
왜? 라는 의문점이 생길텐데 , 이는 git add후 커밋을 안했기 때문에 일어나는 것이고 git add
명령을 실행한 후 또 파일을 수정했다면 다시 git add
명령을 실행해 최신 버전을 Staged
상태로 만들어야 한다
파일 수정한 것을 staging area로 옮겨서 staged되었다.
git commit
의 명령어를 통해 버전관리를 업로드 해줄 수 있다.기억해야 할점은 Unstaged 상태인 파일은 커밋이 안되니까 그점 유의해!!
즉 , Git은 Staging Area에 속한 스냅샷을 커밋한다.
git add를 생략하고 바로 커밋하는 방법(staging area를 생략하고 커밋)은 전 시리즈에 나온대로 -a옵션을 사용해
git commit -a -m "message"을 통해 커밋한다.
맨 서두에 얘기한 내용처럼 저장소에 넣을 건 아니고 테스트를 위해 파일을 만들었다던가 이미지 추가를 위해 잠시 만들었지만, 깃 저장소에 넣고 반영하고 싶지 않다면?? Untracked file을 한번에 지우고 싶다면?
git clean -f
명령어를 사용하면 untracked 파일을 모두 지울 수 있다.git clean -fd
-d 옵션을 추가해서 명령어를 사용하면 그 파일 및 디렉토리까지 전부 지울 수 있다.git clean --fd --dry-run
을 통해 제거하기전 어떤 파일을 제거할 것인지 확인이 가능하다. 그러므로 제거하지 않을 파일들은 미리 stage로 처리 하면 실수로 제거될 일은 없을 것이다.단순한 파일 변경 사실뿐 아니라 어떤 내용까지 변경됬는지 알고 싶을 때
git diff
의 명령어를 통해 사용한다.git diff는 어떤 수정 사항들이 적용됬는지 보고자 할때 사용하는 명령어 이다.
Unstaged된 상태(add안한 상태야!)의 파일들만 보여주기 때문에 staged 된 수정 사항들은 git diff로 볼 수 없다.
Modified 된 파일들만 git diff로 볼 수 있다.
Staged 상태인 파일은 git diff --cached
나git diff --staged
옵션을 통해 확인이 가능하다.
git diff origin/master origin/my_branch
이 명령어는 로컬 브랜치간 비교를 확인하는 명령어로
master 브랜치와 my_branch의 차이를 보여준다.
git diff <commit해시아이디> <commit해시아이디>
: 커밋끼리 비교 하는 명령어
git diff <비교대상 1>..<비교대상 2>
: 비교대상1과 비교대상2의 차이점 비교 ..
이 들어감
git 저장소에 가면 contrib이라는 폴더가 있는데 이 안에 diff-highlight라는 스크립트가 있다. 이 파일을 내려받아서 PATH
에 추가하면 git diff | diff-highlight
처럼 명령어를 사용할 수 있다.
git config --global pager.diff 'diff-highlight | less'
명령어로 설정에 영구적 추가하거나 혹은
~/.gitconfig
파일에 다음과 같은 설정을 추가한다.
[pager]
diff = diff=highlight | less
출처: