Github에 올릴 파일을 선별하는 방법(gitignore, update-index, rebase)
1. 로컬 전용
보통 github에 올라가면 안 되고 오로지 로컬에서만 사용하는 파일의 경우 아래와 같이 .gitignore
에 적어놓고 git이 해당 파일을 추적하지 않도록 합니다.
*.zip # 모든 zip 파일
temp/ # temp 디렉토리와 하위의 모든 파일
/log # 최상위 디렉토리 아래에 있는 log
하지만 이미 git add
로 staging area에 추가되었거나 repository에 올라가버린 경우
git rm
로 삭제한 다음 commit을 해야합니다.
$ git rm 파일명 |
2. 개별 설정 파일
github에 업로드는 되어있으나, 이를 다운받아서 개인별로 환경에 맞게 수정해 사용하는 설정 파일의 경우 git이 추적하지 않도록 막아야 합니다.
예를 들어, 서버에 있는 설정 파일에 /home/abc
가 경로로 잡혀있고, repository에도 같은 내용으로 올라가 있다고 하죠.
개발자들은 해당 파일을 받아 경로를 C:\abc
로 수정해서 사용하게 될 겁니다.
그런데 누가 자기가 가진 파일을 올려버리면 당연히 서버는 해당 경로를 찾을 수 없을 테고 오류가 발생하게 되겠죠?
그런데 1. 의 경우와는 달리 이미 repository에 올라가 있는 상태이고 이를 제거할 수는 없기 때문에 개발자가 사용하는 IDE 등에서 따로 설정을 해주어야 합니다.
$ git update-index --assume-unchanged 경로/파일명 |
터미널에서 위와 같이 입력하면 해당 파일에서 변경된 내역을 git이 추적하지 않게 만들 수 있습니다.
다시 추가하려면
$ git update-index --no-assume-unchanged 경로/파일명 |
3. 일부 커밋을 제외하고 push 하기
다른 브랜치에서 개발 중인 내역(2)을 당겨와 확인하고 제가 개발 중이던 건(3)을 커밋했습니다.
원격 저장소의 제 브랜치에 (1) (2) (3)이 올라가 있는 상태에서 풀 리퀘스트로 마스터 브랜치에 병합을 하려고 보니 다른 브랜치에서의 개발이 아직 끝나지 않았다고 합니다.
(2) 때문에 제가 개발 중이던 (3)도 올릴 수가 없는 상황이 되어버렸습니다.
이럴 때는 rebase
를 활용하여 일부 커밋을 제외하고 push할 수 있습니다.
먼저 git log
로 제거하려는 커밋(2)의 직전 커밋(1) 해시값을 확인합니다.
$ git log |
(1)의 해시값이 asjdf1123kjw123eio23
라고 할 때 다음과 같이 입력하면
$ git rebase -i asjdf1123kjw123eio23 |
vi 에디터가 열리는데,
i
를 눌러 입력모드로 전환한 다음
제거하려는 커밋(2)을 DROP
으로 바꿔줍니다.
ESC를 눌러 입력모드를 종료한 뒤 :wq
를 입력하면 에디터가 저장 후 종료됩니다.
이제 로컬에서는 해당 커밋이 제외된 상태입니다. 원격 저장소에 덮어씌우기만 하면 됩니다.
그런데 이미 원격 저장소에는 해당 커밋이 올라간 상태이기 때문에 push를 할 때 강제 옵션 -f
을 붙여줘야 합니다.
-f
로 덮어쓰기를 할 경우 복구가 되지 않으니 주의해서 사용하시기 바랍니다.
$ git push -f origin master |
쫄지 않고 엔터를 살포시 눌러주면 원격 저장소의 자기 브랜치에서 골칫거리(2)가 사라졌으므로 마음껏 풀 리퀘스트를 할 수 있게 되었습니다!