Git

  • 형상 관리 시스템(Version Control System)
  • 분산 버전 관리 시스템(DVCS)
  • 여러 개발자가 하나의 소프트웨어 개발 프로젝트에 참여할 때, 소스 코드를 관리 도구로 사용
  • git process git process

origin

  • 로컬(local) 저장소와 연결되어 있는 원격(remote) 저장소의 이름(별칭: alias)
  • origin 외에 다른 이름으로 부여할 수 있다. (default 값으로 origin 부여)
  • origin이라는 이름의 원격 저장소 등록하기
    1. git remote add origin
    2. git clone (자동으로 origin이라는 이름의 원격 저장소가 등록)

master & main

  • 브랜치 중 가장 중심이 되는 기본적인 branch (default branch)
  • default branch 명을 master 에서 main 으로 변경할 수 있다.

branch

  • 협업 시 여러 개발자들이 동시에 다양한 작업을 할 수 있도록 만들어 주는 기능
  • 브랜치(branch)를 통해서 하나의 프로젝트를 여러 갈래로 나누어서 관리
  • 각각의 독립된 branch에서 작업 후 원래 버전과 비교하여 또 하나의 새로운 버전을 생성
  • HEAD 포인터는 현재 checkout된 branch를 가리킨다.
  • branch는 각 최신 commit의 해쉬 주소를 담고 있다.
  • 그러므로 git checkout 명령어를 통해서 HEAD 포인터를 옮겨 branch를 이동할 수 있고
  • 그 branch는 최신 commit에 대한 해쉬값을 가지고 있으므로 해당 branch의 괴거 commit들을 탐색할 수 있다.

ISSUE

  • 프로젝트의 기획, 추가 기능, 버그와 수정 사항 등
  • 모든 활동 내역에 대해서 이슈를 등록하고 등록한 이슈를 기반으로 작업을 진행할 수 있다.
  • 해결된 이슈는 Close issue 버튼을 눌러서 닫아주어야 한다.
  • 기능
    • Assigness : 해당 이슈의 담당자
    • Lebels : 해당 이슈의 성격
    • Milestone : 해당 이슈가 속한 파트, 유사한 이슈들을 모아 관리 할 수 있다.
    • Development : 해당 이슈와 연관된 Pull request 링크

conflict

  • 충돌이나는 상황
    1. branch1branch2브랜치를 나누어서 작업을 한다고 가정할 때 두 브랜치가 같은 라인 코드를 수정 후 커밋한다.
    2. 작업이 모두 끝나면 master에서 두 브랜치들을 merge 한다.
    3. master는 두 브랜치가 동일한 라인에 코드를 수정했으니 어떤 코드를 결정해줘야 할지 모르기 때문에 conflict가 발생한다.

명령어

git init

  • 새로운 로컬(local) 저장소를 생성(초기화)
  • .git 디렉토리가 생긴다.
  • git clone 명령어를 통해 원격(remote) 저장소로컬(local)에 복제해와서 사용하기 때문에 잘 사용하지 않음

git remote

  • 로컬 저장소에서 원격 저장소 등록 및 해제에 사용
  • git remote add **<원격 저장소="" 명=""> :** 원격 저장소(remote) 등록
    • 예) git remote add origin git@github.com:url.git
  • git remote remove **<원격 저장소="" 명=""> :** 원격 저장소(remote) 해제
    • 예) git remote remove origin
  • git remote -v : 원격 저장소 리스트 확인

git add

  • git add . : 작업 디렉토리 내의 모든 변경 내용을 스테이징 영역으로 이동
  • 작업 디렉토리 상의 변경 내용을 스테이징 영역(staging area)에 추가하기 위해 사용
  • 다음 변경(commit)을 기록할 때까지 변경 분을 모아 놓기 위해서 사용
  • 스테이징 영역(staging area)
    • 작업 디렉토리(working directory)git 저장소의 변경 이력 사이에 징검다리 역할

git status

  • 작업 디렉토리스테이징 영역(staging area)의 상태를 확인하기 위해 사용
  • 3개의 영역으로 구분
    • Changes to be committed : 스테이징 영역에 넘어가 있는 변경 내용
    • Changes not staged for commit : 아직 작업 디렉토리에 있는 변경 내용
    • Untracked files : 아직 작업 디렉토리에 있고, git 저장소에서 관리한 적이 없는 새로운 파일

