Git

kdew0308·2023년 1월 9일
0

1. 사용자 설정 및 세팅

1-1) Git 사용자 설정

정의

  • 로컬에서 사용할 Git 사용자 이메일과 이름을 설정
  • git config : Git에 관한 설정을 추가/변경/삭제하는 명령어
  • 설정 파일 ‒ System 설정 파일 / Global 설정 파일 / 로컬 설정 파일

    System 설정 파일 : 모든 시스템 사용자에게 적용 (git config --system)
    Global 설정 파일 : 한 사용자의 전치 Git Repository에 적용 (git config --global)
    Local 설정 파일 : 하나의 Repository에만 적용 (git config --local)

사용하기

  • Global Git 사용자 설정
    git config --global user.email “abc@abc.com”
    git config --global user.name “Hong Gil-dong”

  • 설정 확인
    git config --lis

1-2) ssh 등록

  1. git bash
    ssh-keygen ->ssh 이름 입력 -> 패스워드 입력 -> 패스워드 재입력
  2. ls로 입력한 이름 잘 등록되어있는지 확인
  3. cat 이름.pub 입력 후 ssh-rsa로 시작하는거 복사
  4. github로 돌아와서 setting -> SSH and GPG keys클릭 -> New SSH key 클릭 -> 복사한 ssh 붙여넣기

2. 깃 초기화 및 삭제

2-1) Git 초기화

정의

  • 폴더안에 들어가는 모든 파일(문서, 소스코드)을 git을 통해서 관리하겠다고 선언하는 것
  • 보통 코드를 폴더 안에서 파일을 하나하나 추가하면서 작업하는데 이것들을 모두 관리할 수 있도록 초기화 해주고, 초기화를 통해서 폴더 안에있는 모든 파일들을 git에 등록할 수 있도록 선언해주는 것
  • Local repository를 만드는 것

사용하기

git init
숨김 폴더로 .git 폴더 생성(설정 파일들, 소스코드에 대한 변경 사항들)

2-2) Git 삭제

정의

이 프로젝트에 대한 모든 이력, 사용한다는 선언도 삭제됨

사용하기

방법1) .git폴더 삭제

방법2) rm -rf.git

.gitignore

정의

  • 사용자가 git에 등록(커밋)되지 않길 원하는 파일 또는 폴더들의 목록을 저장
  • .gitignore 에 등록된 파일(폴더) 들은 커밋 시 자동으로 제외됨

사용하기

  • #은 주석의 역할

  • 폴더 : /폴더명 (예: /docs)

  • 파일 : 파일명.확장자 (예: test.txt)

  • 폴더 안 파일 : /폴더명/파일명.확장자 (예: /docs/test.txt)

  • 폴더 안 특정 확장자 파일 전부 (예: /docs/*.text)

  • 폴더 하위 모든 특정 확장자 파일 전부 (예: /docs/*/.txt)

  • gitignore 작성에 유용한 사이트 : https://www.toptal.com/developers/gitignore/

3. Git 기본 컨셉

3-1) 기본 동작 원리

Working Directory : 작업하는 파일이 있는 디렉토리

Staging Area

  • Git에 등록할 (커밋) 파일들이 올라가는 영역
  • Git에 등록하기 전에 변경사항이 있는 파일을 등록하는 공간
  • Git에 어떤걸 등록할지

Local Repository

  • 로컬 Git 프로젝트의 메타데이터와 데이터 정보가 저장되는 영역
  • 아직 컴퓨터 안에 저장되어있음
  • 로컬 저장소

Remote Repository

  • Github 등의 서비스를 통한 온라인 상의 저장소
  • 소스코드의 변경사항이나 설정, 삭제내역 등을 관리할 수 있음
  • 원격 저장소

3-2) 기본 용어

origin : 원격 (Github 등의 온라인 저장소)에 있는 코드
head : 내가 지금 작업하고 있는 로컬 브랜치
add

  • Working Directory에서 Staging Area로 등록
  • 내용을 수정하고 add를 하면 Staging Area로 등록됨

