[Git] Git의 모든것 + Source Tree

강동현·2023년 12월 5일
0

Git

목록 보기
1/1

1.🎇Git

1-1. Git이란 무엇인가?

깃(Git)분산 버전관리 시스템(DVCS = Distributed Version Contirl System)으로 컴퓨터 파일의 변경사항을 추적하고, 한 파일에 대한 여러 사용자의 공동 작업을 조율하는데 사용된다.

  • 즉, 하나의 프로젝트에서 여러 개발자협업하기 위한 기술

1-2. GitHub란 무엇인가?

분산 버전 관리 툴인 깃(Git)을 사용하는 프로젝트를 지원하는 웹호스팅 서비스

  • 즉, 파일 저장소(서버)

1-3. CLI vs GUI

CLI(Command Line Interface): GitBash와 같이 명령어를 이용해 조작
GUI(Graphical User Interface): GitDesktop, SourceTree와 같이 시각적으로 보이는 유저 인터페이스를 활용해 조작

1-2. Git 기본용어

README : 디렉터리나 압축 파일에 포함된 파일에 대한 정보를 포함하여 함께 배포되는 파일
Git Ignore : 관리할 필요 없는 파일을 기술하는 파일
License : None (소스코드를 가져다 쓸 때 저작권 관련하여 어떤 라이선스로 이용가능한지를 명확히 기술하는 것)


2. Git Bash

IT업계 종사자라면 사용할 수 있어야 하는 git bash

2-1. Git 최초 설정

Git Bash에서 아래 명령어를 통해 이름, 이메일 설정

git config --global user.name "(본인이름)"
git config --global user.email "(본인이메일)"

사용 예제

git config --global user.name "abc"
git config --global user.email "abc@naver.com"

아래 명령어로 이름, 이메일 확인

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

기본 브랜치 이름 변경

  • master / slave : 흑인 노예 연상 -> main / branch으로 변경됨
  • 이에따라 기본 브랜치의 이름을 main으로 변경
git config --global init.defaultBranch main
git config --global init.defaultBranch
  • git init: 폴더 경로에 git 연동, 깃 저장소 생성 및 .git 파일 생성
git init
  • git status: 현재 폴더의 상황(변동사항)을 git의 관점에서 보여줌
  • git diff: 현재 폴더의 상황(변동사항)을 git의 관점에서 보다 자세히 보여줌
git status
git diff

2-2. Git에게 맡기지 않을 파일 폴더 설정

  • git status의 폴더 상황(변동사항)에서 배제하겠다는 의미
  • github 서버로 업데이트할 파일을 선택하겠다는 의미
  • 1. 포함할 필요가 없는 파일: 자동 생성 or 다운로드 되는 파일(빌드, 결과물, 라이브러리)
  • 2. 포함하지 말아야 하는 파일: 보안상 민감한 파일
  • .gitignore를 이용해 설정

2-3. .gitignore

.gitignore 파일 내에 배제시킬 파일의 이름을 작성

  • .gitignore 파일 배제 작성법
## 1. 파일 + 폴더 배제 : 파일 또는 폴더 자체 배제(폴더 내 모든 파일 배제)
folder
game
## 2. 폴더 배제 : 폴더 자체 배제(폴더 내 모든 파일 배제)
folder/
## 3. 파일 이름 배제
backjoon1004.cpp
## 4. 특정 폴더 파일 이름 배제
/backjoon1004.cpp
foldler/backjoon1004.cpp
/folder/backjoon1004.cpp
## 5. 특정 확장자 배제
*.c
*.cs
*.html ex...
folder/*.c
folder/*.cs
folder/*.html ex...
# 6. !배제를 배제
!not_ignore_thisc.c
!not_ignore_thiscs.cs
!not_ignore_thishtml.html
file.c
# 7. 최상위 폴더의 file.c
/file.c
# 8. 모든 .c 확장자 파일
*.c
# 9. 특정 폴더 내, 모든 폴더 안에 특정 파일 배제
folder/**/debug.log

