Git이란?

@JHSHIN·2022년 8월 7일

이번 포스트에서는 git에 대해서 공부한 내용을 정리해보려고 한다.

Git

  • Git이란 코드 버전 관리 프로그램을 말한다.
  • 버전 관리는 파일의 변화를 시간에 따라 기록해두고, 나중에 특정 시점의 버전을 꺼내올 수 있는 시스템
    • 버전 관리의 장점
      1. 지난 과정을 확인할 수 있다.
      2. 이전 버전으로 돌아갈 수 있다.
  • 여러 개발자가 협업할 수 있게 도와주는 기능도 있다.
  • 즉, Git은 버전 관리와 동시 협업을 가능하게 해주는 툴이라고 할 수 있다.

Git vs Github

  • 버전을 관리하는 프로그램이 Git, Git으로 관리하는 프로그램을 올려둘 수 있는 사이트가 Github
  • Github를 통해 작업물을 다른 컴퓨터에 저장할 수 있다. Github는 원격 저장소를 대신 제공해준다.

Git 핵심 개념

  1. 레포지토리
    • 프로젝트와 관련된 파일 정보를 기록하는 곳
    • .git 디렉토리 그 자체가 레포지토리.
  2. 커밋
    • 커밋을 하면 커밋하는 당시의 프로젝트 디렉토리의 모습이 사진처럼 레포지토리에 저장됨
    • 이때의 결과물 자체를 커밋이라고 함.
    • 프로젝트 디렉토리의 특정 모습을 하나의 버전으로 남기는 행위도 커밋이라고 함.
  3. Working directory, Staging area, Repositroy
    1. Working directory : 사용자가 작업을 하고 있는 프로젝트의 디렉토리
    2. Staging area : git add를 한 파일들이 존재하는 영역. 커밋을 하면 staging area
      에 있는 파일들만 커밋에 반영됨.
    3. Repositroy : working directory의 커밋들이 저장되는 영역.
      • working directory에서 뭔가 작업을 하고,
      • 작업한 파일들을 git add 해주고,
      • 커밋을 하면 staging area에 있던 파일들의 모습이 마치 영화의 한 장면, 스냅샷(snapshot)처럼 이 repository에 저장된다.