commit : Staging Area에 등록된 파일을 Local Storage로 등록
Commit Message : commit 시 함께 작성해 저장하는 메시지 (메모)
push : Local Storage에서 변경된 파일들을 Remote Repository로 등록
fetch : Remote Repository의 변경된 파일들을 Local Repository로 전달
merge : Local Repository의 변경사항을 Working Directory로 전달
Branch : 독립적으로 어떤 작업을 따로 진행하기위한 가지
checkout : 사용할 다른 브랜치를 지정

4. 저장소

4-1) Local Repository

저장소 (Repository)

  • 파일이나 폴더를 저장하는 곳
  • Git 저장소는 파일 변경 이력 별로 구분되어 저장
  • 변경된 부분들만 가지고있음

Local Repository

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

Local Repository 생성
1. 원하는 폴더 생성
2. 해당 폴더에서 git init 명령어 입력
3. .git 폴더 생성 확인
원격 저장소 (Remote Repository)에서 복사해 Local Repository(내PC로)를 생성할수도 있다

4-2) Remote Repository

  • 파일이 전용 서버(Github)에서 관리되며 여러 사람이 함께 공유

  • Remote Repository 생성 : Github를 통해 생성한다.

5. 사용하기

5-1) Clone

  • 로컬에서 작업하기 위해 Remote Repository를 복제해 내 PC에 Local Repository로 저장하는 것
  • 깃허브에 있는 원격 저장소를 복제해서 내 PC로 옮기는 것

5-2) 소스트리 이용해서 Clone

  1. Github 원격 저장소에서 SSH 주소 복사
  2. 복사한 SSH 주소 입력, 복사할 폴더 설정, 이름 설정
  3. Clone 완료!

소스트리에 깃허브 계정 연동 도중 오류 발생

찾아보니 2021년 8월부터는 Id/Password 방법이 아닌 token 을 이용하여 로그인을 하기 때문에 발생했던 문제

✏️삽질 1





계속 같은 오류 발생

5-3) Add, Commit, Push, Pull

📌Add

  1. 변경된 파일 중 Repository에 올릴 파일들을 등록한다.

  2. 아래에서 Add 할 파일을 선택해 Staging Area에 등록

  • 체크해서 올려주기만 하면 됨

📌Commit

  • Add로 등록된 파일들을 한 덩어리로 만들고 메시지 추가해 로컬저장소에 올림
  • 소스 자체를 올리는 것이 아니라 변경된 사항들을 한 덩어리로 만들어서 메모를 추가해서 올림

Staging Area에 등록된 파일을 확인하고, 메시지 작성 후 커밋

📌Push

  • Commit 되어 로컬 저장소에서 변경이 된 파일들을 원격 저장소로 전달한다
  • push를 함으로써 협업을 할 때 내가 작성한 소스들을 여러 사람이 볼 수 있게 됨

  • 로컬 저장소는 main 원격 저장소는 origin/main으로 head가 가있음

✏️히스토리와 Checkout

이전 시점으로 돌아가고싶으면

📌Pull

  • 원격 저장소의 변경사항을 로컬 저장소로 가져옴과 동시에 내 작업 소스에 합친다
  • 기본적으로 소스트리에서 Pull 하면 FetchMerge를 동시에 실행함

✏️Fetch와 Merge

  • Fetch : 원격 저장소의 소스를 로컬 저장소로 받아와 일치 시킨다. (내 작업 소스에는 반영 X)
  • Merge : Fetch해 온 로컬 저장소의 소스를 내 작업 소스에 합친다.
    (합칠 때 같은 부분의 소스가 다를 경우 충돌 발생!)

✏️Pull을 하는 상황은 언제 발생할까?

  • 원격 저장소는 여러 프로젝트 개발 인원들이 동시에 사용한다.
  • 다른 개발자가 변경상태를 Push해 원격 저장소에 반영한다면 내 입장에서는 원격 저장소에 변경사항이 발생한 것!

방법

다른 개발자가 Push해 원격 저장소가 변경되어 Pull 할 거리가 생기면 상단 풀 아이콘에 숫자가 생긴다!
히스토리에도 origin과 로컬 저장소의 현재 시점이 다르게 표시!

  • 로컬에서는 타이틀 또 바꿈! 까지 작업을 한 상태
  • 다른 개발자가 commit 하고 push해서 origin을 다른 시점으로 옮겨놨음
  • 그래서 이 부분을 pull해서 나의 시점을 일치시켜야됨

