본문 바로가기

git

[git] git 기본 개념

Git

Git은 VCS 프로그램들 중 하나이다.

  • VCS : Version Control System(버전 관리 시스템)

버전을 관리하는 것이란

  1. 프로젝트의 시간과 차원을 관리하는 것회사에서 앱을 만드는데 만들고 있는 앱에 새로운 기능을 시도해보고 싶은 경우. 내 멋대로 작업을 해볼 수는 없다.
  2. 메인 프로젝트를 복사에서 버전별로 저장하거나 새 기능을 추가해볼 수 있지만 시간과 용량이 굉장히 많이 든다. Git은 이런 일들을 굉장히 쉽게 해줌!
  3. 프로젝트는 새 기능을 추가한다던가 오류를 수정하면서 계속해서 새 버전이 나온다. 그런데 이것을 계속 진행하다보면 했던 작업을 취소해야하는 일이 생긴다. 또는 이전 버전 하나에만 오류가 생기는 경우도 있다.
  • 시간 - 프로젝트의 버전을 과거로 되돌리거나 특정 내역을 취소할 수 있다.
  • 차원 - 프로젝트의 여러 모드를 쉽게 전환하고 관리할 수 있다.
  1. 여러 사람들이 프로젝트에서 협업할 수 있게 해준다.

Git 설치

Git과 Git Bash 설치 후 버전을 확인한다.

git --version

 참고 : Git Bash는 리눅스/유닉스에서 사용되는 CLI 명령어를 사용하기 때문에 윈도우에서 리눅스 명령어를 쓰고 싶을 때 활용하면 좋다.

git config --global core.autocrlf true

🔼 협업시 윈도우와 맥에서 엔터 방식 차이로 인한 오류 방지

Git을 GUI로 사용할 수 있게 해주는 프로그램 Sourcetree도 설치한다.

GUI 프로그램은 무료로는 Sourcetree, 유료로는 GitKraken이 많이 쓰인다.

VSCode에서 Git Bash 사용하는 법

  • VSCode에서 ctrl + Shift + P
  • Select Default Profile 검색하여 선택

CLI vs GUI

  • CLI : Command Line Interface. 명령줄로 사용하는 것
  • GUI : Graphicla User Interface. 일반인들이 쓰기 편하도록 버튼이나 툴바를 사용하는 것.

Git 설정 & 프로젝트 관리 시작하기

1. Git 최초 설정

Git 전역으로 사용자 이름과 이메일 주소를 설정

  • GitHub 계정과는 별개 (깃으로 협업할 때 누가 작성했는지 알아보기 위함)
  • 프로젝트마다 다르게 설정도 가능
git config --global user.name "(본인 이름)"
git config --global user.email "(본인 이메일)"

아래 명령어들로 확인

git config --global user.name
git config --global user.email

기본 브랜치명 변경

깃은 기본 브랜치가 master로 되어있음. master-slave를 연상시켜서 다른걸로 대체시키는 분위기. main을 권장.

git config --global init.defaultBranch main

2. 프로젝트 생성 & Git 관리 시작

해당 폴더에서(VS Code 터미널 기본) 아래 명령어 입력

git init

현재 폴더 상황을 깃의 관점에서 보여주는 명령어 입력

git status

Git에게 맡기지 않을 것들

포함할 필요가 없을 때

  • 자동으로 생성 또는 다운로드 되는 파일들(빌드 결과물, 라이브러리) b. 포함하지 말아야 할 때
  • 보안상 민감한 정보를 담은 파일

.gitignore 파일을 사용해서 배제 요소들을 지정할 수 있다.

.gitignore파일에 포함하지 않을 파일을 적고, git status로 확인 해보면 포함이 되지 않는 것을 확인할 수 있다.

gitignore 형식

https://git-scm.com/docs/gitignore 참조

# 이렇게 #를 사용해서 주석

# 모든 file.c
file.c

# 최상위 폴더의 file.c
/file.c

# 모든 .c 확장자 파일
*.c

# .c 확장자지만 무시하지 않을 파일
!not_ignore_this.c

