iOS 개발 기록

[Git] git 기본 본문

Git

[Git] git 기본

택꽁이 2023. 2. 14. 14:48
728x90

📄

1. git 개념과 목적

Git이란 무엇인가?

  • 분산형 버전 관리 시스템(Version Control System) 의 한 종류.
    버전관리 예시
  • 프로젝트의 수정 내용으르 복사, 백업, 저장하는 것을 빠르게 도와주는 도구가 git

장점

버전 관리

  • 각 파일을 이전 상태로 되돌릴 수 있다.
  • 프로젝트를 통째로 이전 상태로 되돌릴 수 있다.
  • 시간에 따른 수정 내용을 비교해 볼 수 있다.
  • 누가 문제를 일으켰는지 추적할 수 있다.
  • 파일을 잃어버리거나 잘못 고쳤을 때에도 쉽게 복구할 수 있다.
  • 팀 프로젝트가 아닌 개인 프로젝트에서도 버전 관리가 용이하고 프로그램이나 패치를 배포하는 과정도 간단해진다.

협업

  • 소스 코드를 주고받을 필요 없이, 같은 파일을 여러 명이 동시에 작업하는 병렬 개발이 가능하다.
  • 분산 버전 관리이기 때문에 인터넷이 연결되지 않은 곳에서도 개발을 진행할 수 있고, 나의 저장소가 날라가도 원상복구 할 수 있다.

2. git 기본 용어

Git Area에 대한 용어

git area의 동작 흐름

Working Tree (Working Directory)

  • 작업자의 현재 시점. 파일 수정, 저장 등 내가 작업하고 있는 프로젝트의 디렉토리.

Staging Area

// staging area에 추가 
git add <파일 이름>
// staging area에 전부 추가
git add .
// staging area에서 제거 
git restore --staged <파일 이름> 
  • commit 하기 전에 변경 내역이 저장되는 장소
  • 변경 내역 중 commit으로 등록하기 위해 선별하는 것을 staging, 제외하는 것을 unStaging이라고 한다.

Repository *

  • commit한 파일들이 저장되는 장소. git은 크게 2종류의 저장소 (원격 저장소와 로컬 저장소) 를 제공한다.
  • 원격 저장소(Remote Repository): 파일이 원격 저장소 전용 서버에서 관리되며, 여러사람이 함께 공유하기 위한 저장소.
Sign in
GitLab is a single application for the entire software development lifecycle. From project planning and source code management to CI/CD, monitoring, and security. This is a self-managed instance of GitLab.
http://git.openobject.net:8880/pms/pms-ios/-/tree/main
  • 로컬 저장소(Local Repository): 내 PC 안에 파일이 저장되는 개인 전용 저장소.

Git 에서 사용하는 용어

SnapShot

  • 특정 시점에서 파일, 폴더, 또는 워크 스페이스의 상태
  • 스냅샷을 통해 어떤 파일에 어떤 내용이 기록되어 있는지, 폴더 구조는 어떠한지 등 저장소의 모든 정보를 확인할 수 있으며, Commit을 통해 스냅샷을 저장한다.

Commit *

// 변경된 파일을 스테이징 하는 명령어
git add . 
// 스테이징과 커밋 메세지를 한번에 추가하여 커밋
git commit -am "first commit" 
  • 파일을 수정하게 되면 해당 변경 이력은 staging area에 올라간다.
  • commitstaging area에 올라간 현재 작업 상태를 확정하고 저장소에 저장하는 작업.

Push *

// push 명령어, -u는 현재의 브랜치를 자동으로 origin의 해당 브랜치에 연결하겠다는 뜻
git push -u <저장소명> <브랜치명>
// -u 로 연결 후에는 다음과 같이 쓸 수 있다.
git push
  • 현재 내 로컬 저장소에서 작업한 내용을 원격 저장소에 반영하는 것.
  • 협업시에 Push 를 해야 다른 사람들이 내 코드를 확인할 수 있다.

Pull *

git pull
  • 원격 저장소에서 변경된 내용들을 내 로컬 저장소에 반영하는 것.
  • pull은 해당 프로젝트에서 변경된 사항들만 다운 받는다.

