Git Flow란?

Git Flow 란 어떤 기능이 아니라 Vincent Drissen이 시작한 Git 사용 방법론이다!


Git Flow 는 총 5가지의 브랜치를 사용해서 Git 을 사용 하는 운영 방법이다.

  • master: 기준이 되는 브랜치로 제품을 배포하는 브랜치이다.
  • develop : 개발 브랜치로 개발자들이 이 브랜치를 기준으로 각자 작업한 기능들을 병합(merge)한다.
  • feature : 단위 기능을 개발하는 브랜치로 기능 개발이 완료되면 develop 브랜치에 합친다.
    • 브랜치 나오는 곳: develop
    • 브랜치 들어가는 곳: develop
    • feature 브랜치는 origin 에는 반영하지 않고, 개발자의 repo에만 존재하도록 한다.
  • release : 배포를 위해 master 브랜치로 보내기 전에 먼저 QA(Quality Assurance, 품질검사) 를 하기 위한 브랜치이다.
    • 브랜치 나오는 곳: develop
    • 브랜치 들어가는 곳: develop, master
    • develop 브랜치에서 release 브랜치를 따내고, 이와 별개로 develop 브랜치에서는 다음번 릴리즈에서 사용할 기능을 추가해 나간다. release 브랜치에서는 버그 픽스에 대한 부분만 커밋하고, 릴리즈가 준비되었다고 생각하면 master 로 병합을 진행한다. 그런 뒤 develop 브랜치로 병합하여, release 브랜치에서 수정된 내용이 develop 에 반영되도록 만든다.
  • hotfix : master 브랜치로 배포를 했는데 버그가 생겼을 때 긴급 수정하는 브랜치이다.
    • 브랜치 나오는 곳: master
    • 브랜치 들어가는 곳: develop, master


feature > develop > release > hotfix > master 브랜치가 존재하며, 병합(merge)는 앞에서 뒤로만 진행한다. 즉, release 브랜치와 hotfix 브랜치의 경우, develop 브랜치의 오른쪽에 위치하기에 develop 브랜치 병합이 허용된다.


Fig1


Rebase 란?

rebase 에 관련하여 다음 블로그 에서 너무 설명을 잘 해놓았다. 이를 바탕으로 간단하게 정리만 해보자.

다음과 같은 커밋 기록이 있다고 하자.

fig1


이 때 feature 브랜치와 master 브랜치의 공통 조상 bbase 라고 부른다.

fig1


이 base 를 다른 커밋 지점으로 바꾸는 것을 Rebase 라고 한다.

fig1


자세한 원리와 명령어는 다음 블로그 를 참조하고 간단하게 표현만 짚고 마무리하자.

feature 브랜치를 master 브랜치에 rebase 한다

= feature 브랜치의 master 브랜치와의 공통조상 base 를 master 로 변경한다


스테이징/커밋 실수 대처 방법

staging

스테이지에 파일을 실수로 올렸을 때,

git reset HEAD "빼고싶은 파일명"

을 이용하여 해당 파일을 untracked 로 만들 수 있다.

clean

만약 Git 저장소에서 untracked 상태의 파일들을 삭제하고 싶다면 다음 명령어를 사용할 수 있다.

git clean


🚩이 명령어는 매우 위험한 명령어이다. 삭제한 파일을 되돌릴 수 있는 방법이 없기 때문이다. 단순히 위 명령어만을 사용하면 에러가 발생한다. 다음과 같은 옵션과 함께 사용해야 한다.

✔️ -f : 강제 삭제

✔️ -d : 디렉토리까지 삭제

✔️ -n : 삭제 전 삭제 대상 확인

✔️ -i : 인터랙티브 모드로 삭제


commit

  1. 아직 푸시되지 않은 커밋 메세지 고치기
  2. 이미 작성한 커밋에 파일 추가하기
    1. 이미 커밋을 해버렸는데 이 커밋에 포함되면 좋을 것 같은 작업이 추가되었을 때, 일단 수정사항을 git add -A 스테이지에 올리고, git commit --amend -m "새로운 작업을 포함한 커밋 메세지" 의 명령어를 이용하여 다시 커밋한다.

등의 작업을 하고 싶을 때,


git commit --amend -m "새로운 메세지"

현재 브랜치에 있는 최종 커밋을 취소하고 새로운 커밋메세지와 함께 다시 커밋할 수 있는 명령어를 이용하면 된다.



푸시하기 전에 커밋을 취소하고 싶다면,

git reset HEAD~1
git reset "커밋 해시"

의 명령어를 이용할 수 있다.


이 명령어와 함께 사용할 수 있는 옵션이 총 세가지가 있다.

