GIT 기본개념

성민개발로그·2022년 5월 29일
0
post-thumbnail

Repository:

  • Repository 는 Git이 파일들과 폴더들을 주시하는곳 입니다.
  • Git이 컴퓨터의 있는 directory 를 monitor 하고 있고 그것을 Github (Cloud)에 업로드하면 repository 에 저장됩니다.
  • 그러므로 사실상 Github - cloud 에 저장되 있는 repository 하고 내 컴퓨터에서 Git이 주시하고 있는 repository 두 군데가 있는 셈입니다.
  • Git이 우리 컴퓨터에 있는 파일들을 주시하는 방법은 directory 로 지정이 되었을때 .gitattributes 하고 .git 이라는 hidden file 들이 생성이 되는데 이 파일들의 기능을 통해 Git은 directory 에 있는 모든 파일 변화들을 track 할수 있습니다.
  • 정리하자면 Git은 파일들의 변화를 track 하기 위해서 존재합니다. 나중에 큰 코드나 앱 파일들이 업데이트 되었을때 앱의기능이 작동안하고 에러가 떳을때 어떠한 변화가 에러를 유발시켰는지 찾고 변화를 취소(retract) 할수 있기 때문에 많은 회사들이 Git 사용하고 있습니다.

Commit

  • Commit 은 변화의시점을 정하기 위해 사용됩니다.
  • 처음 commit 을 initial commit 이라고 부르기도 하는데 만약에 GitHub Desktop 을 사용할 경우 commit을 할 경우 Title과 Comment를 쓰는란과 Commit 버튼이 있기 때문에 쉽게 저장 할수 있습니다. 되도록이면 바뀐내용을 간추려서 Title과 Comment에 적는 습관을 들이는게 좋습니다.
  • 회사마다 다르지만 보통 10개 변화 또는 20개의 변화 마다 commit 을 해서 변화의 시점들을 저장합니다. 그래야 변화 이후에 에러가 날경우 변화 이전의 시점으로 되돌릴수 있습니다.

Git workflow(Git Area)

Git workflow(Git Area)는 기본적으로 3단계로 나눠져 있다.

  • Working Directory(Unstage Area) 우리가 현재 작업하고 있는 폴더로 생성, 수정, 삭제한 파일들이 있는 디렉토리
  • Staging Area Index라고도 부르며 , 변경사항이 있는 파일들을 선택해 커밋할 수 있도록 지정하는 곳 (버전을 만들기 위해 준비 중인 파일들의 스냅샷 데이터가 저장된 곳)
  • Git Directory(Local Repository) 파일들이 커밋된 곳으로, 파일들의 변경사항에 대한 스냅샷을 가지고 있는 곳 (Staging Area를 거쳐 만들어진 버전들이 저장된 곳)