# logs란 이름의 파일 또는 폴더와 그 내용들
logs

# logs란 이름의 폴더와 그 내용들
logs/

# logs 폴더 바로 안의 debug.log와 .c 파일들
logs/debug.log
logs/*.c

# logs 폴더 바로 안, 또는 그 안의 다른 폴더(들) 안의 debug.log
logs/**/debug.log

프로젝트의 변경사함을 버전에 담기

변경사항 확인

git status
  • No commits yet : 아무것도 커밋되지 않은 상태. Commit은 버전이라고 생각하면 됨.
  • Untacked files : 아직 Git이 관리한적이 없는 파일들

파일 하나 담기

git add tigers.yaml
  • Changes to be committed : 커밋할 준비가 됐다. 버전 히스토리로 묻을 준비가 됐다.

모든 파일 담기

git add .

2. Commit 하기

commit 한다. = 새로운 버전으로 만든다.

아래 명령어로 commit

git commit
  • VI 입력 모드로 진입
    • 입력 시작 : i
    • 입력 종료 : ESC
    • 저장 없이 종료 : :q
    • 저장하고 종료 : wq
  • Commit 내용 입력한 뒤 저장하고 종료

커밋 메시지까지 함께 작성하기

git commit -m "FIRST COMMIT"

아래 명령어로 확인

git log

변경사항 만든 후 commit후, 자세한 변경사항 확인

git diff
  • 위로 스크롤 : k
  • 아래로 스크롤 : j

💡 TIP add와 commit 한꺼번에

git commit -am "메시지"
  • 새로 추가된(untracked) 파일이 없을 때 한정

과거로 돌아가는 두 가지 방법

  • Reset: 시간을 과거로 되돌리고, 이후 행적은 히스토리에서 지워버리는 것
  • Revert: 과거를 되돌린다는 행적을 커밋하면서 과거 행적을 유지하면서 변경.
  • 되돌리기 원하는 시점의 커밋을 거꾸로 실행한다? (뭔소린지 모르겠음.)

1. reset 사용해서 과거로 돌아가기

아래 명령어로 커밋 내역 확인

git log
  • 되돌아갈 시점의 커밋 해시 복사
git reset --hard (돌아갈 커밋 해시)

2. reset 하기 전 시점으로 복원하기

.git 폴더 복원 후, 아래 명령어로 현 커밋 상태로 초기화

git reset --hard
  • 💡 뒤에 커밋 해시가 없으면 마지막 해시를 가리킴
$ git push -f origin master

 

github 원격 저장소에도 reset 반영

3. revert로 과거의 커밋 되돌리기

되돌렸다는 히스토리를 남기기 때문에 협업에서는 revert 사용

git revert (되돌릴 커밋 해시)

충돌된 파일 해결 후

git rm leopards.yaml
git revert --continue

git revert --continue로 마무리

커밋하지 않고 revert 하기

git revert --no-commit (되돌릴  커밋 해시)
  • 원하는 다른 작업을 추가한 다음 함께 커밋
  • 취소하려면 git reset --hard

브랜치(다른 차원) 사용하기

한 프로젝트에 여러 차원이 필요한 경우

  1. 한 번에 여러 모습의 프로젝트로 관리해야 할 때
    • 예) 실배포용, 테스트서버용, 새로운 시도용, 디자인변경용
  2. 여러 작업들이 각각 독립되어 진행될 때 (현업에서는 이 방법을 채택)
    • 새로운 기능/오류/테스트는 브랜치에서 작업한 뒤, 적용이 확정된것만 메인에 통합한다. 메인은 배포용.

브랜치는 이 모든 것을 하나의 프로젝트 폴더에서 진행할 수 있도록 해준다!

1. 브랜치 생성 / 이동 / 삭제하기

add-coach란 이름의 브랜치 생성

git branch add-coach

브랜치 목록 확인

git branch

add-coach 브랜치로 이동

git switch add-coach
  • checkout 명령어가 Git 2.23 버전부터 switch, restore로 분리