1 . --hard git reset --hard "커밋 해시"

  • 커밋 기록을 삭제하는 동시에 로컬에서의 변동조차 삭제하는 명령어이다.
  • 가령, readme.md 에 ‘안녕하세요’ 라는 내용을 추가한 뒤 커밋을 했다고 가정하자. 이 때 위 명령어로 커밋 기록을 삭제하면 커밋 기록이 삭제되는 것은 물론이고, 로컬의 readme.md 내부의 ‘안녕하세요’ 라는 내용 또한 삭제된다.

2 . --soft git reset --soft "커밋 해시"

  • 커밋 기록을 삭제하나, 스테이징 상태는 보존된다.
  • 1번의 예시와 마찬가지의 상황에서 위 명령어를 사용하면, 커밋 기록은 삭제되나 readme.md 파일의 변동 사항은 유지되며 해당 파일은 여전히 staging 되어있다.

3 . --mixed git reset --mixed "커밋 해시"

  • 커밋 기록을 삭제하고 해당 파일은 untracked 상태로 변화하지만, 로컬에서의 변동 기록은 보존된다.


git stash 란?

어떤 작업을 하고 있을 때 잠깐 다른 업무를 처리하려 브랜치를 변경하는 경우를 생각해보자. 아직 완료되지 않은 작업을 커밋하기에는 뭔가 껄끄럽다. 이럴 때 사용할 수 있는 것이 바로 git stash 이다.

git stash 란 아직 마무리하지 않은 작업을 스택에 잠시 저장하는 명령어이다. 아직 완료하지 않은 작업을 커밋하지 않고 임시 저장하여 나중에 다시 꺼내 쓸 수 있다.

git stash

  1. 스테이지에 올라온 파일 (커밋 바로 직전 단계에 있는 파일)
  2. Tracked 상태인 파일 중 Modified 되었으나 스테이지에 올라가지 않은 파일 (수정된 사항을 git add 하지 않은 파일)

만을 임시저장할 수 있다.

명령어는 다음과 같다.


  • 하던 작업 임시로 저장하기
git stash


  • stash 목록 확인하기
git stash list


  • stash 적용하기 (했던 작업을 다시 가져오기)
// 가장 최근의 stash를 가져와 적용한다.
git stash apply

// stash 이름에 해당하는 stash를 적용한다.
git stash apply [stash 이름]

// staged 상태였던 파일을 자동으로 다시 staged 상태로 만들어 준다.
git stash apply --index


  • stash 제거하기
// 가장 최근의 stash를 삭제한다.
git stash drop

// stash 이름에 해당하는 stash를 제거한다.
git stash drop [stash 이름]


  • stash 적용 + 제거
git stash pop


git ignore

What?

Git 백업 시 특정 파일을 제외할 수 있도록 해주는 방법이다. .gitignore 파일을 통해 구현된다.


How?

  1. .gitignore 파일을 만든다. 최상위 Directory 에 만들어야 한다.

  2. .git ignore 에 아래 코드를 참고하여 백업 시 제외할 파일을 설정한다

    # 확장자가 .a 인 파일을 제외한다.
    *.a
       
    # 확장자가 .a 인 파일을 제외시켰을 때, 예외적으로 lib.a 파일은 제외하지 않는다.
    !lib.a
       
    # 현재 디렉토리에 있는 TODO 파일을 제외한다. 서브 디렉토리에 있는 TODO 파일은 해당하지 않는다.
    /TODO
       
    # build 디렉토리에 있는 모든 파일을 제외한다.
    build/
       
    # doc/notes.txt 등과 같이 doc 안에 있는 파일 중 확장자가 .txt 인 파일을 제외한다. 주의해야할 점은 doc/server/arch.txt 등과 같이 depth 가 2 이상인 서브 디렉토리의 .txt 파일은 해당하지 않는다는 점이다.
    doc/*.txt
       
    # doc 디렉토리 안에 있는 모든 .pdf 파일을 제외한다.
    doc/**/*.pdf
    
    # data 디렉토리의 모든 파일을 제외하지만 폴더는 유지한다.
    data/*
    !data/
    !*/**/.gitkeep
    
  3. .gitignore 을 다 작성하였다면 다음과 같이 터미널에 입력하여 적용한다.

    git rm -r --cached .
    git add .
    git commit -m "Apply .gitignore"
    


Tip. 특정 확장자를 가진 파일만 추적하기

*
!*/
!/**/*.py
!/**/*.txt
!/**/*.jpg
!/**/requirements*
!/**/Dockerfile*
!/**/*.sh

Reference

  1. https://velog.io/@jacoblee19/%EB%A9%B4%EC%A0%91-%EC%A4%80%EB%B9%84-Git-GitHub

  2. https://velog.io/@godori/Git-Rebase

  3. https://www.hamadevelop.me/gitCommonMistakes/?fbclid=IwAR2cR7H8PgesxgErwEOa93PxMthTdY0J4e1xMP18pTtaLrC-KqgalJsERQs

  4. https://gmlwjd9405.github.io/2018/05/18/git-stash.html

  5. https://nesoy.github.io/articles/2017-01/Git-Ignore

Leave a comment