Branch *

브랜치 이미지
// 브랜치 목록 확인
git branch
// 새 브랜치 생성
git branch <브랜치명>
// 브랜치 이동 
git switch <브랜치명>
// 브랜치 삭제 
git branch -d <브랜치명>
  • 특정 커밋이 분기되는 포인터. 여러 명이 같은 코드를 공유하며 협업하는 상황에서 각 개발자들이 개발을 진행하고 있는 환경 또는 흐름을 말한다.

Merge

merge의 동작 방식
// feature 브랜치를 main 브랜치에 병합하는 경우
git switch main 
git merge feature 
// 또는 다음과 같이 한줄로 표현 가능
git merge main feature 
  • 나뉘어진 Branch를 다시 하나의 Branch로 합치는 것을 말한다.
  • 가장 오류가 많이 발생하는 과정 → 자주 발생하는 케이스에서 확인
  • 다양한 merge 전략
    • merge
      merge
      merge 후 커밋 내역
      • 일반적으로 많이 사용되는 병합이며, 커밋이력을 모두 남길 때에 사용.
      • 최종적으로 병합을 위한 커밋이 추가된다.

    • squash & merge
      git merge --squash <브랜치명> 
      Squash & Merge
      Squash & Merge 후 커밋 내역
      • 여러개의 커밋을 하나로 합쳐 Squash 한 새로운 커밋을 Base 브랜치에 추가하는 방식.
      • squash 하기 되면 모든 커밋 이력이 하나의 커밋으로 합쳐지며 사라진다는 것에 주의

    • rebase
      git rebase <브랜치명> 
      rebase
      rebase 후 커밋 내역
      • 브랜치의 base를 다른 브랜치의 최신 커밋으로 옮기는 작업.
      • 불필요한 병합 커밋 히스토리가 생기지 않고, main 브랜치에서 작업의 내용을 명확하게 확인할 수 있다는 장점이 있다.
      • 협업 시에 main 브랜치에서 절대 사용하면 안된다. → 다른 사람의 분기가 되는 기준 브랜치를 변화시키기 때문에 아래와 같은 혼란스러운 일이 발생.
      main에 rebase를 할 때 발생할 수 있는 문제

CheckOut

  • branch 간의 이동을 체크아웃이라고 표현한다.
  • 현재 워킹 디렉토리에 commit하지 않은 변경사항이 있다면 branch를 체크아웃 할 수 없다.
  • 이전에는 checkout 명령을 사용했지만 이제는 switchrestore로 분리
  • 변경된 명령어

Head

  • 현재 작업하고 있는 위치.

3. 기본적인 커맨드

log

// 히스토리 내역 확인
git log
  • HEAD, commit 내역 등을 확인하고 싶을 때에 사용하는 명령어
  • 명령어 옵션
    // 히스토리 조금 더 예쁘게
    git log --graph
    // 커밋 해쉬값 7자리까지만
    git log --graph --abbrev-commit
    // 커밋 해쉬 번호와 메세지만 
    git log --graph  --abbrev-commit --pretty=oneline

status

git status
  • 수정된 파일의 목록들을 확인하는 명령어

fetch

git fetch
  • 원격 저장소에 업데이트 된 내용이 있는지 확인한다.
  • pull은 변경된 내용을 확인하고 병합한다면, fetch는 확인만 하고 병합은 하지 않는다.

reset