git commit

  • 파일 및 폴더의 변경 사항(git add를 통해 staging area에 생긴 내용)을 저장소에 기록하는 것
  • git commit -m “commit message” : 커밋과 동시에 간단한 커밋 메시지를 작성
  • git commit –amend : 커밋의 내용을 덮어씀

git log

  • 커밋 변경 사항을 추적
  • git log –oneline –graph : 커밋 로그를 한 줄 그래프 형식으로 보여줌

git branch

  • branch를 관리할 때 사용
  • git branch : 로컬(local) 저장소에서 현재 위치한 브랜치 확인
  • git branch -r : 원격(remote) 저장소의 브랜치 확인
  • git branch -v : 브랜치의 마지막 커밋 메시지 확인
  • **git branch -d ** : 브랜치 삭제 (강제 삭제는 -D)
  • **git branch ** : 브랜치 생성

git checkout

  • branch를 이동할 때 사용
  • **git checkout ** : 해당 브랜치로 이동

git switch

  • git 2.23 version부터 git checkout을 대신하여 switch를 사용
  • **git switch ** : 해당 브랜치로 이동
  • **git switch -c ** : 브랜치를 만들고 해당 브랜치로 변경
  • **git switch -t origin/<원격브랜치명>** : 원격 브랜치와 같은 이름으로 로컬 브랜치를 생성 후 이동

git push

  • 로컬(local) 저장소에서 commit한 내용들을 원격(remote) 저장소로 이동
  • **git push -f **
    • git push -f origin [branch-name]
    • origin의 해당 branch로 강제 커밋(Force Push)
  • **git push -u **
    • git push -u origin master
    • 원격(remote) 저장소의 어느 브랜치에 커밋을 올릴 것인지 설정하고 반영
    • origin의 master 브랜치로 푸시를 진행
    • 원격 저장소에 master 브랜치가 없다면 자동 생성
    • 이후 푸시에서는 간단히 git push 명령어 만으로 반영 가능
    • 이후 간단히 git pull 명령어 만으로 origin 이라는 원격 저장소의 master 브랜치를 로컬 저장소의 master 브랜치로 merge 가능

git pull

  • 원격(remote) 저장소의 변경된 데이터를 가져올 때 사용(Update)
  • **git pull **
    • git pull origin master
    • 원격(remote) 저장소의 master 브랜치의 내용들을 가져옴

git reset

  • commit을 취소할 때 사용(이력을 남기지 않음)
  • reset 옵션
    • –soft : commit된 파일들을 staging area로 돌려놓음 (add 한 상태)
    • –mixed (default) : commit된 파일들을 working directory로 돌려놓음 (add 하기 전)
    • –hard : git add를 통해 추적되고 있는 tracked 파일들을 working directory에서 삭제함
      • Untracked 파일들은 삭제하지 않으며, 해당 옵션 사용 시 복구는 불가능
  • **git reset
    • 다음과 같이 1a → 2b → 3c 차례로 커밋을 하였고, 3c 커밋을 취소하고 싶다면?
    • git reset –hard 2b (HEAD가 이전 커밋(2b)를 가리키도록 한다)
  • **git reset
  • **git reset

    git process

git revert

  • commit 내용을 되돌릴 때 사용(이력을 유지함)
  • commit을 원격 저장소에 push 해버린 경우, 로컬 저장소에서 commit을 reset 해버리면 원격 저장소와 상태가 틀어져버린다.
  • 혼자의 경우 force push를 이용할 수 있지만, 협업의 경우 못하기 때문에 revert를 사용한다.
  • git revert [commit ID] : 해당 커밋을 되돌림
    • 다음과 같이 1a → 2b → 3c 차례로 커밋을 하였고, 3c 커밋을 없애고 2b 커밋으로 되돌리고 싶다면?
    • git revert 3c (3c 커밋을 되돌리는 revert commit이 추가로 생성된다) git process