2-4. Git에 파일 변동사항 반영하기

  • 캡슐 업데이트(M = Modified)
  • 캡슐 안 파일(U = Untracted)
  • 캡슐 속 파일(A = Added)
  • 캡슐 묻기(C = Commit)
## 버전에 파일 담기
git add filename.py
# 모든 파일 담기
git add .
# git add 취소하기
git rm --cached <file>
## 버전으로 묶어주기
# vi 입력모드로 진입
git commit
# vi 모드 명령어
# i : insert -> 커밋 메시지 작성
# Esc : 종료
# : : 커밋 저장 및 종료 설정
# :q = 저장하지 않고 종료
# :q! = 저장하지 않고 강제 종료
# :wq = 저장 후 종료
# 커밋 메세지 한 번에 작성
git commit -m "comment"
# add + commit + 커밋 메시지
git commit -am "comment"
# 커밋 이력 확인
git log

2-5. 이전 버전으로 돌아가기

  • Reset : 현재 버전을 지우고 이전 버전으로 돌아가기
  • Revert : 현재 버전의 업데이트된 사항을 디 업데이트 시켜, 이전 버전으로 돌아가기
    돌아가는 액션도 기록으로 남겨둘 필요가 있을 때
    지금까지의 변화는 살리되 특정 버전에서의 작업만 수정이 필요할 때
    특히 협업 시에는 공유된 커밋을 삭제하는 것이 매우 크리티컬하다
## Reset
# 되돌아갈 시점의 커밋 해시 복사
git reset --hard (돌아갈 커밋 해시)
# 현재 커밋 상태로 초기화. 현재 없지만 reset하면서 다시 생성된 파일은 수동으로 삭제
git reset --hard
## Revert
# 수정할 커밋의 해시를 찾는다
git revert (수정할 커밋 해시)
:wq
# 커밋 수정 내용이 이후 커밋의 코드에 영향을 주는 경우 conflict가 발생하게 된다
# "Replace Lions with Leopards" 커밋을 revert하면 이후 leopard를 수정하는 부분에서 conflict
git revert 6909f6ca6ab597a8b78cfcfc99ee8ca6a85a539a
# 커밋 revert로 삭제가 필요한 leopards.yaml 삭제
git rm leopards.yaml
git revert --continue
:wq
# revert 시에는 commit이 동시에 되는데 commit 없이 revert 하고 싶을 때 
# (다른 액션도 함께 커밋하고 싶을 때)
git revert --no-commit (수정할 커밋 해시)
# 커밋되지 않은 것들을 지우고 현재 커밋 상태로 초기화하고 싶을 때
git reset --hard

2-6. Branch: 분기된 가지(다른 차원)

  • 프로젝트를 하나 이상의 모습으로 관리해야할 때 사용 ex) 서비스용, 테스트서버용, 개발용
  • 여러 작업들이 독립적으로 진행될 때 사용 ex) 기능1, 기능2, 기능3, 코드개선, 긴급수정
  • 각 분기(Branch)에서 작업 후, Main 분기(Branch)에 통합
# 브랜치 생성
git branch (신규 브랜치 명)
# 브랜치 목록 확인
git branch
# 다른 브랜치로 이동
git switch (신규 브랜치 명)
# 브랜치 생성과 이동을 동시에 하기
git switch -c (신규 브랜치 명)
# 브랜치 삭제하기
# 지워질 브랜치에만 있는 내용의 커밋이 있을 경우(=다른 브랜치로 가져오지 않은 내용이 있는 경우) 
# -d 대신 -D로 강제 삭제
git branch -d (삭제할 브랜치 명)
# 브랜치 이름 변경
git branch -m (기존 브랜치 명) (신규 브랜치 명)
# 여러 브랜치의 내역을 한번에 보기 -> Source Tree or Github Desktop으로 확인하는게 더 편함
git log --al --decorate --oneline --graph
  • Branch 융합 = Merge / Rebase
    Merge
  • Merge : 두 브랜치를 한 커밋에 이어붙이는 방식
    o 브랜치 사용 내역을 남길 필요가 있을 때
    o 다른 형태의 merge도 있음