💡 브랜치 생성과 동시에 이동하기

git switch -c new-teams
  • 기존의 git checkout -b (새브랜치명)

브랜치 삭제하기

git branch -d (삭제할브랜치명)

추가사항

다른곳에 반영이 안된 상태로 브랜치를 지울 때, 혹시 모를 데이터 날라감을 방지하기 위해 깃에서는 삭제를 막아놓았다. 이 때는 -d 대신 -D(대문자)로 강제 삭제해야 한다.

git branch -D (강제삭제할 브랜치명)

브랜치 이름 바꾸기

git branch -m (기존 브랜치명) (새 브랜치명)

2. 각각의 브랜치에서 서로 다른 작업해보기

브랜치에서 작업한 내용은 브랜치에만 적용된다.

즉, 이전 내용은 브랜치를 생성한 시점의 메인의 커밋내용을 갖고 있고 이후 내용은 브랜치를 생성한 이후 커밋한 내용을 갖고 있다.

3. 결과 살펴보기

git log : 위치한 브랜치에서의 내역만 볼 수 있음

CLI에서 여러 브랜치의 내역 편하게 보기

git log --all --decorate --oneline --graph

branch를 합치는 두 가지 방법

  1. merge : 두 브랜치를 한 커밋에 이어붙인다.
    • 브랜치 사용내역을 남기고 싶을 때 적합한 방식
  2. rebase : 브랜치의 커밋 내역을 다른 브랜치에 이어붙인다.
    • 한 줄로 깔끔히 정리된 내역을 유지하고 싶을 때 적합한 방법
    • 이미 팀원과 공유된 커밋들에 대해서는 사용하지 않는게 좋음.

1. merge로 합치기

add-coach 브랜치를 main 브랜치로 merge

  • main 브랜치로 이동
  • 아래의 명령어로 병합
git merge add-coach

💡 merge는 reset으로 되돌리기 가능

  • merge도 하나의 커밋
  • merge하기 전 해당 브랜치의 마지막 시점으로

병합된 브랜치는 삭제

git branch -d add-coach

2. rebase로 합치기

new-teams 브랜치를 main 브랜치로 rebase

  • new-teams 브랜치로 이동
    •  합쳐지는 쪽의 브랜치로 이동했던 merge때와는 반대!
  • 아래의 명령어로 병함
git rebase main

main의 가장 끝에서 new-teams의 커밋들이 이어붙여진 것을 확인할 수 있음.

그러나 아직 main으로 가면 new-teams와 합쳐지지 않음.

  • main 브랜치로 이동 후 아래 명령어로 new-teams의 시점으로 fast-forward (잘 모르겠음.)
git merge new-teams
  • new-teams 브랜치 삭제

marge의 끝은 commit, rebase의 끝은 merge?? (모르겠음.)

충돌 해결하기

파일의 같은 위치에 다른 내용이 입력되었을 때, 브랜치를 합치려고 하면 git은 어떤 내용을 채택할지 몰라 충돌이 발생한다.

1. merge 충돌 해결하기

  • 오류 메시지와 git status 확인
  • VS Code에서 해당 부분 확인(둘 중 무엇을 채택할 건지 고르거나, 내가 새로 코딩할 수도 있음)

당장 충돌 해결이 어려울 경우 아래 명령어로 merge 중단

git merge --abort

충돌을 해결한 경우 git add ., git commit으로 병합 완료!

브랜치 삭제

2. rebase 충돌 해결하기

merge에서와 똑같이 충돌 부분 확인하고, 해결이 어려울것 같으면 git rebase --abort한다.

해결 가능 시

  • 충돌 부분 수정한 뒤 git add .
  • 아래 명령어로 계속
git rebase --continue
  • 충돌이 모두 해결될 때까지 반복

성공적으로 끝나면 main에서 git merge conflict-2로 마무리

브랜치 삭제

(다 사용한 브랜치는 그때 그때 삭제해주는 것이 좋다. 여러개 남아있으면 헷갈림.)

GitHub 시작하기

Personal access token 만들기