reset의 동작 방식
// 바로 전 commit으로 돌아갈때 
git reset HEAD^
// 여러개의 commit으로 되돌릴때 
git reset HEAD~<돌아갈 커밋 수>
// 특정 commit으로 되돌아갈때
git reset --옵션 <돌아갈 커밋 해시>
  • 해당 커밋을 제거하고 이전 커밋으로 돌아간다.
  • 원격 저장소(origin)에 commit이 있는 상태로, 로컬 저장소에서 resetpush하려고 하면 에러가 뜬다. → -- force옵션으로 원격 저장소의 히스토리를 강제로 덮어쓸 수 있지만 협업시에는 하면 안되는 행동이다.
    리셋을 하면 안되는 이유 설명을 위한 예시 그림
  • reset을 사용하는 경우는 1. 원격 저장소에 push하기 전 2. 혼자만 사용하는 브랜치인 경우 만으로 국한된다.
  • 명령어 옵션
    // 돌아간 이후 변경 이력을 모두 삭제
    git reset --hard <커밋 해쉬 번호>
    // 변경 이력은 모두 삭제하지만 코드들은 unstage 상태로 코드에 남아있음
    git reset --mixed <커밋 해쉬 번호>
    // 변경 이력은 모두 삭제하지만 코드들은 stage 상태로 코드에 남아있음
    git reset --soft <커밋 해쉬 번호>

revert

revert의 동작 방식
git revert <취소할 커밋 해시>
  • 현재 commit은 그대로 두고 돌아가려는 commit을 추가한다. → 히스토리가 남는다.
  • 여러개의 commit을 되돌리고 싶으면 최근 commit부터 순차적으로 revert 해야한다.
  • 협업시에 무슨 문제가 있었고 왜 돌아갔는지 등의 기록이 가능하다는 장점이 있으며, 충돌을 최소화 할 수 있다.

stash

// stash에 저장 
git stash 
// 가장 최근 저장한 stash를 불러온다
git stash pop
  • 작업 내용을 저장하고 싶은데 커밋하기는 싫은 상황에 사용하는 명령어. 변경 사항을 스택 형태로 임시 저장한다.
  • 명령어 옵션
    // 저장된 stash 목록 확인
    git stash list
    // 특정 번호의 stash 불러오기 
    git stash apply <stash 번호>
    // 특정 번호의 stash 파일 제거
    git stash drop <stash 번호> 
    // 저장한 모든 stash 제거
    git stash clear

cherry-pick

cherry-pick 동작 원리
// 가져올 커밋들 체리픽
git cherry-pick C2 C4
// 연속적인 커밋인 경우
git cherry-pick C2..C4 
  • 다른 브랜치에 있는 커밋을 선택하여 내 브랜치에 적용시킬 때 사용하는 명령어.
  • 명령어 옵션
    // 충돌날 경우 충돌 해결 후 해당 커맨드 작성
    git add <충돌난 파일 경로>
    git cherry-pick --continue 
    // 충돌나서 포기하고 싶다면 
    git cherry-pick -abort

4. 원격저장소 연동

Github연동하는 법

git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin <원격저장소 주소>
git push -u origin main

원격저장소 관련 명령어

// 원격저장소 url 확인
git remote -v 
// 새 원격저장소 추가 
git remote add <원격저장소 이름> <원격저장소 url>
// 기존 원격저장소 제거
git remote remove <원격저장소 이름>
// 원격저장소 url 변경
git remote set-url <원격저장소 이름> <원격저장소 url>

5. GitFlow

  • Git 을 통해 효율적인 작업을 위해 만들어진 방법론.
  • 각자 개발 환경에 따라 수정하고 변형해서 사용할 수 있음.
  • master, develop 브랜치는 사라지지 않는 기본 브랜치이며, 나머지는 편의에 따라 만들고 사라질 수 있음.

들어가기 전 숙지해야 할 용어 설명

Sign in
GitLab is a single application for the entire software development lifecycle. From project planning and source code management to CI/CD, monitoring, and security. This is a self-managed instance of GitLab.
http://git.openobject.net:8880/

Fork

  • 다른 사람이 만든 원본 저장소를 그대로 복사해 내 계정의 원격 저장소로 가져오는 것.
  • 내 원격 저장소로 가져오더라도 해당 저장소는 원본 저장소와 연결되어 있다. → 원본 저장소에 새로운 로그가 추가된 경우 fetchrebase를 통해 fork된 저장소로 가져올 수 있다.

Clone

git clone <원격저장소 주소>
  • 원격 저장소에 있는 프로젝트를 로컬 저장소로 복사해온다.
  • 권한이 없는 경우, 원본 저장소의 로그를 볼 수 없고 push도 할 수 없다.

