※ 이 포스트는 생활코딩 운영자 이고잉 님의 'Do it! 지옥에서 온 문서 관리자 깃&깃허브 입문' 책을 읽으면서 중요한 내용을 정리해 둔 것입니다.
Git과 Github는 개인적으로 진행하는 프로젝트는 물론이고, 동료 개발자들과의 협업과 심지어는 오픈 소스 프로젝트까지 개발자로서 커리어를 이어 나가겠다고 결심한 사람들이면 기본 소양으로 알고 있어야 할 도구이다.
지금까지 컴퓨터학과 학생으로서 2년 동안 공부를 했지만, Git에 대해 알음알음 알기만 했지 제대로 공부해 본 적도 없고, 따라서 제대로 활용하지도 못 했다. 따라서 깃과 깃허브의 기능들을 완벽하게 숙지해 두기 위해, 'Do it! 지옥에서 온 문서 관리자 깃&깃허브 입문'이라는 책을 구매했다.
깃이 제공하는 핵심 기능은 크게 버전 관리(Version Control)
백업(Backup)
협업(Collaboration)
으로 나눌 수 있다 (책 설명). 이번 포스트에서는 책을 읽으면서 '버전 관리'와 '백업'에 대해 주요 내용(명령어 등)을 정리해 둔 내용을 다뤄 보고자 한다.
git init - 깃 초기화하기 (이제부터 해당 디렉터리에서 깃을 사용할 수 있습니다)
git status - 깃 상태를 확인
git add ?? - 수정한 상태를 스테이징하기 (?? : 파일명)
git commit -m "" - 깃에서 파일을 커밋 (즉, 버전을 만든다) ("" : 커밋 메시지)
git commit -am "" - 스테이징과 커밋 한꺼번에 처리하기
git log - 저장소에 저장된 버전 확인 (커밋 기록 자세히 살펴보기)
git diff - 방금 수정한 파일과 저장소에 있는 최신 버전의 내용 비교 (변경 사항 확인)
git log --stat - 커밋에 관련된 파일까지 함께 살펴보고 싶을 때
git commit --amend - 방금 커밋한 커밋 메시지 수정하기
git checkout -- ?? - 작업 트리에서 수정한 파일 되돌리기 (되돌린 내용은 다시 복구할 수 없다.)
git reset HEAD ?? - 파일을 스테이지에서 내리기 (최근 깃은 조금 다른 것 같다. 참고)
git reset HEAD^ - 가장 최근에 한 커밋 취소 (스테이지에서도 내려감, 작업 트리에만 남게 됨)
git reset 복사한 커밋 해시 - 최근 커밋을 복사한 커밋 해시로 리셋한다 (이후에 만들었던 커밋은 삭제)
git revert 복사한 R5 커밋 해시 - R5 버전을 지우는 대신, R5에서 변경했던 이력을 취소한 새 커밋을 만든다
git reset
명령의 옵션 살펴보기
- --soft HEAD^ : 최근 커밋을 하기 전 상태로 작업 트리를 되돌립니다.
- --mixed HEAD^ : 최근 커밋과 스테이징을 하기 전 상태로 작업 트리를 되돌립니다. 옵션 없이 git reset 옵션을 사용할 경우 이 옵션을 기본으로 작동합니다.
- --hard HEAD^ : 최근 커밋과 스테이징, 파일 수정을 하기 전 상태로 작업 트리를 되돌립니다. 이 옵션으로 되돌린 내용은 복구할 수 없습니다.
git branch - 브랜치를 만들거나 확인하는 명령
git branch apple - apple이라는 새로운 브랜치를 만든다
git log --oneline - 한 줄에 한 커밋씩 나타내 준다. (커밋을 간략히 확인할 때 편리하다)
git checkout apple - apple 브랜치로 이동 (이동하는 것을 '체크아웃한다' 라고 말함)
git add . - 현재 저장소에서 수정된 파일을 한꺼번에 스테이지에 올릴 수 있다.
git log --branches - 각 브랜치의 커밋을 함께 볼 수 있다.
git log --graph - 브랜치와 커밋의 관계를 좀 더 보기 쉽게 그래프 형태로 표시한다.
git log master..apple - master 브랜치에는 없고 apple 브랜치에는 있는 커밋
git log apple..master - apple 브랜치에는 없고 master 브랜치에는 있는 커밋
git init - 새로운 디렉터리를 만들고 저장소를 초기화하는 과정을 한꺼번에!
git merge o2 - master 브랜치에서 o2 브랜치를 가져와 병합한다. (:wq 눌러서 저장)
git merge o2 --no-edit - 브랜치를 병합할 때 편집기 창을 열지 않고 깃에서 지정하는 커밋 메시지를 그대로 사용하겠다면
git branch -d o2 - -d 옵션 : o2 브랜치를 삭제한다.
HEAD : 여러 브랜치 중에서 현재 작업 중인 브랜치를 가리킨다.
같은 문서의 다른 위치를 수정했을 때 병합하기 : 이상 없이 잘 된다.
같은 문서의 같은 위치를 수정했을 때 병합하기 : 에러가 뜬다. 고치고 싶은 대로 내용을 고치고 다시 스테이징 → 커밋 해 주면 된다.
삭제한 브랜치는 같은 이름으로 다시 브랜치를 만들면 예전에 작업했던 내용이 그대로 나타난다. 즉, 완전히 저장소에서 없애는 것이 아니라 깃의 흐름 속에서 감추는 것이라 생각하면 된다.
git checkout
명령을 사용하면 HEAD를 제어해서 브랜치를 이동할 수 있다.
git reset
명령을 사용하면 HEAD가 가리키고 있는 브랜치의 최신 커밋을 원하는 커밋으로 지정할 수 있다.
이때, 어떤 브랜치에 있는 커밋이든 지정할 수 있으며, 명령을 수행한 뒤 브랜치와 연결이 끊긴 커밋은 삭제된다.
git stash - 커밋하지 않은 수정 내용을 어딘가에 보관하려면
git stash list - 감춘 파일들의 목록을 확인한다. (자료구조 : 스택)
git stash pop - stash 목록에서 가장 최근 항목을 되돌린다.
git stash apply - stash 목록에서 가장 최근 항목을 되돌리지만 저장했던 내용은 그대로 남겨둔다.
git stash drop - stash 목록에서 가장 최근 항목을 삭제한다.
브랜치에서 파일을 수정하고 커밋하지 않은 상태에서 급하게 다른 파일을 커밋해야 할 경우!
계속 커밋하라는 메시지가 나타나기 때문에 번거롭기도 하고, 실수로 다른 파일들과 함께 커밋이 될 수도 있다. 이때 사용하면 Good.
git remote add origin 복사한 주소 붙여넣기
- 원격 저장소(remote)에 origin을 추가(add)하겠다
- 여기에서 origin은 깃허브 저장소 주소를 가리킨다.
- 이렇게 지역 저장소를 특정 원격 저장소에 연결하는 것은 한 번만 하면 된다.
git push -u origin master
- 지역 저장소의 브랜치를 origin, 즉 원격 저장소의 master 브랜치로 push하라는 명령
- -u 옵션은 지역 저장소의 브랜치를 원격 저장소의 master 브랜치에 연결하기 위한 것, 처음에 한 번만 사용하면 된다.
git push
- 다시 파일을 푸시할 때
- 앞서 지역 저장소의 브랜치와 origin의 master 브랜치를 연결했으므로, 다음 번에는 더 간단히 푸시할 수 있다.
git pull origin master
- origin(원격 저장소)의 내용을 master 브랜치로 가져온다
깃을 통한 협업 관련 내용도 호다닥 공부해서 프로젝트 진행 시에 원활한 협업이 가능하도록 하자.