다른 곳에서 깃헙을 연결하려면 깃헙의 아이디와 비밀번호를 직접 입력하는 방법을 썼는데, 보안상 좋지 않아서 token을 발행하는 것을 권장한다.

  • 우측 상단의 프로필 - Settings
  • Developer Settings
  • Personal access tokens - Generate new token
  • repo 및 원하는 기능에 체크, 기간 설정 뒤 Generate token 토큰 안전한 곳에 보관해 둘 것

토큰 컴퓨터에 저장하기

  • Windows 자격 증명 관리자
  • Windows 자격 증명 선택
  • git:https://github.com 자격 정보 생성
  • 사용자명과 토큰 붙여넣기

원격 저장소 사용하기

1. 로컬에 원격 저장소 추가 후 푸시

  • 여기서는 HTTPS 프로토콜 사용

GitHub 레포지토리 생성 후 복붙 명령어

git remote add origin (원격 저장소 주소)
  • 로컬의 Git 저장소에 원격 저장소로의 연결 추가
    • 원격 저장소 이름에 흔히 origin 사용. 다른 것으로 수정 가능
git branch -M main
  • GitHub 권장 - 기본 브랜치명을 main으로
  • (원래는 master로 되어있음.)
git push -u origin main
  • 로컬 저장소의 커밋 내역들을 원격으로 push(업로드)
    • -u 또는 --set-upstream : 어느 원격에 어느 브랜치에 push하는지를 기본으로 설정

원격 목록 보기

git remote
  • 자세히 보기 : git remote -v

원격 연결 지우기

git remote remove (origin 등 원격 이름)

2. GitHub에서 프로젝트 다운받기

  • Download ZIP: 파일들만 다운받음, Git 관리내역 제외
  • Git clone: Git 관리내역 포함 다운로드
git clone (원격 저장소 주소)

push와 pull

1. 원격으로 커밋 push

커밋 후

git push
  • 이미 git push -u origin main으로 대상 원격 브랜치가 지정되었기 때문에 가능

2. 원격의 커밋 pull

git pull

3. pull 할 것이 있을 때 push하면?

협업자가 뭔가 커밋후 원격에 push 하고, 나도 뭔가 작업후 커밋한 상황이다. 즉, 원격의 코드와 나의 코드 상태가 다르다.

이 때 push 하면 협업자가 작업한건 무시된채 내걸로 덮어쓰기 될까?

No! 원격에 먼저 적용된 새 버전이 있으면 push할 수 없다.

pull해서 원격의 버전을 받아온 다음 push 가능

push 할 것이 있을 때 pull 하는 두 가지 방법

  • git pull --no-rebase : merge 방식
  • git pull --rebase : rebase 방식
    • pull 상의 rebase는 다름 (협업시 사용 OK)

4. 로컬의 내역 강제 push 하기

git push --force

원격의 코드가 문제가 있어서 로컬의 코드로 대체할 경우에만 사용할 것. 또는 팀원들과 협의된 경우에만.

원격에서 브랜치 다루기

1. 로컬에서 브랜치 만들어 원격에 push 하기

  1. from-local 브랜치 만들기
  2. 아래 명령어로 원격에 push

아래와 같이 하면 대상을 명시하라는 메시지 나타남

git push

아래 명령어로 원격의 브랜치 명시 및 기본설정

git push -u origin from-local

브랜치 목록 살펴보기

git branch --all

or

git branch -a

2. 원격의 브랜치 로컬에 받아오기

깃헙에서 브랜치를 만들고 git branch -a로 확인해보면 깃헙에서 만든 브랜치가 보이지 않는다.

아래 명령어로 원격의 변경사항 확인

git fetch

아래 명령어로 로컬에 같은 이름의 브랜치를 생성하여 연결하고 switch (왜하는지 잘 모르겠음.)

git switch -t origin/from-remote

3. 원격의 브랜치

git push (origin같은 원격이름) --delete (원격의 브랜치명)

'git' 카테고리의 다른 글

[GitHub] 커밋 메시지(commit message) 작성 요령  (0) 2022.01.03