# merge
# 1. merger 시, 주가 될 브랜치로 이동
# 2. merge는 reset으로 되돌리기 가능. merge 전 해당 브랜치의 마지막 시점으로 reset
git switch main
git merge sub
# 병합된 브랜치는 삭제
git branch -d add-coach

Rebase

  • Rebase : 브랜치를 다른 브랜치에 이어붙이는 방식
    o 한 줄로 깔끔히 정리된 내용을 유지하기 원할 때
    o 이미 팀원들과 공유한 커밋에 대해서는 사용하지 않는 것이 적합
# Rebase로 합치기
# merge와 반대로 합쳐질 브랜치로 이동한다
git switch new-teams
git rebase main
# new-teams 브랜치가 main에 합쳐졌지만 아직 main은 new-teams 브랜치의 끝에 있지 않다.
# 따라서 main 브랜치로 이동 후
git switch main
#new-teams의 시점으로 fast-forward해준다
git merge new-teams
# 합친 브랜치 삭제
git branch -d new-teams

2-7. 충돌 대처 abort / rebase

  • abort : 충돌이 너무 많거나 당장 충돌 해결이 어려운 경우 머지 중단
## merge에서 충돌이 발생하는 경우
git switch main
git merge conflict-1
# Auto-merging tigers.yaml
# CONFLICT (content): Merge conflict in tigers.yaml
# Automatic merge failed; fix conflicts and then commit the result.
# abort : 당장 충돌 해결이 어렵다면 merge 중단
git merge --abort
# 해결 가능 시 충돌 부분 수정 후 git add, commit으로 병합 완료
git add .
git commit
  • rebase : 다시 심어 해결
#브랜치 이동
git branch sub2
git rebase main
## rebase에서 충돌이 발생하는 경우
# 오류 메세지와 git status 확인
# 당장 해결이 어려운 경우 중단
git rebase --abort
# 해결 가능 시 충돌 부분 수정한 뒤 아래 명령어 수행 (continue하여 또 충돌이 있는 지 찾는다)
# 충돌이 해결될 때까지 반복
git add .
git rebase --continue
# main에서 git merge conflict-2로 merge하여 마무리
git switch main
git merge conflict-2
git branch -d conflict-1
git branch -d conflict-2

3. Git Desktop

  • Git Desktop < Source Tree(추천): 기능이 적어 Source Tree를 현업에서 사용

4. Source Tree[★]

버튼 UI에서 알아서 찾아서 누르면 된다.

  • 1. add: stage에 올리기

  • 2. commit: git commit

    ㅇ commit 메세지 작성 후 commit 수행
  • 3. push: git push

  • 3-1. publish-branch: git push를 통해 해당 브랜치 자동 publish

  • 4. pull: git pull(fetch까지 동시에 진행)

  • 4-1. fetch: fetch를 통해 브랜치 받아오기

  • 4-2. branch clone: 원격 브랜치 우클릭 -> 체크아웃

  • 5. reset: 원하는 타임캡슐에 우클릭 -> 이 커밋까지 현재 브런치를 초기화

  • 6. revert: 원하는 타임캡슐에 우클릭 -> 커밋 되돌리기

  • 7. create brance: 브랜치 버튼 클릭

  • 8. brance switch: 원하는 브랜치 더블클릭

  • 9. merge: 주체가 될 branch에 위치 -> merge를 원하는 branch 우클릭 -> 현재 브랜치로 branch 병합 클릭

  • 10. rebase: 병합될 branch에 위치 -> 주체가 될 branch 우클릭 -> 현재 변경사항을 main에 재배치 클릭

    -> 주체가 될 branch에서 병합될 branch를 merge 수행
  • 11. 충돌 해결: CLI단에서 해결

  • 12. 원격: 저장소 -> 원격저장소 추가 -> 추가 -> origin + https 경로 붙여넣기(default 원격 여부 클릭)


5. Git Kraken(유료)


6.Github

6-1. Github이란 무엇인가?

(Github)은 코드 공유 및 협업 서비스로 프로젝트를 레포지터리 단위로 올리고, Git으로 관리하는 프로젝트를 공유하며 저장되는 서버 공간이다.

  • 전 세계의 수많은 오픈소스 프로젝트들이 Github에서 공유된다.
    ex) Gitlab, Bitbucket