5-4) 소스트리 사용법

파일상태

  • 변경사항이 있으면 여기에 뜨게 됨
  • 빨간 형관펜 : 변경 전
  • 초록 형광펜 : 변경 후
  • add : 스테이지에 올리는 행위


  • 아직 로컬에만 반영이 되고 origin/main인 원격 저장소에는 반영이 안된 상태

  • push를 하게 되면 시점이 맞게 됨

다른 사람이 add->commit->push하면

내가 그 파일을 사용하려면 pull

5-5) Branch

정의

  • ʻ나무가지’를 의미
  • 기존에 만들어 놓은 버전(Main)에서 복사해 새로운 가지를 만들어 다른 방향으로 작업을 이어 나가는 것

Branch 생성


  • 마지막에 feature1에 체크아웃 하고 버그 수정하고 commit하고 push하게되면 3번째 그림처럼 가지가 튀어나옴

실습

  1. 내용 수정 -> 브랜치 생성 -> 수정한 파일 add-> commit

  2. push

  3. 브랜치 체크아웃을 변경하려면 원하는 브랜치 더블클릭 해주기

5-6) Merge

  • 결과물(브랜치들)을 모아서 합치는 것이 merge
  • 각각의 브랜치에서 작업이 완료된 후 통합 브랜치(Main)로 모아 합치는 작업


실습

  • new_feature브랜치를 main에 병합하고 싶으면 main으로 체크아웃 해놓고 new_feature 우클릭 후 병합 클릭
  • push 클릭하면 origin까지 병합이 됨

5-7) Conflict 해결

  • Branch를 Merge 할 때 발생할 수 있다.
  • 같은 파일 같은 부분을 수정한 브랜치들을 Merge할 때 발생!

만약 충돌이 발생하면


5-8) Fork 복제

다른사람의 원격 저장소에서 어떤 부분을 수정하거나 추가 기능을 넣고 싶을때 해당 원격 저장소를 내 원격 저장소에 그대로 복제하는 것, 전문용어로 포크뜬다라고 한다!

5-9) Pull Request

다른 사람에게 내 브랜치를 Merge 해 달라고 하는 요청

  • 사례 1 : 한 원격 저장소에서 내 브랜치를 Merge 하기전 피드백을 요청!
  • 사례 2 : Fork 뜬 저장소에서 원본 저장소에 개발 완료 후 원본 저장소에 Merge를 요청!

    어떤 부분을 어떻게 수정했는지,
    피드백 요청하는 부분은 정확히 어떤 파일의 어느 부분인지 기입한다.

사용하기

Feature1 브랜치에 푸시하게 되면 Github 페이지에 Compare & pull request 버튼 생김
또는 세번째 Pull Requests 탭 클릭해 생성

Fork 복제한 저장소에서 푸시하게 되면 Github 페이지에 Compare & pull request 버튼 생김,
또는 세번째 Pull Requests 탭 클릭해 생성

Pull request 한 저장소 & 브랜치 / Merge 대상 저장소 & 브랜치를 선택할 수 있다.

6. 다른 사용법

6-1) 터미널

git clone [원격 저장소 주소]
git status

  • 저장소의 상태를 보여준다
  • 소스코드가 변경되었다면 변경된 코드가 어떤것인지 Staging Area에 등록한 소스가 어떤것인지 보여줌

git add [파일경로]

  • Staging Area에 추가
  • git add ‒i : 추가되지 않은 파일들 모두 한번에 Staging Area에 추가

    git rm --cached [파일경로]
  • Staging Area에 add된 파일을 다시 Working Directory로 내린다
  • git rm ‒r --cached : Staging Area의 모든 파일을 Working Directory로 내린다

git commit ‒m"커밋 메시지"
git push
git log --decorate --graph : 소스트리에서 history로 보던 그래픽으로 보여주는 부분을 보여줌

0개의 댓글