Git | Git 기본내용 / 명령어 정리

Namgung Jong Min·2022년 9월 12일
0

Git

목록 보기
1/1

Git 정리

Git의 필요성

파일을 편집 전 상태로 되돌리는 방법은 무엇이 있을까?

=> 편집하기 전 파일을 미리 복사해 두는 것
파일을 편집할 때마다 매번 복사하여 관리하는 것은 번거롭고 실수의 가능성이 높음.

단순 파일 관리 과정의 부작용들을 최소화하고 쉽게 관리하기위해 Git이 필요.


Git이란

소스코드를 효과적으로 관리하기 위해 개발된 '분산형 버전 관리 시스템'

  • 소스 코드가 변경된 이력을 쉽게 확인 가능
  • 특정 시점에 저장된 버전과 비교 가능
  • 특정 시점으로 되돌아가기 가능
  • 내 푸시 파일이 누군가의 편집 내용과 충돌한다면 경고메시지 발생 => 내용 덮어버리는 실수를 방지

Repository

파일이나 폴더를 저장해 두는 곳.

  • 파일이 변경 이력 별로 구분되어 저장됨

$ Remote Repository(원격 저장소)

  • 원격 저장소 전용 서버에서 관리
  • 여러 사람이 함께 공유하기 위한 저장소

관련 명령어

  • git remote -v
    • 현재 git에 등록된 원격 저장소 리스트를 보여줌
  • git remote remove origin
    • 원격 저장소를 git의 설정에서 삭제
  • git remote add [이름][URL]
    • 해당 URL으로 원격 저장소를 등록

$ Local Repository(로컬 저장소)

  • 내 PC에 파일이 저장되는 개인 전용 저장소

  • 저장소를 만드는 방법

  1. 저장소 자체를 새로 만들기
  2. 이미 만들어져 있는 원격 저장소를 로컬 저장소로 복사해 오기

$ Work tree(작업 트리)와 Index(인덱스)

  • 작업트리 = 작업하는 폴더
  • 인덱스 = 커밋 전 저장소와 작업 트리 사이의 공간

커밋은 변경 내용을 저장소에 바로 기록하는 것이 아님
=> 인덱스에 파일 상태를 기록(stage)하고 원하는 상태들의 파일들을 선별하여 커밋


Branch

협업으로 개발 시 동일한 소스코드를 함께 공유하고 수정/작성하게 됨. 이 때 생기는 각각의 서로 다른 버전의 코드를 원할하게 관리하기 위해 사용.

  • 각자 독립적인 repository를 생성하고 작업한 뒤 하나의 repository에 새로운 버전을 만들어낼 수 있음.

$ 브랜치의 종류

  1. 통합 브랜치
  • 언제든지 배포할 수 있는 버전을 만들 수 있어야하는 브랜치
  1. 토픽 브랜치
  • 기능 추가나 버그 수정과 같은 단위 작업을 위한 브랜치

$ 명령어

  • git branch [브랜치명]
    • 브랜치 생성
  • git branch
    • 브랜치 조회
  • git checkout [브랜치명]
    • 브랜치명으로 체크아웃(이동)
  • git checkout -b [브랜치명]
    • 브랜치를 만들고 바로 이동
  • git branch -d [브랜치명]
    • 브랜치 삭제

Commit

  • 파일 및 폴더의 추가/변경 사항을 저장소에 기록하는 것

  • 각 커밋에는 영문/숫자로 이루어진 고유 이름이 붙음

  • 이 고유 이름으로 각 커밋을 구분하고 선택

$ 커밋 & 상태확인 명령어

  • git status
    • 깃의 상태를 확인
  • git add [파일명.확장자명]
    • 지정한 파일을 index에 올림 (/ git add . 시 변경된 모든 이력을 index로)
  • git commit -m "[TEXT]"
    • TEXT를 메시지로 붙여 커밋
  • git commit -a -m "[TEXT]"
    • TEXT를 메시지로 붙여 커밋과 스테이징을 동시에
  • git log (--online)
    커밋 내용 확인 (한줄로 표기)
  • git show [커밋 id]
    • 선택한 id의 내역 확인
  • git diff [이전 커밋 id][이후 커밋 id]
    • 선택한 두 작업 폴더의 파일간의 차이를 출력