명령어 모음

  1. git init : 저장소 만들기

  2. git status : 현재 상태 확인

  3. git add [-A] [<pathspec>…] 현재 상태 추적

    파일의 변경사항을 인덱스(staging area)에 추가합니다. Git은 커밋하기전, 인덱스에 먼저 커밋할 파일을 추가합니다.

  4. git commit [-m <msg>] : 현재 상태 저장

    인덱스에 추가된 변경 사항을 이력에 추가.

    깃 커밋 수정하고싶을땐 git commit --amend 사용하면된다.

  5. git log : 이력 확인

    다양한 오셥을 조합하여 원하는 형태의 로그를 풀력할 수 있는 강력한 기능.

  6. git reset[<commit>] [--soft | --mixed [-N] | --hard | --merge | --keep] : 이전 상태로(이력 제거)

    : 커밋기록 아이디 예: 27a00b7

    특정 커밋까지 이력을 초기화합니다. 바로 전, 또는 n번 전까지 작업했던 내용을 취소할 수 있습니다. 열심히 작업했는데, 전혀 엉뚱한 걸 했거나 작업한 내용이 필요 없어질 때 사용합니다. ⚠️ 이력이 지워지기 때문에 주의

    커밋 취소 앞에 한개할 경우: git reset HEAD~ 1

  7. git reflog

    git의 모든 브랜치에서 있었던 지금까지의 모든 기록을 볼 수 있다 각각 HEAD@{index} 형태로 index를 가지고 있으니, 잘못되기 전에 해당하는 index를 찾고 git reset HEAD@{index} 사용하여 돌아가기

    이 기능은 실수로 지운 파일을 되돌리거나, 뭔가 잘못 수정한 걸 되돌리거나, 실수로 머지한 걸 되돌리거나, 다 됐고 그냥 잘 작동했던 때로 돌아가고 싶을 때 사용하면 된다. 실제로 reflog 를 많이 사용한다고 들었다

  8. git revert <commit>… : 이전 상태로(이력 유지)

    특정 커밋을 취소하는 새로운 커밋을 만듭니다. 여기선 3번 커밋을 취소하는 새로운 커밋을 생성하여 마치 2번 커밋 상태로 돌아간 것 같지만 기존 이력을 유지하는 모습을 확인합니다.

    일반적으로 특정 버전을 배포했는데 문제가 생기면 문제가 생긴 커밋을 revert합니다. (빠른 조치/롤백) 다시 원복한 상태로 작업을 이어서 하고 해당 문제를 수정하면 다시 커밋하는 방식을 사용합니다.

  9. git branch 새로운 브랜치 이름 새로운 브랜치 생성

    • git branch : 브랜치 목록 확인
    • git branch -d 삭제할 브랜치
  10. git switch -c : 브랜치 생성 및 이동

    ‘-c’ 옵션은 브랜치 생성과 동시에 이동을 한번에 수행합니다.

  11. git merge 브랜치 이름 : 브랜치 병합

    예) dev브랜치를 main 브랜치로 병합하고 싶으면 main 브랜치 상태에서 git merge dev 해주자.

  12. git rebase <메인브랜치> <이동할 브랜치>

    merge와 rebase의 차이점:

    말 그대로 branch base를 이동시킨다는 뜻으로, 머지처럼 브랜치 통합을 목적으로 하지만, 특정 시점으로 브랜치가 가리키는 곳을 변경하는 기능을 합니다.

    그림에서 보이는 것과 같이 feature/login 브랜치에서 git rebase main feature/login 명령어를 입력하면 main의 가장 최신 커밋으로 브랜치가 가리키는 곳이 변경됩니다. (main의 다른 커밋에서 충돌이 없을 경우)

  13. conflict : 충돌 해결

    대부분 협업을 할때 서로 다른 작업을 하므로 보통 문제없이 자동으로 머지됩니다. 하지만, 같은 파일을 부득이 수정하는 경우가 생기고 필연적으로 충돌이 발생하는데, 강제로 상황을 만들고 충돌을 해결하는 방법을 알아보겠습니다.

    충돌은 정말 마주치고 싶지 않은 상황입니다. 하지만, 상황이 발생했으면 해결을 해야겠죠.

    충돌을 해결하고 커밋을 하거나, 머지 작업을 취소 git merge --abort 할 수 있습니다.

  14. git remote add <name> <url> :

    Git은 여러 개의 원격 저장소를 등록할 수 있고 기본 저장소의 이름이 origin 입니다. GitHub을 메인 원격 저장소(origin)로 사용하고 Google Cloud에 추가로 원격 저장소 설정을 한다면 google이라는 이름을 사용할 수 있습니다.

    git remote add origin <url>
    
    git remote add google <google reository url>
  15. git push [-u | --set-upstream] [<repository> [<refspec>…]] :원격 저장소 저장

    로컬 저장소를 GitHub에 푸시합니다. 로컬 저장소의 커밋 목록이 그대로 복제될 예정입니다.

  16. git clone <repository> [<directory>] : 원격 저장소 복제

    원격 저장소를 로컬로 가져오는 명령어

  17. git pull [<repository> [<refspec>…]] : 원격 저장소 내용 가져오기

    원격 저장소에 변경된 내용을 로컬 저장소로 가져옵니다. Git은 자동으로 원격 저장소와 로컬 저장소를 동기화하지 않습니다. 명시적으로 명령어를 입력해야 합니다.

    개인이 정한 커밋메세지 규칙

    커밋 유형 지정
    - FEAT : 새로운 기능의 추가
    - FIX: 버그 수정
    - DOCS: 문서 수정
    - STYLE: 스타일 관련 기능(코드 포맷팅, 세미콜론 누락, 코드 자체의 변경이 없는 경우)
    - REFACTOR: 코드 리펙토링
    - TEST: 테스트 코트, 리펙토링 테스트 코드 추가
    - CHORE: 빌드 업무 수정, 패키지 매니저 수정(ex .gitignore 수정 같은 경우)

0개의 댓글