git merge

  • 브랜치를 병합할 때 사용
  • **git merge ** : 해당 브랜치의 전체 이력을 현재 브랜치와 병합
  • **git merge –squash **
    • 해당 브랜치의 커밋을 하나로 압축하여 다른 브랜치의 최신 커밋 하나로 만드는 방법
    • 이것저것 실험해 봐야 하는 새로운 기능을 만들거나 버그를 수정할 때 유용
      1. 협업을 위해 master 브랜치에서 contact 브랜치를 분기
      2. contact 브랜치에서 작업을 끝낸 후 2개의 커밋이 발생
      3. master 브랜치로 이동 후 git merge –squash contact 사용
      4. 두 개의 커밋이 master 브랜치에 한 개의 커밋으로 밀어 넣어짐
      5. master 브랜치에 밀어 넣어진 내용은 스테이징되어 커밋할 준비(add 상태)가 된다.
      6. 그러므로 따로 master 브랜치에서 commit이 필요하다.

        git rebase

  • 브랜치를 병합할 때 사용 (베이스를 다시 설정하는 작업)
  • **git rebase ** : 해당 브랜치의 최신 변경 이력을 가져와 병합
  • 최신 변경 사항을 즉각 반영하기 쉽다.
  • commit 이력을 남기지 않으므로 commit History가 깔끔해진다.
  • git-flow를 사용할 때 Rebase and Merge 전략으로 깔끔한 History로 작업할 수 있습니다.
  • rebase 를 하는 상황
    1. dev branch 에서 feature branch 로 분기하여 작업 진행
    2. dev branch 에서 다른 개발자의 작업으로 인해서 새로운 commit 이 발생

      git process

    3. feature branch 에서 작업하고 있는 동안 dev 에 적용된 새로운 commit 들을 나의 feature branch 에 적용하고 싶을 때 $ git rebase dev 를 사용

      git process

  • 충돌(conflict) 발생 시 해결 방법
    • 충돌이 생기면, conflict 을 해결하거나 rebase 를 취소할 수 있도록 rebase 가 잠시 멈춘다.
    • git status 명령으로 충돌이 생긴 파일들의 목록을 보여준다.
    • rebase 취소 시 git rebase –abort 진행
    • conflict 수정 시 해당 파일 수정 후 git rebase –continue 진행
      • rebase 는 commit 을 하나 하나를 따로 merge 하기 때문에 이 과정을 반복할 수도 있다.

git cherry-pick

  • 해당 브랜치에서 하나의 커밋을 가져와서 현재 브랜치에 적용하는 방법
  • **git cherry-pick ** : 개별적인 커밋을 밀어 넣을 수 있음
    • 전체 합치기가 적합하지 않은 경우 사용
    • cherry-pick은 선택한 커밋의 변경 사항을 가지고 새로운 커밋을 생성
    • 선택하려는 커밋이 여러 개라면 커밋을 이어서 작성 (git cherry-pick 9941f44 480b6bb)
      1. cherry-pick을 사용할 commit이 있는 브랜치로 이동하여 커밋명 찾음
      2. master 브랜치로 이동한 후 cherry-pick 명령어 실행
      3. git cherry-pick 9941f44
      4. master 브랜치에 밀어 넣어진 커밋 내용은 스테이징되어 커밋할 준비(add 상태)가 된다.
      5. 그러므로 따로 master 브랜치에서 commit이 필요하다.

git clone

  • 원격(remote) 저장소의 파일들을 로컬(local) 저장소로 가져올 때 사용
  • **git clone **
    • git clone [원격 저장소 주소] [로컬 복제할 위치(생략하면 현재 위치)]
    • SSH 프로토콜을 통해 클론 시 SSH 키를 등록해야 한다.
    • SSH 키(공개 키, 개인 키) 등록 방법

    ## 명령어 취소

commit 취소

  • git reset –soft HEAD^
  • 수정한 내용은 그대로 두고 HEAD 를 한 단계 위로 조정하여 바로 이전 작업 취소

pull 취소

  • git reset –hard ORIG_HEAD

merge 취소

  • git reset –merge ORIG_HEAD
  • ORIG_HEAD는 이전 작업한 곳의 HEAD를 의미

add 취소

  • git reset HEAD