PullRequest(Merge reauest)

PullRequest 예시
  • Github에서는 첫 행동이 pull이므로 PullRequest, Gitlab에서는 최종 행동이 merge이므로 MergeRequest라고 부른다.
  • Markdown 형태로 PR 형식을 미리 만들어둘수 있다.
  • 장점 1. 직접 머지하지 않기 때문에 다른 사람의 코드와 커밋을 자세히 볼 수 있어 코드리뷰에 용이하다. 2.CI/CD와 같은 테스트 도구를 사용해 PR에 대한 테스트를 진행한 후 main에 머지할 수 있다. 3. 어떻게 다른 사람에게 내 코드를 리뷰해야 편 한지 살펴 볼 수 있다.
  • 단점 1.PR 수락 & merge에 권한을 가진 사람이 부재중일 경우 작업 처리가 느려짐 → Fork 하지 않고 원본 저장소를 clone하여 매번 새로운 브랜치를 만들고, PR 한다.

Master Branch

  • 실제 제품으로 배포하는 브랜치

Develop Branch

  • 다음 출시 버전을 개발하는 브랜치로 개발자들이 각자 작업한 기능들을 merge 하는 브랜치

Feature Branch

  • 단위 기능을 개발하는 브랜치
  • 기능 개발이 완료되면 Develop Branchmerge 후에 제거한다.

Release Branch

  • Master Branch로 보내 배포하기 전에 QA를 하기 위한 브랜치

Hotfix Branch

  • Master branch로 보냈는데 버그가 생겼을 때에 긴급 수정하는 브랜치

각 브랜치에 따른 merge 전략

  • featuredevelop
    • squash & merge: feature에서 기능 개발을 위한 지저분한 커밋 내용을 하나로 묶어 develop에 병합하면, 최종적으로 develop에는 기능 단위로 커밋이 추가되도록 정리할 수 있다.
  • developmaster
    • rebase : squash하면 커밋 이력이 다 사라져 롤백이 불가, 그리고 master에 merge 커밋을 남길 필요가 없으므로 rebase가 적합하다.

6. 자주 발생하는 케이스

Conflict

다른 브랜치와 충돌이 난 경우
  • 해결 방법
    • <<<<<< HEAD는 현재 내가 작업하고 있던 상태의 코드
    • >>>>>> <브랜치 이름>merge로 병합하려고 한 코드
    • 해당 코드들을 보고 수정한 후에 staging에 올리고 commit

버전 되돌리기

  • 파일 전체를 이전 버전으로
    • reset, revert
    • 특정 commit 버전으로 돌아갈 경우 : git switch --detach <커밋 번호>

  • 특정 파일만 이전 버전으로
    // 특정 파일만 되돌리기
    git restore <파일 이름>
    // 스테이징 된 파일 내리기
    git restore --staged <파일 이름>

Commit 메세지 변경 or Commit 취소

  • 해결 방법
    // 가장 최근의 커밋 메세지 변경 
    git commit --amend
    // 여러 커밋 메세지를 수정하고 싶을 때에 
    git rebase -i HEAD~<수정할 커밋 메세지 수>
    // push한 커밋 메세지를 수정하고 싶을 때에
    git push --force <브랜치이름>

다른 브랜치에서 작업했을 때

  • 해결 방법
    • git stash 를 사용하여 작업하던 코드들을 stash에 저장하고, 작업 브랜치로 이동하여 pop
    • 혹은 rebase를 통해 작업하는 코드의 base를 옮겨 해결할 수도 있음.

Git pull 전략

간혹 마주칠수 있는 문제
  • 내가 작업한 코드의 commit이 있고, 협업자가 원격 저장소의 base에 작업한 내용을 이미 push 했을 때에 이 코드를 어떻게 pull 할지 결정하는 내용.
  • 해결 방법
    1. git config pull.rebase fase : 원격 저장소의 커밋을 가져와 merge - merge이기 때문에 머지 커밋이 하나 증가한 것을 확인할 수 있음.

    2.git config pull.rebase true : pull 로 가져와야 할 코드를 앞에 배치(rebase)하고, 그 뒤에 커밋을 달음

    1. git config pull.ff only : fast-forward 방식의 pull 만 허용한다.

