Git & Github 특강 준비

nothingisme·2023년 8월 20일

아는 게 없지만, 교육부장이라서 동아리 깃 특강을 진행하기로 했다. 어쩔 수 없지만 기왕 맡은 거 제대로 공부부터 시작해보자^^

인프런에서 찾은 짧고 재밌어 보이는 강의를 듣고, 특강 준비의 틀을 잡아보자! 강의에서는 GUI인 깃크라켄을 사용했는데, CLI에서는 어떻게 동작하는지 혹은 더 알아야 할 내용들 위주로 찾아서 정리해보자

왜 꼭 git이어야 하는가?

  • 버전 관리

  • 다른 사람들과의 협업


기본명령어 commit, push, pull

fork

  • 다른 사람의 레포에서 내가 어떤 부분을 수정하거나 추가 기능을 넣고 싶을 때 해당 레포를 내 레포로 그대로 복제하는 기능.

  • fork한 저장소는 원본과 연결되어 있다.
    : 원본에 변화가 생기면(새로운 commit) 그대로 forked된 레포로 반영 가능

clone

$ git clone

Clone 명령어를 통해(아래의 명령어를 포함한 작업이 수행된다.)
1. 디렉토리를만들고
2. 디렉토리로 들어가고 나서 git init 명령으로 빈 Git 저장소를 만든다.
3. 입력한 URL을 origin이라는(기본값) 이름의 리모트로 추가하고( git remote add)
4. git fetch 명령으로 리모트 저장소에서 데이터를 가져온다.

commit

$ git commit -m [commit message]
  • 변경 사항의 저장
  • CLI 명령어에서 -m 옵션으로 커밋 메세지를 꼭 함께 작성해줘야 한다

push

$ git push
  • 현재 커밋된 변경 사항을 원격 저장소로 보낸다.

pull

$ git pull
  • 원격 저장소에서 변경된 내용을 현재 로컬 저장소로 가져온다.

+ add

$ git add [filename or directory name]
  • 원하는 기능만 add해서 그것들만 따로 commit을 할 수 있다.
  • add를 하여 commit 단계 이전의 공간을 stage area라고 한다.

+ fetch

$ git fetch [원격저장소 이름] // 원격저장소에 변동사항만을 가져온다
  • pull과 fetch와의 차이는, Merge와 달리 Fetch는 자동으로 병합을 해주지 않는다는 점이다.
  • 원격 저장소의 커밋들을 로컬 저장소로 가져온다는 점은 pull과 동일하다. 하지만 이후에 자동으로 병합(Merge)를 해주지 않기 때문에 본인이 직접 확인을 한 후에 병합(Merge)하는 과정을 거쳐야한다.

브랜치와 머지

branch

$ git branch // 현재 존재하는 branch들의 리스트들을 확인
$ git branch [branch name] // 새로운 branch를 생성
$ git checkout [branch name] // 다른 branch로 이동
$ git branch -D [branch name] // branch를 삭제
  • 여러 사람이 협업할 때, 충돌(conflict)을 방지하기 위해서, 가지(branch)를 나눠서 작업한다.

+git branch -v 옵션을 주면 등록된 branch의 상세정보까지 보여준다.
+git checkout -b [branch 이름] 은 새 branch를 생성하고 바로 그 branch로 이동

merge

$ git merge [branch name] // ‘현재'브랜치에서 [브랜치 명]의 변경사항을 병합
  • 서로 다른 브랜치에서 작업을 했거나, 작업 내용을 합쳐야 할 때 사용
  • CLI 명령어의 경우 현재 브랜치가 기준이므로, 이를 반드시 확인!
$ git branch --merged // merge된 branch만 필터링
$ git branch --no-merged // merge되지 않은 branch만 필터링


브랜치 전략 (git-flow)

  • 소도구 수업에 나왔었던 그림!

    master : 라이브 서버에 제품으로 출시되는 브랜치.
    develop : 다음 출시 버전을 대비하여 개발하는 브랜치.
    feature : 추가 기능 개발 브랜치. develop 브랜치에 들어간다.
    release : 다음 버전 출시를 준비하는 브랜치. develop 브랜치를 release 브랜치로 옮긴 후 QA, 테스트를 진행하고 master 브랜치로 합친다.
    hotfix : master 브랜치에서 발생한 버그를 수정하는 브랜치.


임시저장을 위한 stash

  • commit 하기에는 덜 했는데, 다른 일을 하러 가야 해서 저장은 해야 할 때 사용
    ( 다른 브랜치로 이동(checkout)하기 위해서는 반드시 commit을 해야 한다. )
$ git stash // 변경 내용을 임시 저장
$ git stash list // stash 했던 내용 보기 (stash name 확인 가능)
  • apply와 pop을 사용해서 임시 저장된 내용을 가져올 수 있는데, pop의 경우에는 저장된 내용을 불러오면서 임시 저장된 파일을 삭제한다는 차이가 있다.
  • 충돌(conflict)이 일어날 경우를 대비하면, 임시 저장공간을 그대로 둔 채로 변경사항을 가져오는 apply가 좋다.
$ git stash apply // 가장 최근 stash 가져오기
$ git stash apply [stash name] // 특정 stash 가져오기
$ git stash pop // 임시 저장공간에 저장된 파일들을 현재 브랜치에 가져온다. 
$ git stash drop // 가장 최근 stash 지우기
$ git stash drop [stash name] // 특정 stash 지우기
$ git stash clear // 모든 stash 삭제


내가 필요한 커밋만 cherryPick

$ git cherry-pick [commit hash]
  • 다른 브랜치에 있는 커밋을 선택하여 현재 브랜치에 적용시킬 때 사용하는 명령어

  • rebase와 비슷하지만, cherrypick의 경우에는 같은 내용을 갖고 있는 커밋이 여러개 생기기 때문에, 누가 누구를 cherry-picking했는지 모르는 상황이 생길 수도 있다는 문제가 있다.

  • 여러 개의 커밋을 가져올 수도 있다.

    • 여러 개의 커밋 해시값을 나열한다.
      $ git cherry-pick commit2a commit2b
    • 가져오고 싶은 커밋 범위의 첫 번째와 마지막 커밋 해시 값을 .. 로 이어준다.
      $ git cherry-pick commit2a..commit2c // 첫번째를 제외하고 끝까지 포함된다.

  • 옵션
    • --abort : 취소. 이전으로 돌아간다.
    • --quit : 종료.
    • --continue : 재개
    • -m [parent number] : merge commit의 부모를 특정짓는다
    • -n [commit id] : 해당 커밋 아이디를 반영해서 add는 하는데 commit은 안함
    • -e : commit하기 전에 커밋 메세지 수정
profile
가볍게 재밌던 거 기록해요

0개의 댓글