본문 바로가기

IT 기본/Git

Git 정리

Git 명령어

git status: git 워킹트리의 상태를 보여줌

git init: 로컬 레파지토리 생성

git add 파일: 커밋할 파일을 스테이지에 추가

git commit -m “메세지” : 커밋 메세지와 함께 커밋. 첫 커밋시에는 아래 계정정보 입력이 먼저 필요

  • git config --global user.email "you@example.com" :계정정보 입력
  • git config --global user.name "Your Name" :계정정보 입력

git log: 로그 보기

git log –oneline –graph –decorate -all: 모든 브랜치를 보기쉽게 보여줌

git checkout 체크썸7자리: 해당 체크썸으로 이동

git remote add 원격저장소명 git주소: git주소 원격저장소 등록. 원격저장소명은 일반적으로 origin 사용

git push: 현재 브랜치를 원격저장소의 브랜치에 반영

git push 원격저장소명 브랜치명: 원격저장소명의 브랜치에 반영

git clone git주소 . :git주소의 코드를 현재위치에 복사. 현재위치가 아닌 다른 위치에 저장할 경우 .에 해당 경로를 명시

git pull 원격저장소명 브랜치명: 원격저장소명의 브랜치 코드를 로컬저장소에 반영

  •  git fetch + get merge

git fetch [원격저장소별명] [브랜치이름]: 원격 저장소의 브랜치와 커밋을 로컬 저장소에 반영

git merge [브랜치이름]: 지정한 브랜치와 현재 브랜치를 합치기

 

Git 개념

git 파일의 상태

  • untracked : 추적 안됨. 한 번도 커밋되지 않은 파일
  • tracked
    • staged : untracked 파일을 add 명령어로 스테이지에 업로드한 상태
    • unmodified : 스테이지에 업로드 된 파일을 commit 명령어를 수행한 상태
    • modified : 한 번 이상 커밋한 파일에 수정이 발생한 상태

 

HEAD : 현재 브랜치 혹은 커밋을 가리키고 있는 포인터

 

병합(merge) 종류

  • merge commit: 다른 내용의 commit를 병합하여 새로운 커밋 생성
  • fast-forward:부모 commit을 기반으로 단순한 수정과 추가만 발생한 경우. 빨리 감기를 해서 해당 브랜치를 이동하기만 하면 됨
  • conflict: commit이 동일한 부분에 변경이 발생하여 브랜치를 머지할 때 충돌이 발생.
    • 해결방법
      • checkout으로 master가 아닌 A브랜치로 이동
      • master가 있는 commit을 선택 후 merge 선택(origin/master 가아닌 로컬 master)
      • 충돌 발생. 차이점을 확인 후 저장. 변경사항을 commit 하면 새로운 commit이 생성되면서 충돌 해결
      • push하여 origin/A에도 반영
      • A브랜치에서 충돌 해결을 확인하였으므로 master 브랜치로 checkout
      • A브랜치가 있는 commit으로 merge 시도
      • master 브랜치도 A브랜치가 있는 commit으로 병합 완료
      • push를 눌러 origin/master(원격저장소)에도 반영

fork: 다른 원격 저장소를 내계정으로 통째로 복제

 

풀 리퀘스트

  • 병합을 요청
  • github 페이지에서 Pull requests 페이지 > New Pull request > base와 compare 브랜치 설정
  • compare 브랜치를 master 로 병합 요청하는 것임
  • fork 한 원격저장소가 있다면 원본저장소로 풀 리퀘스트 요청할 수 있음.
  • fork한 레포지토리의 github 페이지에서 Pull requests 페이지 > New Pull request > base와 compare 브랜치 설정.  compare 브랜치를 master 로 병합 요청하는 것임

 

rebase

  • base를 다시 설정하는 것
  • base로 설정할 커밋을 선택하면 현재 head의 변경사항을 선택한 커밋의 다음으로 새로 연결 시켜줌. 다만 충돌이 있는 경우는 충돌을 해결해야함
  • 사용하는 경우는, 충돌 해결을 위해 merge를 하면 새로운 커밋이 새로 생겨남. 변경사항은 1개인데 충돌 해결을 위한 커밋이므로 불 필요한 커밋이라고 볼 수 있음. 이러한 현상이 싫다면 rebase를 써서 현재 head의 변경사항을 선택한 커밋 다음으로 연결하면 깔끔하게 merge 커밋 없이 연결이 됨
  • 단 rebase를 한 경우 충돌이 났을 때는 수동으로 충돌난 코드를 수정한 것이기 때문에 push할 때 force push로 원격저장소에 반영해야할 수 있음
  • 원격저장소에 푸시한 브랜치를 rebase하게 될 경우 다른 사용자가 해당 브랜치를 머지하면 히스토리가 꼬여서 복구하기가 어려움. 그렇기 때문에 원격 저장소에 푸시하지 않은 로컬의 브랜치들에만 사용을 권장

 

amend

  • 커밋 또는 푸시 내용을 수정. 추가적인 커밋을 만들지 않고 이전에 커밋한 내용을 수정할 수 있음
  • 커밋시 amend 옵션을 선택하면 마지막으로 커밋한 내용을 수정할 수 있음

 

cherry-pick

  • 다른 브랜치의 커밋 하나만 현재 브랜치에 반영
  • cherry-pick한 커밋은 다른 브랜치에서 선택한 커밋과 ID가 다름. 즉 다른 커밋
  • 반영하고 싶은 브랜치의 커밋을 선택 후 cherry-pick을 누르면, 현재 브랜치에 cherry-pick한 내용과 커밋 내용이 새롭게 추가

 

reset

  • 특정 커밋으로 현재 브랜치를 되돌리기
  • soft: 특정 커밋으로 되돌리고 되돌려진 변경사항들은 스테이지에 추가된 상태로 둔다
  • mixed: 특정 커밋으로 되돌리고 되돌려진 변경사항들은 스테이지에 추가되지 않은 상태로 둔다.
  • hard: 특정 커밋으로 되돌리고 되돌려진 변경사항들은 버린다.
  • hard reset 등을 한 경우에는 원격저장소에 반영하려면 로컬 저장소는 과거 상태이기 때문에 force push를 수행해야 원격저장소 반영이 가능

 

revert

  • 선택한 커밋의 변경사항을 되돌려서 새로운 커밋을 생성
  • 단, revert한 이력도 남음

 

stash: 커밋하지 않은 변경사항을 잠시 저장

 

Git 참고사항

Github 에서 새로운 repository 생성 방법

  1. Github에서 원격 저장소 만들고 내 로컬에 클론
  2. 내 로컬에서 로컬저장소를 먼저 만들고 Github에 원격저장소를 만들어 로컬저장소에 원격저장소 주소를 remote add