[Github] 나에게 부족한 Git/ Github 지식
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
브랜치 병합이 허용된다.
Rebase 란?
rebase 에 관련하여 다음 블로그 에서 너무 설명을 잘 해놓았다. 이를 바탕으로 간단하게 정리만 해보자.
다음과 같은 커밋 기록이 있다고 하자.
이 때 feature
브랜치와 master
브랜치의 공통 조상 b
를 base
라고 부른다.
이 base 를 다른 커밋 지점으로 바꾸는 것을 Rebase 라고 한다.
자세한 원리와 명령어는 다음 블로그 를 참조하고 간단하게 표현만 짚고 마무리하자.
feature 브랜치를 master 브랜치에 rebase 한다
= feature 브랜치의 master 브랜치와의 공통조상 base 를 master 로 변경한다
스테이징/커밋 실수 대처 방법
staging
스테이지에 파일을 실수로 올렸을 때,
git reset HEAD "빼고싶은 파일명"
을 이용하여 해당 파일을 untracked 로 만들 수 있다.
clean
만약 Git 저장소에서 untracked 상태의 파일들을 삭제하고 싶다면 다음 명령어를 사용할 수 있다.
git clean
🚩이 명령어는 매우 위험한 명령어이다. 삭제한 파일을 되돌릴 수 있는 방법이 없기 때문이다. 단순히 위 명령어만을 사용하면 에러가 발생한다. 다음과 같은 옵션과 함께 사용해야 한다.
✔️ -f
: 강제 삭제
✔️ -d
: 디렉토리까지 삭제
✔️ -n
: 삭제 전 삭제 대상 확인
✔️ -i
: 인터랙티브 모드로 삭제
commit
- 아직 푸시되지 않은 커밋 메세지 고치기
- 이미 작성한 커밋에 파일 추가하기
- 이미 커밋을 해버렸는데 이 커밋에 포함되면 좋을 것 같은 작업이 추가되었을 때, 일단 수정사항을
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
는
- 스테이지에 올라온 파일 (커밋 바로 직전 단계에 있는 파일)
- 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?
-
.gitignore 파일을 만든다. 최상위 Directory 에 만들어야 한다.
-
.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
-
.gitignore
을 다 작성하였다면 다음과 같이 터미널에 입력하여 적용한다.git rm -r --cached . git add . git commit -m "Apply .gitignore"
Tip. 특정 확장자를 가진 파일만 추적하기
*
!*/
!/**/*.py
!/**/*.txt
!/**/*.jpg
!/**/requirements*
!/**/Dockerfile*
!/**/*.sh
Leave a comment