[TIL] 23.03.29

Minkyu Shin·2023년 3월 29일
0

TIL

목록 보기
3/44
post-thumbnail

오늘의 나는 무엇을 잘했을까?

오늘 집중력을 잘 유지했던 것 같다. 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

  • 로컬 레포지토리의 변경 내용을 리모트 레포지토리에 반영하는 커맨드
  1. 로컬 레포지토리에서 commit
  2. 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가지 옵션에 따라 다음과 같은 동작을 수행한다
  1. --soft : 가장 최근의 git commit 명령만을 되돌린다, staging area와 working directory는 변하지 않는다
  2. --mixed : soft 옵션을 주었을 때의 동작을 모두 수행하고, staging area의 모습도 과거 커밋의 모습처럼 바꿈
  3. --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가 발생하기도 함
  • 이를 해결하기 위해서는
  1. 파일을 직접 수정하여 문제를 해결하거나
  2. 머지 작업을 취소 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 resetgit checkout 의 차이는?

git resetgit checkout
HEAD가 가리키던 브랜치가
다른 커밋을 가리키게 함
HEAD 자체가
다른 커밋이나 브랜치를 가리키게 함

오늘의 나는 어떤 어려움이 있었을까?

Git 강의의 내용이 생각보다 많았다. 강의 전체 수강을 하지 못했고 기타 세워 두었던 개인 공부도 하지 못했다. 내일 나머지 강의를 수강하고 조금 더 빠르게 진도를 나가 봐야겠다

내일의 나는 무엇을 해야할까?

  • 멘토링 참여!
  • Git 잔여 강의 수강
  • 프로그래밍 핵심 개념 in JS 잔여 강의 수강
  • CS 강의 수강
profile
개발자를 지망하는 경영학도

0개의 댓글