$ 커밋 내용 이동

  • git checkout [이동할 branch 이름]
    • 브랜치 이동은 현재 작업 디렉토리의 소스 코드 상태를 해당 branch의 상태로 전부 바꾸는 것
    • commit 하지 않은 작업 내용이 있으면 checkout 불가
    • 이동할 브랜치 이름 대신 'commit id'를 입력하면 해당 commit이 작성된 직후의 소스 코드 상태로 이동

$ 커밋 변경

  • git reset HEAD^
    • 현재 HEAD의 이전 커밋으로 되돌리기 (/git reset HEAD~n 현재로부터 n번째 이전 커밋으로 되돌리기)
  • git reset [commit id]
    • 지정한 커밋 시점으로 이동하고 커밋을 취소
  • reset Option
    1. git reset --soft [commit id]
      • head만 바뀜
    2. git reset --mixed [commit id]
      • staging도 그 시점으로 바뀜
    3. git reset --hard [commit id]
      • working디렉토리 & staging 모두 그 시점으로 바뀜
    • origin에 올린 상태에서의 reset
      • 로컬은 origin에있는 commit을 삭제한 채로 origin에 덮으려고하니 에러가뜸
      • --force옵션을 주어 강제로 로컬 commit history를 origin에 덮어쒸움. (해당 repository를 다른 사람과 공유하고 있다면 절대 하면 안됨)
  • git commit --amend [커밋 메시지]
    • 가장 최근 커밋을 수정
    • 최근 커밋을 변경하는 것이 아니라 완전히 대체함

Push

  • 원격 저장소를 이용하여 로컬 저장소의 변경 이력을 공유하는 방법
  • 웹 상의 원격 저장소로 변경된 파일을 업로드하는 것
    • push시 원격 저장소에 내 변경 이력이 업로드되어 원격 저장소와 로컬 저장소가 동일한 상태가 됨

$ 명령어

  • git push origin [master or branch명]

Clone

  • 원격 저장소의 내용을 통째로 다운로드하여 다른 PC에서 로컬 저장소로 사용할 수 있게 하는 것

$ clone 하기

  1. git repository 주소 확인
    -HTTPS형식 / SSH형식
  2. git clone [URL]

Pull / Fetch

  • 원격 저장소를 공유해 여러 사람이 협업할 경우, 같은 원격 저장소에 push를 하게된다. 이 때 다른 사람의 push 변경 내용 가져와 내 로컬 저장소에서 작업할 수 있음

$ pull

원격 저장소의 내용을 가져와 자동으로 병합 작업 실행.

  • git pull
    • 다른 사람이 업데이트 한 파일을 가져와 원격 저장소와 로컬저장소의 상태를 동일하게 만듬

$ fetch

병합 없이 원격 저장소의 최신 이력만을 확인. 이 때 가져온 커밋 이력은 이름 없는 브랜치로 로컬에 가져오게 됨

  • 'FETCH_HEAD'의 이름으로 체크아웃 가능
  • fetch + merge = pull

Merge

  • 다른 브랜치를 현재 checkout된 브랜치에 병합하는 명령 => merge하고 현재 브랜치가 merge된 결과를 가리키도록 옮김

  • 명령어

    • git merge [브랜치명]
  • 본인이 pull 한 파일을 작업 할 때, 다른 사람이 push를 해버려 원격 저장소를 업데이트 할 경우 push 요청이 거부된다.
    => merge(병합)하여 다른 사람의 업테이트 이력을 내 저장소에도 갱신해야함.


충돌 해결하기

  • 충돌 : merge를 통해 git에서 변경된 부분을 자동으로 통합할 수 있는데 안되는 경우
    • 원격 저장소와 로컬 저장소에서 동일한 부분을 변경 했을 때
    • 두 변경 내용 중 어떤 것을 저장할지 판단이 불가능

  • 충돌 부분 수정 후 다시 커밋

ETC 명령어

$ 디렉토리

  • cd ~
    • 홈 디렉토리로 이동
  • mkdir [디렉토리명]
    • 새 디렉토리에 디렉토리명을 생성
  • cd [디렉토리명]
    • 디렉토리로 이동
  • cd ..
    • 부모 디렉토리로 이동
  • pwd
    • 현재 경로 출력
  • ls (-l / -a)
    • 디렉토리 내용을 출력 (-l : 상세 정보까지 출력 / -a : 숨김파일과 디렉토리까지 출력)
  • rm -r [디렉토리명]
    • 파일이 있는 디렉토리를 내용물과 함께 삭제
  • vim [파일명.확장자]
    • 파일 생성
profile
토끼굴을 정복하는 개발자

0개의 댓글