일반

[GIT] Commit하고 원격 저장소로 내보내기: add, reset, commit, push

Posted 2014. 10. 23 Updated 2018. 01. 18 Views 28340 Replies 0
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

 

Commit할 파일 선택하기 - add

Stage 영역은 Commit할 파일들을 올려놓는 일종의 가상 영역입니다. 이 Stage 영역을 이용하여 작업 내용 중 특정 파일들만 선별하여 Commit에 반영할 수 있으며, 이를 활용하여 작업한 내용을 여러 개의 Commit으로 분할할 수 있습니다.

다음 명령어는 변경한 내용을 모두 Stage 영역에 올립니다.

git add --all

특정 파일만 Stage 영역에 올리고 싶다면 --all 대신 파일명 쓰도록 합니다.

git add [File Name]

Untracted File을 제외한 수정/삭제된 파일만 Stage 영역에 올리고 싶다면 -u 옵션을 쓰도록 합니다.

git add -u

reset 명령어를 사용하여 Stage 영역을 초기화 할 수 있습니다.

git reset

 

로컬 저장소에 변경사항을 저장하기 - commit

commit 명령을 통해 로컬 저장소의 현재 Branch에 stage 영역에 올린 변경사항들을 반영한 새로운 commit을 작성합니다.

git commit

명령을 입력하면 Commit Log를 입력할 수 있는 에디터가 나타나고, 여기에 Commit 제목 및 Log를 입력할 수 있습니다. Commit을 취소하려면 아무 것도 입력하지 않고 에디터를 종료하면 됩니다.

commit 명령과 관련하여 자주 사용하는 옵션으로는 --amend가 있습니다. 이 옵션을 부여하면, 새로운 Commit을 생성하지 않고 가장 최근에 작성한 Commit을 수정합니다.

git commit --amend

이 옵션을 사용해 Commit을 수행하면, 작업한 내용을 가장 최근의 Commit에 덧붙입니다. 이는 가장 최근의 Commit을 삭제하고 새로운 Commit을 작성하는 것과 동일한 동작이기 때문에, 가장 최근 Commit의 ID가 새로 부여됩니다.

 

로컬 저장소의 변경 내용을 원격 저장소로 보내기 - push

다음은가장 많이 사용하는 Push 명령어의 형태입니다. 이 명령어는 '현재 branch의 HEAD Commit까지의 변경사항을 origin이라는 이름을 갖는 원격 저장소의 master branch에 전송하라'는 뜻입니다.

git push origin HEAD:master
  • origin: 원격 저장소 별칭(alias)
  • HEAD: 전송할 최종 Commit
  • master: 원격 저장소의 Branch 이름

이 때, origin(게임 런처 아닙니다-_-!)은 별도로 설정하지 않은 경우 clone 명령으로 원격 저장소를 받아올 때 입력했던 저장소 주소가 됩니다.

Push를 할 때마다 [git push git@git.tuwlab.com:batto.git HEAD:master]처럼 원격 저장소 이름을 포함한 긴 명령어를 사용해야 한다면 불편하기 때문에 원격 저장소 주소를 나타내는 별칭을 만들어 놓고 사용하는 것입니다.

이 별칭은 origin 하나만 있는 것이 아니라, 여러 개 만들어 놓고 사용할 수 있습니다. 즉, 로컬 저장소 하나로 여러 개의 원격 저장소와 연동하여 작업을 할 수 있음을 의미합니다.

※ Forced Push

Push를 수행할 때, 로컬 저장소에는 존재하지 않는 Commit이 원격 저장소에 존재하는 경우 Push 요청이 거절됩니다. 정확히 말하면, 원격 저장소에서 로컬 저장소로 변경사항을 반영한 뒤 원격 저장소의 HEAD Commit이 변경된 경우를 의미합니다.

즉, 로컬 저장소에서 작업하고 있는 도중에 다른 개발자가 원격 저장소에 Push를 한 경우 이후 본인의 Push 요청이 받아들여지지 않고 Reject됩니다.

Push 요청이 Reject된 경우, 일반적인 경우라면 Pull을 통해 원격 저장소의 변경사항을 받아와서 자신의 작업 내용과 병합(Merge)하거나 Commit을 재정렬(Rebase)한 뒤 다시 Push를 시도해야 합니다.

하지만, 이미 Push한 자신의 Commit을 수정해야 하는 경우와 같이 특수한 경우에는 Forced Push를 사용할 수 있습니다. 이 경우, 로컬 저장소와 원격 저장소의 공통 조상 Commit 이후의 원격 저장소 Commit은 모두 삭제되로, 로컬 저장소의 Commit 내용으로 덮어 씌워지게 됩니다.

Forced Push를 하려면 다음과 같이 --force 옵션을 넣거나, +를 붙이면 됩니다.

git push --force origin HEAD:master
git push origin +HEAD:master

Forced Push는 일반적인 Push와 다르기 때문에, 사용하기 전에 세심한 주의를 기울여야 합니다. 원격 저장소에 있는 하나 이상의 Commit이 삭제되므로 이로 인해 동료 개발자에게 혼란을 불러일으킬 수 있습니다.

Forced Push를 하는 경우는 이미 Push한 자신의 Commit을 수정하기 위한 경우가 대부분입니다. 대개 Push한 직후 '아 맞다!'하고 떠오르는 내용을 수정하기 위한 경우입니다.ㅎㅎ

따라서 Push를 하기 전에 대상 Commit들을 다시 한 번 살펴보는 습관을 들여야 합니다. 불가피하게 Forced Push를 사용해야 할 경우, Project Manager 및 다른 팀원들에게 알린 뒤 해야 의도치 않은 불상사를 막을 수 있습니다.

 

TAG •