git은 중앙 저장소에 접근해야 작업을 할 수 있는 중앙 집중식 버전 관리와 다르게 개별적인 저장소에 복제되어 저장되고 개발자는 분산된 저장소에서 개별적인 작업을 할 수 있는 것이 특징이다.
원격 저장소에 저장된 작업물을 로컬 저장소로 복제하여 개별적인 작업을 할 수 있는 저장소를 의미한다.
분산된 각 저장소의 변경사항들이 반영된 공유 저장소로 원격 저장소의 작업물이 복제된 로컬 저장소에서 작업한 뒤 변경된 작업 사항을 원격 저장소에 반영(git push)하고 원격 저장소에서 새롭게 추가된 작업 사항을 로컬 저장소에 반영(git pull)하는 것을 통해 분산된 각 저장소와 원격 저장소의 작업 내역 간의 동기화가 이뤄진다.
git에서 관리하는 변경된 작업 단위로 각 커밋은 고유한 해쉬번호와 어떤 작업이 변경되었는지에 대한 설명을 가지고 있고 git에서 관리되는 작업들은 커밋 단위로 버전 관리할 수 있다. 사용자는 변경된 작업 단위를 나누기 위해 여러 커밋을 생성할 수 있다.
git의 버전 관리 단위인 커밋의 변경 사항으로 추가하기 위해서는 사용자는 변경된 파일들을 Staged 상태로 만들어야 한다. Staged 상태인 파일들은 커밋에 추가된 이후 변경사항 감지 대상이 되고 최신 커밋에서의 변화가 감지될 경우 Unmodified에서 Modified로 상태가 변경되면서 git status
를 통해 변경된 파일로 확인할 수 있다.
원격 저장소에 추가된 새로운 커밋을 로컬 저장소에 반영시키는 동작으로 git의 로컬 저장소로 설정을 한 후 원격 저장소의 작업물들을 clone 명령어를 통해 복제할 수 있다.
git init
git clone {repo url} {clone dir}
git pull {remote repo} {branch}
로컬 저장소에 추가된 새로운 커밋을 원격 저장소에 반영시키는 동작으로 add 명령어를 통해 커밋에 포함시킬 변경 사항들을 Staged 상태로 만든 후 commit 명령어를 실행하면 로컬 저장소에 새로운 커밋이 추가되고 이 변경사항을 원격 저장소에도 반영할 수 있도록 push 명령어를 실행한다.
git add remote {remote repo name} {repo url}
git add .
git commit -m “커밋을 설명하는 간략한 메세지”
git push {remote repo} {branch}
작업물의 가장 최신 커밋을 가리키는 HEAD가 과거의 커밋을 가리키게 하는 명령어로 작업 내역에 대한 특정 커밋으로의 복원을 동작하는 명령어이다. —soft 옵션을 사용할 경우 커밋은 삭제되지만 커밋의 포함된 변경 내역들이 스테이징에 남아있는 상태로 로컬 저장소에서는 변경된 작업 내역을 확인할 수 있지만 —hard 옵션을 사용하게 되면 커밋과 커밋의 포함된 변경 사항도 같이 삭제된다.
git reset --soft HEAD~1 // 최신 커밋의 이전 커밋으로 복원 (변경 사항들은 스테이징에 남김)
git reset --hard HEAD~2 // 최신 커밋의 이이전 커밋으로 복원 (변경 사항들 삭제)
스테이징에 올려진 작업 변경 사항을 다른 곳에 보관하는 명령어로 실행하게 되면 작업 내역이 HEAD가 가리키고 있는 가장 최신 커밋 사항으로 작업 내역이 복원되고 git stash apply 명령어를 사용하면 다시 작업 변경 사항을 로컬에 반영할 수 있다.
git stash // 스테이징에 올린 변경 사항 이동
git stash apply // 스테이징 변경 사항 반영
git stash clear // 저장된 stash 내역 삭제
main 브랜치에서 feature 브랜치를 만들어 개별 작업한 후 사용자는 feature 브랜치에서 생성한 새로운 커밋들을 main 브랜치에 반영하기 전 문제 없을지 확인 받은 후 반영하게 되는데 이 과정을 pull request라고 한다. 원격 main 브랜치의 추가된 최신 커밋들이 feature 브랜치에도 반영되어 있어야 충돌없이 main 브랜치에서 feature branch를 pull 할 수 있기 때문에 pull request를 요청하기 전 main 브랜치의 최신 작업 커밋이 반영하기 위한 선행 작업을 다음과 같이 진행해야 한다.
git checkout main // 로컬 main 브랜치로 이동
git pull origin main // 원격 main 브랜치를 로컬에도 반영
git checkout feature // 로컬 feature 브랜치로 이동
git pull main // 최신 커밋 상태 반영
git add .
git commit -m "merge"
git push origin feature