Reference

Git document

Book
The entire Pro Git book, written by Scott Chacon and Ben Straub and published by Apress, is available here. All content is licensed under the Creative Commons Attribution Non Commercial Share Alike 3.0 license. Print versions of the book are available on Amazon.com.>
https://git-scm.com/book/ko/v2

자주 사용하는 Git 명령어

깃(Git) 개념과 상황별 팁
git-usage 저장소가 어느새 스타 100을 넘었다. 에버노트에 정리한 것을 깃헙에 공유한 것인데 필요한 분들이 그만큼 많았나 보다. 기억나지 않을때 들춰볼 요량으로 명령어만 나열한 것인데, 다시 쭉 읽어보니 이해하기 어려운 부분도 종종 눈에 띈다. 여기에 살을 좀 더 덧붙여 깃 노하우 혹은 팁 을 정리해 보면 좋겠다.
https://jeonghwan-kim.github.io/dev/2020/02/10/git-usage.html
https://github.com/jeonghwan-kim/git-usage

Merge의 3가지 방법

[git] merge, squash & merge 그리고 rebase의 원리에 대해서 알아보자
안녕하세요. 오늘은 merge와 squash & merge 그리고 rebase의 차이점에 대해서 알아보는 시간을 가지도록 하겠습니다. 오늘은 이론적인 부분에 대해서만 말씀드릴 것이며 명령어를 실습하는 것은 다음시간에 이어서 진행하도록 하겠습니다. branch 병합 개발은 혼자 진행할 수도 있지만 대개는 여러명이 팀을 이루어 함께 개발을 합니다. 이럴 경우 github, gitlab과 같은 원격 저장소를 이용하여 코드의 형상관리를 하게됩니다.
https://sabarada.tistory.com/196#recentComments

Git-flow

우린 Git-flow를 사용하고 있어요 | 우아한형제들 기술블로그
안녕하세요. 우아한형제들 배민프론트개발팀에서 안드로이드 앱 개발을 하고 있는 나동호입니다. 오늘은 저희 안드로이드 파트에서 사용하고 있는 Git 브랜치 전략을 소개하려고 합니다. '배달의민족 안드로이드 모바일 파트에서 이렇게 브랜치를 관리하고 있구나' 정도로 봐주시면 좋을 것 같습니다. 2016년 1월, Github로 소스코드를 이전하면서 Github-flow를 사용하기 시작했습니다. 그러다 2017년 6월부터 Git-flow로 브랜치 전략을 바꾸게 되었습니다.
https://techblog.woowahan.com/2553/
[Git] GitHub로 협업하기 - Forking Workflow
팀장의 저장소를 Fork해서 팀원마다 각자 저장소를 가지고 프로젝트를 진행하는 방식이다. 팀원은 각자의 저장소를 가지고있기때문에 자유롭게 작업이 가능하다. 팀원의 작업 내용은 Pull requests를 통해 팀장의 확인 후 반영된다. 팀장 저장소의 권한은 팀장만 가지고 있으면서 다른 사람의 커밋을 프로젝트에 적용이 가능하다. 팀장이 코드를 확인하고 머지하기 때문에 안전하게 협업이 가능하다. 오픈소스프로젝트에서 많이 사용하는 방식이다.
https://velog.io/@hyowon_lee/Git-GitHub%EB%A1%9C-%ED%98%91%EC%97%85%ED%95%98%EA%B8%B0-Forking-Workflow

Git 연습용 사이트

Learn Git Branching
An interactive Git visualization tool to educate and challenge!
https://learngitbranching.js.org/?locale=ko

SourceTree


Uploaded by N2T

'Git' 카테고리의 다른 글

[Git] CLI 기본 명령어  (0) 2022.05.13
[Git] 100MB 이상의 파일이 담긴 커밋을 푸쉬해야할 때  (0) 2022.05.02