Git 명령어

  1. git init : 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(=working directory)로 설정하고 그 안에 레포지토리(.git 디렉토리) 생성
  2. git config user.name 'name' : 현재 사용자의 아이디를 'name'으로 설정(커밋할 때 필요한 정보)
  3. git config user.email 'aaa@bb.com' : 현재 사용자의 이메일 주소를 'aaa@bb.com'로 설정(커밋할 때 필요한 정보)
  4. git add [파일 이름] : 수정사항이 있는 특정 파일을 staging area에 올리기
    1. git add [디렉토리명] : 해당 디렉토리 내에서 수정사항이 있는 모든 파일들을 staging area에 올리기
    2. git add . : working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올리기
  5. git reset [파일 이름] : staging area에 올렸던 파일 다시 내리기
    1. --soft [커밋 아이디]

      (1) HEAD가 특정 커밋을 가리키도록 함

      (2) staging area는 건드리지 않고 이전 상태 그대로 둠

      (3) working directory는 건드리지 않고 git reset 하기 이전 상태 그대로 둠

    2. --mixed [커밋 아이디]

      (1) HEAD가 특정 커밋을 가리키도록 함

      (2) staging area를 특정 커밋의 모습처럼 리셋함

      (3) working directory는 건드리지 않고 git reset 하기 이전 상태 그대로 둠

    3. --hard [커밋 아이디]

      (1) HEAD가 특정 커밋을 가리키도록 함

      (2) staging area도 특정 커밋의 모습처럼 리셋함

      (3) working directory도 특정 커밋의 모습처럼 리셋함

  6. git status : Git이 현재 인식하고 있는 프로젝트 관련 내용들 출력(문제 상황이 발생했을 때 현재 상태를 파악하기 위해 활용하면 좋음)
  7. git commit -m "커밋 메시지" : 현재 staging area에 있는 것들 커밋으로 남기기
    1. git commit : 커밋 메세지를 길게 입력할 수 있음
    2. git commit --amend : 최근의 커밋을 수정하고 커밋
  8. git help [커맨드 이름] : 사용법이 궁금한 Git 커맨드의 공식 메뉴얼 내용 출력
  9. git push -u origin master : 로컬 레포지토리의 내용을 처음으로 리모트 레포지토리에 올릴 때 사용
    • git push : 로컬 레포지토리의 내용을 리모트 레포지토리에 보내기
  10. git pull : 리모트 레포지토리의 내용을 로컬 레포지토리로 가져오기
  11. git fetch : 로컬 레포지토리에서 현재 HEAD가 가리키는 브랜치의 업스트림(upstream) 브랜치로부터 최신 커밋들을 가져옴(가져오기만 한다는 점에서, 가져와서 머지까지 하는 git pull과는 차이가 있음)
  12. git clone [프로젝트의 GitHub 상 주소] : GitHub에 있는 프로젝트를 내 컴퓨터로 가져오기
  13. git show [커밋 아이디] : 특정 커밋에서 어떤 변경사항이 있었는지를 볼 수 있다.
  14. git log --pretty=oneline : 커밋 히스토리를 볼 때 커밋 하나당 한 줄씩 출력
    • git log : 커밋 히스토리를 보는 명령어
  15. git config alias.history 'log --pretty=oneline' : git history를 입력하면 git log --pretty=oneline이 입력되도록 설정
  16. git diff [커밋 A의 아이디][커밋 B의 아이디] : 커밋 A와 커밋 B의 차이를 비교
  17. git tag [태그 이름][커밋 아이디] : 커밋 아이디에 태그를 붙임
  18. git branch [새 브랜치 이름] : 새로운 브랜치를 생성
    • git branch -d [기존 브랜치 이름] : 브랜치 삭제
  19. git checkout [기존 브랜치 이름] : 입력한 브랜치로 이동
    • git checkout -b [새 브랜치 이름] : 새로운 브랜치를 생성하고 그 브랜치로 바로 이동
  20. git merge [기존 브랜치 이름] : 현재 브랜치에 다른 브랜치를 머지. 머지한다는 것은 A 브랜치의 내용과 B 브랜치의 내용을 합쳐 새로운 커밋을 만드는 것과 같다.
    • git merge --abort : 머지를 하다가 conflict가 발생했을 때, 일단은 머지 작업을 취소하고 이전 상태로 돌아감
  21. git blame : 특정 파일의 내용 한줄한줄이 어떤 커밋에 의해 생긴 것인지 출력
  22. git revert : 특정 커밋에서 이루어진 작업을 되돌리는(취소하는) 커밋을 새로 생성
  23. git reflog : HEAD가 그동안 가리켜왔던 커밋들의 기록을 출력
  24. git log --all --graph : 모든 브랜치의 커밋 히스토리를, 커밋 간의 관계가 잘 드러나도록 그래프 형식으로 출력
  25. git rebase [브랜치 이름] : A, B 브랜치가 있는 상태에서 지금 HEAD가 A 브랜치를 가리킬 때, git rebase B를 실행하면 A, B 브랜치가 분기하는 시작점이 된 공통 커밋 이후로부터 존재하는 A 브랜치 상의 커밋들이 그대로 B 브랜치의 최신 커밋 이후로 이어붙여짐(git merge와 같은 효과를 가지지만 커밋 히스토리가 한 줄로 깔끔하게 된다는 차이점이 있음)
  26. git stash : 현재 작업 내용을 스택 영역에 저장
  27. git stash apply [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용
  28. git stash drop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 스택에서 삭제
  29. git stash pop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용하면서 스택에서 삭제
  30. git cherry-pick [커밋 아이디] : 특정 커밋의 내용을 현재 커밋에 반영

Git reset vs Git checkout

일반적으로 HEAD는 브랜치를 가리키고, 브랜치는 커밋을 가리킨다.

  • git reset
  1. HEAD가 가리키던 브랜치가 다른 커밋을 가리키도록 한다.
  2. HEAD도 결국 간접적으로 다른 커밋을 가리키게되는 효과가 생긴다.
  • git checkout
  1. HEAD 자체가 다른 커밋이나 브랜치를 가리키도록 한다.
  2. 브랜치를 통하지 않고, 커밋을 직접적으로 가리키는 HEAD를 Detached HEAD라고 한다.
profile
We Need Better UX

0개의 댓글