오늘의 나는 무엇을 잘했을까?
오늘 집중력을 잘 유지했던 것 같다. Git 강의가 많았음에도 불구하고 최대한 많은 분량을 소화할 수 있었다.
오늘의 나는 무엇을 배웠을까?
Git
1. Git이란?
1-1. 버전 관리
- 파일의 변화를 시간에 따라 기록
- 이후 특정 시점의 버전을 다시 꺼내올 수 있는 시스템
- 장점
1. 지난 과정 확인이 가능
2. 문제가 생기면 이전 버전으로 되돌리기 가능
1-2. 협업 기능
- 여러 개발자가 동시 작업한 코드 합칠 수 있음
1-3. Github
2. Git 기초
2-1. 레포지토리 (repository)
- 저장소
- 커밋이 저장되는 장소
- .git 디렉토리
git init
커맨드로 생성
2-2. 커밋 (commit)
- 프로젝트 디렉토리의 모습을 하나의 버전으로 남기는 동작
- 그 동작에 따른 결과물
- 첫 커밋 시에
git config user.name [이름]
git config user.email [이메일]
커맨드로 커밋한 사람 정보 등록
git add [파일명](변경 사항이 있는 모든 파일 선택 시에는 '.')
커맨드로 커밋에 반영될 파일 지정
git commit -m(커밋 메시지 옵션)
커맨드로 커밋
2-3. Git의 3가지 작업 영역
(source : Codeit Git 강의자료)
1. working directory
- 작업을 하는 프로젝트 디렉토리
2. staging area
- git add를 한 파일이 존재하는 영역
- 커밋 시 해당 영역에 존재하는 파일들만 반영
3. repository
- working directory의 변경 이력들이 저장되어 있는 영역
-즉, 커밋들이 저장되는 영역
위 사진을 보면 알 수 있듯이, git add를 통해 staging area에 올린 파일만이 수정 사항이 커밋에 반영될 수 있음
따라서 수정 사항을 선별적으로 커밋하고 싶을 때 staging area가 큰 도움이 됨
2-4. Git에서 나타나는 파일의 상태들
- Untracked : Git이 파일의 변동사항을 전혀 추적하고 있지 않는 상태
- Staged : 파일 내용이 수정된 후, staging area에 올라와 있는 상태
- Unmodified : 파일의 현재 상태가 최신 커밋과 비교했을 떄 수정된 것이 없는 상태
- Modified : 최신 커밋과 비교했을 때 파일에 조금이라도 바뀐 내용이 있는 상태
2-5. git command 모음
git status
: git이 인식하고 있는 프로젝트 디렉토리의 현재 상태를 보여줌
git reset [파일명]
: git add로 staging area에 올린 파일을 staging area에서 제거
git add
시에 특정파일만 임시로 제외하고 싶을 때는?
git help [커맨드명]
: git 커맨드 메뉴얼 보기
특정파일 임시로 커밋내역에서 제외하기
2-6. 커맨드에 alias 설정하기
git config alias.[alias명] '[줄이고 싶은 커맨드]'
- 짧고 간단한 커맨드를 사용할 수 있게 된다
3. Github 사용하기
3-1. 로컬 레포지토리 Github와 연결하기
git remote add [내가 정할 리모트 레포지토리 이름, 보통 origin] [리모트 레포지토리 주소]
git push -u origin main
연결 방법
[참고] 기본 branch명 master가 main으로 변경되었음
3-2. git push
- 로컬 레포지토리의 변경 내용을 리모트 레포지토리에 반영하는 커맨드
- 로컬 레포지토리에서 commit
git push
로 리모트 레포지토리에 변경사항 반영시키기
3-3. git pull
- 리모트 레포지토리의 변경 내용을 로컬 레포지토리에 반영하는 커맨드
git pull
커맨드 사용
- 현재 위치한 브랜치의 업스트림 브랜치에서 최신 커밋들을 가져와서 merge
3-4. git clone
- Github 프로젝트의 레포지토리를 로컬에 그대로 복제
git clone [주소]
4. Commit
4-1. git log
- 커밋 히스토리 보기
- 가장 최근 커밋이 위에, 오래된 커밋이 아래에
git log [--pretty=oneline (히스토리를 한 줄로만 출력하는 옵션)]
4-2. git show
- 커밋의 구체적인 내용을 보고 싶을 때
git show [커밋 아이디 앞 4자리 정도...]
4-3. 최신 commit 수정하기
- 최신 커밋을 수정하고 싶을 때는,
git commit --amend
커맨드를 사용
- 완전히 새로운 커밋 생성
4-4. 두 커밋 간 차이 보기
- 서로 다른 두 커밋 간 어떤 차이가 있는지 보고 싶을 떄
git diff [이전 커밋 아이디] [이후 커밋 아이디]
4-5. HEAD
- 현재 브랜치의 마지막 커밋을 가리키는 포인터
- HEAD는 커밋을 직접 가리키지 않음
- 이 HEAD가 가리키는 커밋에 따라 working directory가 구성됨
4-6. git reset
git reset [옵션] [이동할 커밋 아이디 or HEAD~num]
커맨드는 HEAD는 동일한 브랜치를 가리키고, 브랜치를 이동시켜 가리키는 커밋을 바꾼 후 (HEAD가 브랜치를 가리키기 떄문에 HEAD가 가리키는 커밋도 변경)
- 다음 3가지 옵션에 따라 다음과 같은 동작을 수행한다
--soft
: 가장 최근의 git commit
명령만을 되돌린다, staging area와 working directory는 변하지 않는다
--mixed
: soft 옵션을 주었을 때의 동작을 모두 수행하고, staging area의 모습도 과거 커밋의 모습처럼 바꿈
--hard
: mixed 옵션을 주었을 때의 동작을 모두 수행하고, working directory의 모습도 과거 커밋의 모습처럼 바꿈
git reset
을 한다고 해도 그 이후의 커밋이 삭제되는 것은 아니며
git reset
을 현재 HEAD가 가리키는 커밋 이후의 커밋으로 할 수도 있음
4-7. commit을 하고 나면 staging area의 모습은?
- 초기화 되는 것이 아님
git add
를 할 떄마다 새로운 파일이 추가 되거나 새로운 버전의 것으로 교체될 뿐
4-8. git tag
- 중요한 커밋에 메시지에 추가하여 다는 태그
- e.g. 주요 버전의 시작점이 되는 커밋
git tag [태그명] [커밋 아이디]
git show [태그명]
으로 태그와 연결된 커밋 확인 가능
-d [지울 태그명]
옵션으로 삭제 가능
5. Branch
5-1. 브랜치
- 하나의 코드 관리 흐름
- git은 root commit을 시작으로 가지가 갈라지는 나무 모양
- 갈라진 코드 흐름을 branch 라고 한다
- 서로 다른 branch의 작업 내용은 서로 영향을 주지 않음
5-2. 생성 방법 및 관련 command
git branch [새로 만들 브랜치명]
: 브랜치 생성
git checkout -b [새로 만들 브랜치명]
git switch -c [새로 만들 브랜치명]
: 브랜치 생성 후 해당 브랜치로 이동
git checkout [브랜치명]
git switch [브랜치명]
: HEAD가 가리키는 브랜치를 변경
git branch -d [삭제할 브랜치명]
: 브랜치 삭제
git branch
: 현재 레포지토리의 모든 브랜치 출력
5-3. 브랜치 merge
- HEAD가 가리키던 커밋에 다른 브랜치가 가리키던 커밋을 병합하여 새로운 커밋을 만드는 작업
git merge [브랜치명]
커맨드 사용
- 다른 브랜치에서 했던 커밋이 복사됨
- 소스 충돌 상황이 일어나면 conflict가 발생하기도 함
- 이를 해결하기 위해서는
- 파일을 직접 수정하여 문제를 해결하거나
- 머지 작업을 취소
git merge --abort
하고 작업을 다시 한 후 커밋 -> 머지
5-4. Detached HEAD
git checkout [커밋 아이디]
를 하면...
- HEAD가 브랜치를 통하여 커밋을 가리키는게 아닌, 직접 커밋을 가리키게 된다
- Detached HEAD를 사용하는 주된 이유는 특정 커밋에서 새로운 브랜치를 만들 때
- 가령,
[source : Codeit 강의자료]
위와 같은 상황에서 git checkout 9033
을 해서 HEAD를 이동시키면,
HEAD가 직접적으로 9033.. 커밋을 가리키게 된다. Detached HEAD 상태가 되는 것이다. 이 때,
git branch premium
을 하여
새로운 브랜치 premium을 생성하면 HEAD와 premium 브랜치가 동일한 커밋을 가리키게 되고,
git checkout premium
을 통해
HEAD가 premium 브랜치를 가리키게 만들면 Detached HEAD에서 벗어나 정상적인 상태로 돌아온다.
위 상태에서 새로운 커밋을 하게 되면
위와 같이 master 브랜치와 별개의 새로운 코드 관리 흐름을 가진다
5-5. 그래서,,, git reset
과 git checkout
의 차이는?
git reset | git checkout |
---|
HEAD가 가리키던 브랜치가 다른 커밋을 가리키게 함 | HEAD 자체가 다른 커밋이나 브랜치를 가리키게 함 |
오늘의 나는 어떤 어려움이 있었을까?
Git 강의의 내용이 생각보다 많았다. 강의 전체 수강을 하지 못했고 기타 세워 두었던 개인 공부도 하지 못했다. 내일 나머지 강의를 수강하고 조금 더 빠르게 진도를 나가 봐야겠다
내일의 나는 무엇을 해야할까?
- 멘토링 참여!
- Git 잔여 강의 수강
- 프로그래밍 핵심 개념 in JS 잔여 강의 수강
- CS 강의 수강