Git 교과서
독립 프로젝트에서 팀 프로젝트까지
버전 관리로 안전하게 개발한다!
왜 버전 관리 시스템인가?
버전 관리 시스템(VCS)은 파일의 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템이다. VCS를 사용하면 파일이나 프로젝트를 이전 상태로 되돌릴 수 있고, 시간에 따라 수정 내용을 비교해볼 수도 있다. 또한, 문제가 있을 때 누가 언제 만든 문제인지도 알 수 있다. 특히 파일을 분실하거나 잘못 수정했을 때 손쉽게 복구가 가능하다는 것이 가장 큰 장점이다. 대표적인 버전 관리 시스템인 깃을 사용해 손쉽게 버전을 관리해보자.
원리를 알고 더 효율적으로 사용하자
깃은 크게 워킹 디렉터리, 스테이지 영역, 저장소로 구분할 수 있다. 워킹 디렉터리는 ‘작업하는 공간’, 스테이지 영역은 ‘임시로 저장하는 공간’, 저장소는 ‘실제로 저장해 기록하는 공간’을 의미한다. 또한, tracked, stage, modified와 같은 상황별 파일의 상태도 잘 구분해야 한다. 이러한 개념들을 잘 표현한 140개 도해와 단계별 실습으로 깃 저장소의 동작 원리를 이해하고, 깃을 좀 더 효율적으로 사용할 수 있다.
깃, 깃허브, 소스트리로 직접 실행하며 이해하자
설치부터 커밋, 브랜치, 임시 처리, 병합, 복귀, 서브모듈, 태그까지 ‘퀵 가이드’로 동작 흐름을 미리 살펴본 후 이 흐름에 맞춰 모든 내용을 단계별로 실습해볼 수 있다. 깃 명령어와 소스트리, 깃허브를 사용해 직접 실습하면서 책에서 설명한 내용을 확실하게 이해해보자.
목차
- 1장 깃과 버전 관리
- 1.1 버전 관리
- 1.1.1 버전이란?
- 1.1.2 버전 관리는 왜 필요할까?
- 1.2 버전 관리 시스템
- 1.2.1 버전 관리 소프트웨어
- 1.3 깃
- 1.3.1 백업 기능
- 1.3.2 협업 개발
- 1.4 깃의 동작 한눈에 보기
- 1.5 정리
- 2장 깃과 소스트리 설치 및 환경 설정
- 2.1 깃 설치
- 2.1.1 윈도에서 설치
- 2.1.2 리눅스에서 설치
- 2.1.3 macOS에서 설치
- 2.2 소스트리 설치
- 2.2.1 설치 파일 내려받기
- 2.2.2 설치
- 2.3 첫 번째 깃 실행
- 2.3.1 터미널
- 2.3.2 깃 명령어로 실행
- 2.3.3 소스트리로 실행
- 2.4 환경 설정
- 2.4.1 config 명령어
- 2.4.2 로컬 사용자
- 2.4.3 글로벌 사용자(추천)
- 2.4.4 환경 설정 파일 확인 및 직접 수정
- 2.4.5 소스트리의 환경 설정
- 2.4.6 별칭
- 2.5 비주얼 스튜디오 코드
- 2.6 정리
- 3장 깃 개념 잡기
- 3.1 깃 저장소 생성
- 3.1.1 폴더와 깃 저장소
- 3.1.2 초기화
- 3.1.3 숨겨진 폴더 = .git 폴더
- 3.1.4 소스트리와 연결
- 3.2 워킹 디렉터리
- 3.2.1 워킹 디렉터리란?
- 3.2.2 파일의 untracked 상태와 tracked 상태
- 3.3 스테이지
- 3.3.1 스테이지 = 임시 영역
- 3.3.2 파일의 stage 상태와 unstage 상태
- 3.3.3 파일의 modified 상태와 unmodified 상태
- 3.4 파일의 상태 확인
- 3.4.1 status 명령어로 깃 상태 확인
- 3.4.2 소스트리에서 깃 상태 확인
- 3.5 파일 관리 목록에서 제외: .gitignore
- 3.5. 1 .gitignore 파일
- 3.5. 2 .gitignore 파일 표기법
- 3.6 깃 저장소 복제
- 3.6.1 공개 저장소
- 3.6.2 다운로드 vs 복제
- 3.6.3 복제 명령어
- 정리
- 4장 커밋
- 4.1 코드의 변화
- 4.1.1 파일 관리 방법
- 4.2 새 파일 생성 및 감지
- 4.2.1 새 파일 생성
- 4.2.2 깃에서 새 파일 생성 확인
- 4.2.3 소스트리에서 새 파일 감지
- 4.3 깃에 새 파일 등록
- 4.3.1 스테이지에 등록
- 4.3.2 파일의 추적 상태 확인
- 4.3.3 파일 등록 취소
- 4.4 첫 번째 커밋
- 4.4.1 HEAD
- 4.4.2 스냅샷
- 4.4.3 파일 상태와 커밋
- 4.5 커밋 확인
- 4.5.1 스테이지 초기화
- 4.5.2 로그 기록 확인
- 4.5.3 소스트리에서 로그 기록 확인
- 4.6 두 번째 커밋
- 4.6.1 파일 수정
- 4.6.2 파일 변경 사항 확인
- 4.6.3 수정된 파일 되돌리기
- 4.6.4 스테이지에 등록
- 4.6.5 두 번째 커밋
- 4.6.6 두 번째 커밋 확인
- 4.6.7 깃허브에서 확인
- 4.7 메시지가 없는 빈 커밋
- 4.7.1 세 번째 커밋
- 4.7.2 소스트리에서 빈 커밋
- 4.7.3 빈 커밋 확인
- 4.8 커밋 아이디
- 4.8.1 SHA1
- 4.8.2 단축키
- 4.9 커밋 로그
- 4.9.1 간략 로그
- 4.9.2 특정 파일의 로그
- 4.10 diff 명령어
- 4.10.1 파일 간 차이
- 4.10.2 워킹 디렉터리 vs 스테이지 영역
- 4.10.3 커밋 간 차이
- 4.10.4 소스트리에서 간단하게 변경 이력 확인
- 4.10.5 diff 내용을 추가하여 커밋
- 4.11 정리
- 5장 서버
- 5.1 서버 저장소
- 5.1.1 협업 저장소
- 5.1.2 연속된 작업
- 5.1.3 새 멤버
- 5.2 깃허브 서버 준비
- 5.2.1 깃허브
- 5.2.2 저장소 생성
- 5.3 깃허브 연동 및 원격 등록
- 5.3.1 로컬 저장소
- 5.3.2 프로토콜
- 5.3.3 원격 저장소의 리모트 목록 관리
- 5.3.4 주소와 별칭
- 5.3.5 원격 저장소에 연결
- 5.3.6 소스트리에서 원격 브랜치
- 5.3.7 별칭 이름 변경과 정보
- 5.3.8 원격 서버 삭제
- 5.4 서버 전송
- 5.4.1 push: 서버에 전송
- 5.5 자동으로 내려받기
- 5.5.1 clone: 복제
- 5.5.2 pull: 서버에서 내려받기
- 5.6 수동으로 내려받기
- 5.6.1 자동 병합
- 5.6.2 fetch: 가져오기
- 5.6.3 merge 명령어로 수동 병합
- 5.7 순서
- 5.7.1 최신 상태
- 5.7.2 충돌 방지
- 5.8 정리
- 6장 브랜치
- 6.1 새로운 작업
- 6.1.1 브랜치 작업
- 6.1.2 깃 브랜치 특징
- 6.2 실습 준비
- 6.2.1 저장소 생성 및 초기화
- 6.2.2 기본 브랜치
- 6.3 브랜치 생성
- 6.3.1 브랜치 생성
- 6.3.2 브랜치 이름
- 6.3.3 소스트리 브랜치
- 6.4 브랜치 확인
- 6.4.1 간단 브랜치 목록
- 6.4.2 브랜치 해시
- 6.4.3 브랜치 세부 사항 확인
- 6.5 브랜치 이동
- 6.5.1 체크아웃
- 6.5.2 브랜치 동작 원리
- 6.5.3 소스트리
- 6.5.4 이전 브랜치
- 6.5.5 워킹 디렉터리 정리
- 6.6 브랜치 공간
- 6.6.1 브랜치 로그
- 6.6.2 브랜치 소스 확인
- 6.7 HEAD 포인터
- 6.7.1 마지막 커밋
- 6.7.2 브랜치 HEAD
- 6.7.3 소스트리 HEAD
- 6.7.4 상대적 위치
- 6.7.5 AHEAD, BHEAD
- 6.8 생성과 이동
- 6.8.1 자동 이동 옵션
- 6.8.2 커밋 이동
- 6.8.3 HEAD를 활용한 이동
- 6.8.4 돌아오기
- 6.9 원격 브랜치
- 6.9.1 리모트 브랜치
- 6.9.2 실습 준비
- 6.9.3 브랜치 추적
- 6.9.4 브랜치 업로드
- 6.9.5 이름이 다른 브랜치
- 6.9.6 업스트림 트래킹
- 6.9.7 원격 브랜치 복사
- 6.9.8 업스트림 연결
- 6.10 브랜치 전송
- 6.10.1 브랜치 푸시
- 6.10.2 브랜치 페치
- 6.11 브랜치 삭제
- 6.11.1 일반적인 삭제 방법
- 6.11.2 강제로 삭제하는 방법
- 6.11.3 소스트리에서 삭제하는 방법
- 6.11.4 리모트 브랜치를 삭제하는 방법
- 6.12 정리
- 7장 임시 처리
- 7.1 스태시
- 7.1.1 기존 작업 도중에 새로운 변경 요청
- 7.1.2 새 코드 작성 중 기존 코드를 수정
- 7.1.3 스태시의 임시 스택 영역에 작업 중인 코드 저장
- 7.1.4 임시 저장 영역의 스택 목록
- 7.1.5 임시 저장한 스태시 불러오기
- 7.1.6 스태시 복원으로 충돌
- 7.1.7 스태시 복사
- 7.1.8 스태시 삭제
- 7.1.9 소스트리에서 스태시 사용
- 7.2 워킹 디렉터리 청소
- 7.3 정리
- 8장 병합과 충돌
- 8.1 병합
- 8.1.1 하나씩 직접 비교하는 수동 병합
- 8.1.2 깃으로 자동 병합
- 8.1.3 병합 방식
- 8.2 Fast-Forward 병합
- 8.2.1 브랜치 생성과 수정 작업
- 8.2.2 병합 위치
- 8.2.3 Fast-Forward 병합 적용
- 8.3 3-way 병합
- 8.3.1 브랜치 생성과 수정 작업
- 8.3.2 마스터 변경
- 8.3.3 공통 조상
- 8.3.4 병합 커밋
- 8.3.5 병합 메시지
- 8.4 브랜치 삭제
- 8.4.1 병합 후 삭제
- 8.5 충돌
- 8.5.1 충돌이 생기는 상황
- 8.5.2 실습을 위한 충돌 만들기
- 8.5.3 수동으로 충돌 해결
- 8.5.4 소스트리에서 충돌 해결
- 8.6 브랜치 병합 여부 확인
- 8.7 리베이스
- 8.7.1 베이스
- 8.7.2 베이스 변경
- 8.7.3 리베이스 vs 병합
- 8.7.4 리베이스 명령어
- 8.7.5 리베이스 병합
- 8.7.6 리베이스되었는지 확인
- 8.7.7 리베이스 후 브랜치
- 8.7.8 리베이스 충돌과 해결
- 8.7.9 rebase 명령어로 커밋 수정
- 8.7.10 리베이스할 때 주의할 점
- 8.8 정리
- 9장 복귀
- 9.1 되돌리기
- 9.1.1 다시 시작
- 9.2 리셋
- 9.2.1 복귀 시점
- 9.2.2 reset 명령어
- 9.2.3 soft 옵션
- 9.2.4 mixed 옵션
- 9.2.5 hard 옵션
- 9.2.6 소스트리
- 9.2.7 커밋 합치기
- 9.2.8 스테이지 리셋
- 9.2.9 작업 취소
- 9.2.10 병합 취소
- 9.2.11 주의할 점
- 9.3 리버트
- 9.3.1 취소 커밋
- 9.3.2 리버트 지정
- 9.3.3 소스트리에서 리버트
- 9.3.4 병합 취소
- 9.3.5 리버트 히스토리
- 9.4 정리
- 10장 배포 관리와 태그
- 10.1 배포
- 10.2 버전
- 10.3 태그
- 10.4 태그 목록
- 10.5 Annotated 태그
- 10.5.1 태그 생성
- 10.5.2 간단한 메시지
- 10.5.3 소스트리에서 태그 생성
- 10.5.4 태그는 중복해서 생성할 수 없다
- 10.5.5 태그 삭제
- 10.5.6 태그의 상세 정보 확인: show 명령어
- 10.6 Lightweight 태그
- 10.6.1 체크섬
- 10.6.2 태그의 상세 정보 확인
- 10.7 특정 커밋 태그
- 10.7.1 소스트리에서 특정 커밋 지정
- 10.8 태그를 사용한 체크아웃
- 10.8.1 태그 브랜치
- 10.9 태그 공유
- 10.9.1 원격 저장소 생성
- 10.9.2 태그 동기화
- 10.9.3 전체 태그 동기화
- 10.9.4 원격 저장소의 태그 수정과 삭제
- 10.9.5 원격 저장소에 로컬과 다른 이름으로 태그 전송
- 10.10 정리
- 11장 서브모듈
- 11.1 대형 프로젝트
- 11.1.1 저장 용량
- 11.1.2 저장소 분리
- 11.1.3 상하 관계
- 11.2 실습을 위한 저장소 준비
- 11.2.1 메인 저장소 생성
- 11.2.2 자식 저장소 생성
- 11.3 서브모듈 추가
- 11.3.1 저장소 연결
- 11.3.2 설정 파일
- 11.3.3 모듈 커밋
- 11.4 서브모듈 작업
- 11.4.1 모듈 저장소
- 11.4.2 모듈 상태
- 11.4.3 모듈 커밋
- 11.4.4 부모 커밋
- 11.5 자식 저장소 갱신
- 11.5.1 자식 저장소
- 11.5.2 자식 저장소 갱신
- 11.5.3 자식 저장소 작업
- 11.5.4 부모 저장소 적용
- 11.5.5 부모 저장소 갱신
- 11.6 부모 저장소 복제
- 11.6.1 부모 저장소 복제
- 11.6.2 모듈 업데이트
- 11.7 부모 저장소 업데이트
- 11.7.1 부모 업데이트
- 11.7.2 부모 저장소로 풀
- 11.8 정리
- 12장 고급 기능
- 12.1 refs
- 12.1.1 실습 환경 준비
- 12.1.2 해시
- 12.1.3 역조회
- 12.1.4 참조 목록
- 12.2 reflog
- 12.2.1 참조 기록
- 12.2.2 기록 확인
- 12.2.3 기간 확인
- 12.2.4 기록 유지
- 12.3 파일 애너테이션
- 12.3.1 blame
- 12.3.2 실습 환경 준비
- 12.3.3 blame 명령어
- 12.3.4 옵션 활용
- 12.4 replace
- 12.4.1 실습 환경 준비
- 12.4.2 저장소 분리
- 12.4.3 저장소 분리
- 12.4.4 저장소 연결
- 12.5 가비지 콜렉트
- 12.5.1 가비지
- 12.5.2 압축 관리
- 12.5.3 실행
- 12.5.4 refs 압축
- 12.5.5 환경 설정
- 12.6 prune
- 12.6.1 고립된 객체
- 12.6.2 실습 환경 준비
- 12.6.3 객체 삭제
- 12.6.4 객체 정리
- 12.6.5 원격 작업
- 12.7 rerere
- 12.7.1 동일한 충돌
- 12.7.2 활성화
- 12.7.3 실습 준비
- 12.7.4 충돌 및 기록
- 12.7.5 자동 해결
- 12.8 정리
- 자주 사용하는 명령어 모음