6-2. Git-Github 연동: Local 프로젝트 Github에 올리기

# 로컬에 원격 저장소 추가 후 푸시 (repository 명령어 복붙)
# 여기서는 https 프로토콜 사용
# 로컬의 git 저장소에 원격 저장소로의 연결 추가
git remote add origin (원격 저장소 주소)
# 브랜치 명 수정
git branch -M main
# 로컬 저장소의 커밋 내역을 원격으로 push (업로드). origin의 main branch로 push
git push -u origin main
# 원격 저장소 목록보기: origin 이름 출력
git remote
# 원격 저장소 목록보기: origin 세부정보 출력
git remote -v
# 원격 지우기 (github repository가 지워지는 것이 아니라 로컬 프로젝트와의 연결만 삭제)
git remote remove (origin 등 원격 이름)

6-3. Git-Github 연동: Github 프로젝트 로컬로 복제하기(Clone)

# 1. Github에서 프로젝트 다운받기(쓸모없는 방식)
# 2. 프로젝트를 다운받고자 하는 폴더에서 우클릭 - Git Bash here
git clone https://github.com/gin-girin-grim/git-practice.git(원격 저장소 주소)

6-4. Push: Local -> Github 업데이트 전송

# 원격으로 커밋 밀어올리기 (push)
git push

6-5. Pull: Github -> Local 업데이트 받아오기

# 원격으로 커밋 당겨오기 (pull)
git pull

6-6. Pull & Pull 주의사항

# pull 할 것이 있을 때 push를 해버리면?
git push
# To https://github.com/gin-girin-grim/git-practice.git
# ! [rejected]        main -> main (fetch first)
# error: failed to push some refs to 'https://github.com/gin-girin-grim/git-practice.git'
# hint: Updates were rejected because the remote contains work that you do
# hint: not have locally. This is usually caused by another repository pushing
# hint: to the same ref. You may want to first integrate the remote changes
# hint: (e.g., 'git pull ...') before pushing again.
# hint: See the 'Note about fast-forwards' in 'git push --help' for details.
# 우선 먼저 pull을 하고 push를 해준다
# 1-1. merge 방식
git pull --no-rebase
# 1-2. rebase 방식
# pull 상의 rebase는 협업 시에도 사용 OK
git pull --rebase
# 2. push
git push
# 협업 시 충돌이 발생하는 경우
# 이후는 merge/rebase 방식과 동일. 충돌 처리 후 git add ., git commit
git pull --no-rebase
git pull --rebase 
-> git add .
-> git rebase --continue

6-7. force(강제푸시): 원격 내용을 삭제하고 로컬로 맞추기

  • 합의되지 않은 상황에선 사용하지 말아야 함
# 로컬의 내역을 강제로 push 하기
# 먼저 로컬의 충돌 전 커밋으로 reset 후
git push --force

6-8. 원격 branch 다루기

# 로컬에서 브랜치 만들어 원격에 push 해보기
git branch -c from-local
# push 해 줄 브랜치를 명시해준다
git push --set-upstream origin from-local
git push -u origin from-local   # 동일한 코드
# 원격 브랜치 목록까지 보기
git branch --all
git branch -a
# 원격의 브랜치를 로컬로 받아오기
# 원격에 브랜치를 생성해도 원격 저장소 상태를 받아오지 않으면 로컬에서 변화를 볼 수 없음
$ git fetch
From https://github.com/gin-girin-grim/git-practice
 * [new branch]      from-remote -> origin/from-remote
git branch -a
# 로컬에도 같은 이름의 브랜치를 생성하여 연결 및 switch
# 원격에서 로컬로 from-remote 브랜치를 복사하고, 이후에도 로컬의 from-remote 브랜치와 
# 원격의 from-remote 브랜치를 연동하겠다는 의미
git switch -t origin/from-remote
# 원격 브랜치 삭제
git push (원격 이름) --delete (원격의 브랜치 명)
git push origin --delete from-remote

profile
GAME DESIGN & CLIENT PROGRAMMING

0개의 댓글