이 글을 작성한 이유

공부한 내용을 잊어버리지 않기 위해 작성한 내용입니다.

 

깃은 분산 버전 관리 시스템이다.

깃을 사용하는 이유는 안전성 + 협업 가능

로컬 저장소가 아닌 원격 저장소에 저장해서 안전성을 높이고,

원격 저장소를 다양한 사람과 이용하는 방식으로 협업을 가능하게 만든다.

그래서 협업의 기준 저장소는 항상 원격 저장소(보통 Github)이다.

깃 간단 개념 정리

HEAD : branch를 가리켜 간접적으로 커밋을 가리킨다.

branch : 하나의 코드 관리 흐름을 뜻한다. = 어떤 커밋을 가리키는 존재 = 포인터

브랜치의 이동은 working directory의 변경과 동일한 의미이다.

머지 커밋 : 헤드가 가리키던 커밋에 다른 브랜치가 가리키던 커밋을 합쳐서 새로운 커밋을 만드는 작업

Conflict 발생 시 원하는 merge 결과 모습대로 코드를 수정후 커밋하기

push와 pull의 작업 단위는 branch이다.

commit은 하나의 버전이다.

작업 영역

깃에는 3가지 작업 영역이 존재합니다.

  1. working directory(=working tree) : 내 컴퓨터 디렉터리(로컬 리포지토리)로 실제로 작업하는 공간
  2. staging area : 중간 저장 영역으로 git add를 한 파일이 존재하는 공간
  3. repository : GitHub 디렉토리로 git commit를 통해 생성된 버전을 git push를 통해 저장된 파일들이 존재하는 공간

순서는 다음과 같습니다.

  1. working directory에서 작업하고,
  2. add 명령어를 통해 staging area에 파일을 전송한 뒤,
  3. commit을 통해 변경 내용을 확정한 뒤,
  4. git push를 통해 repository에 저장한다.

+ working directory에서 열심히 수정해도 add를 사용하지 않으면 stagig area와 repository에 저장되지 않는다.

+ staging area의 역할은 repository 영역에 우리가 원하는 파일만 보내기 위함이다.

git 파일 상태

  1. Untracked : 새로 생성된 파일, 삭제된 파일, git add를 하지 않은 상태 / Git이 변경 사항을 추적할 수 없음
  2. Staged : git add를 한 상태
  3. Unmodified : 현재 파일이 최신 커밋과 동일한 상태
  4. Modified : 최신 커밋과 다른 내용이 있는 상태

알면 편한 리눅스 명령어

  • ls : 목록 보기
  • cat : 파일 내용 보기
  • cd : 디렉토리 이동
  • mkdir : 디렉토리 생성
  • rm : 파일 삭제
  • touch : 파일 생성
  • clear : 라인 정리(위에 보면 내용 그대로 존재)
    • vi 명령어(커밋 메시지 등을 작성할 때 사용)
      • i : 입력 상태로 전환
      • :w : 저장
      • :q : 종료
      • :wq : 저장 후 종료
      • :q! : 저장하지 않고 종료
      • esc : 입력 상태에서 명령 모드로 전환

깃 명령어 ( '( )' 표시는 생략 가능 )

git help [명령어] : git help만 작성하면 전체 명령어를 보여주고, [명령어]를 붙이면 설명 추가

깃 초기 설정 : 디렉토리 등록 + 유저 등록(커밋할 때 필요한 정보)

  • git init : 현재 디렉터리를 Git이 관리하는 working directory로 설정하고 그 안에. git을 만들어준다.
  • git config user.name '이름' : 내가 사용할 이름 추가
  • git config user.email '이메일' : 내가 사용할 이메일 추가
    • git config --global user.name '이름' : --global을 붙이면 Git 서버 전체의 설정 값을 설정한다.
    • git config (--global) --list : 현재 설정 내용을 확인할 수 있다.
  • git remote add origin [깃허브 주소] : 리모트 리포지토리 연결(깃허브에 새로운 리포지토리를 만들면 예시 존재)
  • git remote -v : 리모트 리포지토리 확인

git clone [깃허브 주소] : 깃허브 프로젝트를 그대로 복제할 때 사용

깃 작업하기

git add : 로컬 디렉토리에서 staging area로 파일을 올리는 명령어(커밋할 파일을 정하는 명령어)

  • git add [파일 이름] : 수정 사항이 있는 특정 파일을 staging area에 올린다.
  • git add [폴더 이름] : 수정 사항이 있는 특정 폴더 staging area에 올린다.
  • git add . : 수정 사항이 있는 모든 파일을 staging area에 올린다.

git reset : 해당하는 커밋으로 이동할 수 있는 명령어

  • 최신 버전으로도, 과거 버전으로도 갈 수 있다.(git reflog를 통해 확인 가능)
  • 최종 수정본을 과거 수정본으로 가지고 온 후 commit을 하면 reset과 최신 버전 사이의 commit history가 사라진다.
  • 즉, 커밋되지 않은 변경사항을 버리거나 커밋 자체를 없앨 수 있다.
  • git reset [옵션] [커밋 아이디] : 옵션에 따라 작업 영역이 달라진다. (working directory / staging area / repository)
    • [옵션] 
      • soft : repository만 변경됨(HEAD가 [커밋 아이디]를 가리킴
      • mixed(default값) : soft + staging area가 변경됨
      • hard : mixed + working directory가 변경됨(모두 바뀌기 때문에 조심히 사용해야 함)
    • [커밋 아이디] : 커밋 아이디는 전체를 작성할 필요 없이 보통은 앞자리 4개만 작성함
      • HEAD^ : HEAD^는 바로 이전 커밋이란 뜻으로 [커밋 아이디] 자리에 사용 가능함
      • HEAD~x : , x단계 전에 있던 커밋이라는 뜻
  • git reset [파일명] : 해당 파일 staging 취소

git status : commit을 하기 전 staging area를 확인하는 명령어(문제 발생 시 현 상태 확인용으로 사용)

  1. Changes to be committed : 커밋에 반영될 변경사항
  2. Changes not staged for commit : 커밋에 반영되지 않는 변경사항

git push : 로컬 리포지토리 버전을 리모트 리포지토리에 올리는 명령어(push를 하기 전 pull을 해야 함)

  • git push [옵션] [리모트명] [로컬명] : 현재 로컬에 있는 브랜치 내용을 [리모트]라는 리모트 리포지토리로 보내는 것
    • [옵션]
      • -u : --set -upstream이라는 옵션의 약자로 파일들을 tracking 하기 위해서 사용한다.
      • -f : 로컬 리포지토리의 내용으로 리모트 리포지토리의 내용을 덮어쓰는 명령어(개인 프로젝트용)
    • git push -u origin master로 로컬 리포지토리 내용을 처음으로 리모트 리포지토리에 올릴 때 사용
    • git push [리모트] [로컬]:[브랜치]: -u 옵션을 사용하지 않았을 때 대처 방법(가능하면 -u 사용)

git pull : 로컬 리포지토리를 리모트 리포지토리와 동일하게 만드는 명령어

  1. git pull은 git fetch + git merge를 동시에 하는 명령어라고 생각하면 편하다.
  2. git pull은 리모트 리포지토리의 브랜치를 검토할 필요 없이 바로 합칠 때 사용
  3. git fetch는 리모트 리포지토리의 브랜치의 내용을 살펴본 후 merge 할 때 사용(git pull을 바로 하기 의심스러울 때)
  4. git fetch를 한 후 git diff로 비교, 확인 작업을 진행한다.

git fetch : 로컬 리포지토리에서 현재 HEAD가 가리키는 브랜치의 upstream 브랜치로부터 최신 커밋들을 가져오는 명령어(리모트 브랜치만 가져오는 명령어)

git diff [A] [B] : A, B 간 비교

  • git diff [커밋 A 아이디] [커밋 B 아이디] : 두 커밋 간 비교
  • git diff [로컬] [리모트] : 브랜치 간 비교
  • 빨간색 글자 : 이전 커밋의 모습 / 초록색 글자 : 이후 커밋의 모습 

git merge [병합할 브랜치명]: 현재 브랜치에 다른 브랜치를 가져오는 명령어

  • git merge --abort : merge 하다가 conflict가 발생했을 때, merge 작업을 중단하고 이전 상태로 돌아가는 명령어

git rebase [브랜치명] : 커밋을 재배치한다. 즉, 베이스 커밋을 바꾸는 명령어

  • git rebase --continue : Conflict 발생해서 제대로 진행되지 못한 리베이스 계속 진행을 지시하는 명령어

git merge vs git rebase

  1. merge는 두 브랜치를 합쳤다는 정보를 커밋 히스토리에 남기기 위해
  2. rebase는 커밋 히스토리를 깔끔하게 만들기 위해

git log : 커밋 히스토리를 출력하는 명령어

  • [커밋 아이디] / 작성자 / 날짜 / 커밋 메시지 등의 정보를 알려준다.
  • git log --pretty=oneline : --pretty 옵션을 사용하면 다양한 방식으로 출력 가능(1줄로 보여주는 명령어)
  • git log --all --graph : 모든 브랜치의 커밋 히스토리를, 커밋 간의 관계가 잘 드러나도록 그래프 형식으로 출력
  • git reflog : HEAD가 그동안 가리켜왔던 커밋 기록 출력

git commit : Git에서 핵심적인 개념, staging area의 현 상태를 하나의 버전으로 남기는 작업 혹은 결과

  1. 커밋에 전달되는 정보 : 사용자 아이디, 날짜 + 시간, 커밋 메시지
  2. 주의사항 : 커밋된 코드는 항상 정상적으로 실행되어야 한다. 언제든지 해당 시점으로 돌아갈 수 있기 때문이다.
  3. Vi 에디터 사용 방식을 알면 편하다. / i는 입력 상태로 변경 / :wq는 저장
  4. commit을 한다고 해도 staging area에는 변화가 없다.
  • git commit : 커밋 메시지를 작성할 수 있는 창이 뜬다. 긴 커밋 메시지를 쉽게 남길 수 있다.
  • git commit -m "[커밋 메시지]" : 원하는 메시지 남기기
  • git commit --amend : 가장 최근의 커밋을 수정하는 명령어

git branch ( [옵션] ) ( [브랜치명] ) : branch 관련 명령어

  • git branch : 모든 브랜치를 검색
  • git branch [브랜치명] : 브랜치 생성
  • git branch -d [브랜치명] : 해당 브랜치 삭제

git checkout ( [옵션] ) [브랜치명, 커밋 아이디, 파일명]

  • git checkout [브랜치명] : 해당 브랜치로 이동
  • git checkout -b [브랜치명] : 해당 브랜치를 생성 후 이동
  • git checkout [커밋 아이디] : 해당 커밋으로 이동(특정 커밋에서 새로운 브랜치를 만들고 싶을 때 사용)
  • git checkout [파일명] : working directory에서 수정한 내용 취소하기(복구 불가)

git blame [파일명] : 어떤 파일의 작성자와 작업 내용을 확인하는 명령어

git show [커밋 아이디] : [커밋 아이디]를 통해서 해당 커밋 정보를 확인하는 명령어

git revert : 특정 커밋에서 이루어진 작업을 되돌리는 커밋을 새로 생성하는 명령어

  • git revert [커밋 아이디] : 해당 [커밋 아이디] 지점으로 되돌리기
  • git revert [커밋 아이디1..커밋아이디2] : [커밋 아이디 1] 다음부터 [커밋 아이디 2] 지점까지 되돌리기

git stash : 임시 저장 명령어

  1. 최근 커밋 이후로 working directory에서 작업한 모든 내용을 깃이 따로 보관한다.
  2. 해당 working directory는 최근 커밋 상태로 돌아간다.
  3. 잘못된 브랜치에서 작업했을 때 사용
  4. 해당 작업이 끝나지 않았지만 다른 작업을 해야 하는 상황에 사용
  • git stash list : stash 확인(1개도 없다면 아무것도 나오지 않음)
  • git stash apply stash@{번호} : stash 적용하기
  • git stash drop stash@{번호} : 해당 stash 삭제 
  • git stash pop stash@{번호} : 해당 stash를 삭제한 후 적용하기(더 이상 사용하지 않겠다는 의미)

git cherry-pick [커밋 아이디] : 자신이 원하는 작업이 들어있는 커밋들만 가져와서 추가하는 명령어

git tag [태그명] [커밋 아이디] : 커밋들에 의미를 부여할 수 있는 명령어

  • git tab -d [태그명] : 태그 삭제

git config alias.[별명] [명령어] : 길이가 긴 명령어를 원하는 이름으로 사용할 수 있게 해주는 명령어