221213
git init
git add (파일명)
git add . - '현재' 폴더의 내부 파일, 폴더 전체에 대한 수정사항 반영
git add A - git으로 관리되는 '모든' 파일에 대한 수정사항 반영
git status - git으로 관리되는 파일 보기
4에서 commit할 때 함께 기록될 정보
git config --global user.email "(유저 이메일)"
git config --global user.name "(유저명)"
자유롭게 작성해도 되지만 실제로는 구체적으로 어떤 수정을 거쳤는지 작성해야한다.
기본적으로 "커밋 타입: 동작이름/함수이름"
git commit -m"(커밋 메세지)"
지금까지 거쳐간 모든 수정사항/commit된 버전들을 확인
git log
git log --oneline
git revert (커밋명)를 통해 되돌리기
현재까지의 commit 기록을 유지하면서 특정한 commit '이전으로' 되돌리는 명령어
'되돌아가고 싶은 commit'이 아닌 '되돌리고 싶은 commit'의 이름을 적어야 한다.
revert도 커밋으로써 저장되기 때문에 커밋 메세지도 작성해야한다.
vim이라는 텍스트 편집기 모드에서 사용하는 명령어
- esc -> i : 커서가 있는 부분부터 파일 내부의 내용을 작성, 수정할 수 있다.
- esc -> dd : 커서가 있는 부분의 행을 삭제한다.
- esc -> :wq : 파일을 저장하면서 에디터를 종료한다
- esc -> :q : 파일을 저장하지 않고 에디터를 종료한다.
git reset --soft (커밋번호) : 이후 로그는 삭제되지만 수정사항은 그대로 둔다. 단순히 commit 전 상태로 두는 것(staging 영역) git reset --hard (커밋번호) : 이후 로그도 삭제하고 수정사항도 완전히 삭제한다. 그 외에 git reset HEAD^ : 가장 최근 커밋이 취소 git reset HEAD~2 : 뒤의 숫자 만큼의 커밋이 최근부터 취소 git reset --mixed : soft와 비슷하지만, 이후 수정사항들을 commit 이전으로 돌리는 것이 아닌 add 이전으로 되돌림
Git
이 단순히 버전을 기록하고, 관리하는 도구라면,GitHub
는 이 기록들을 온라인 상에 업로드하고, 보관할 수 있게 해주는 서비스이다. github의 repository의
를 클릭하여 새로운 repository를 생성한다.
repository name을 설정하고 public으로 설정한다.
지금까지 만든 Git 저장소를 온라인상의 저장소인 GitHub에 등록한다.
repository를 생성하면 나오는 주소를 복사하여 VScode의 터미널에 아래와 같이 입력한다.
git remote add origin (github repo 주소)
앞으로는 git에 저장된 commit 기록들을 올리려면 아래 코드만 실행하면 된다.
브랜치명은 기본적으로 master
git push origin (브랜치명)
생성한 github repository를 함께 이용할 사람을 등록한다.
초대하고자 하는 사람의 계정을 입력한다.
초대받은 사람은 해당 계정의 메일에서 초대를 수락해야 한다.
public으로 등록된 repo라면 누구나 git clone을 통해 컴퓨터로 받을 수 있고
private으로 등록된 repo라면 collaborator로 등록이 되어있어야만 가능하다.
git clone은 단순히 다운로드 받는 것이 아닌 지금까지 등록된 모든 기록과 역사를 전부 가져오기 때문에, git reset 등의 명령어를 통해서 이전 기록으로 돌아갈 수도 있고 git pull, gut push 등을 통해서 이 repo에 수정사항을 반영하거나 내려받을 수 있다는 것이다
git clone (repo 주소)
위 코드를 실행하면 현재 폴더에 클론한 폴더가 생성된다.
cd 명령어를 이용하여 해당 폴더로 꼭 이동한 후
git pull origin master
위 코드를 실행하면 다른 곳에서 push 된 수정사항을 반영시킬 수 있다.
반대로 push로 내 수정사항을 repo에 올리기도 가능!
단순히 다른 사람의 저장소를 복제하여 내 github저장소에 새로 만드는 방법
파일 뿐만 아니라 commit 기록까지 모두 복제한다.
clone과 다른 점은 결국 내 컴퓨터로 받아오는 것은 내 repo라는 점!
오른쪽 상단의 fork 클릭
create하면 내 repo로 생성 완료
git remote add upstream (원본 repo 주소)
코드를 실행하여 "upstream"으로 원본 저장소를 지정해두고,
git pull upstream (브랜치명)
수정사항을 pull하여 받아올 수 있다!
git push origin (브랜치명)
위 코드를 실행한다.
221214
git 자체의 기능으로 '분기' 라는 의미를 갖고 있다.
버전 관리를 분기한다는 것은 현재 작업중인 상태(커밋 기록, 파일) 그대로, 아예 별도로 관리되는 새로운 폴더를 하나 더 만드는 것
- 브랜치를 새로 만들 때에는 항상 현재 작업중인 브랜치가 있어야 한다.
- 기본적인 브랜치의 이름은 master, main으로 사용 권장
현업에서는, 하나의 프로젝트의 세부기능을 브랜치로 각각 만들어서 별도로 관리하며 개발을 진행한다. 개발이 완료되면 그 브랜치를 하나로 통합해서 서비스를 완성하는 방식
기본적으로 브랜치의 이름은 master이지만 main으로 사용하길 권장.
git config --global init.defaultBranch (변경할 브랜치 이름)
git branch -m (변경할 브랜치 이름)
git switch -c (새로운 브랜치 이름)
git branch --list
git branch -D (삭제할 브랜치명)
main 브랜치에 다른 브랜치의 수정사항을 반영하기 위해서 merge를 진행한다.
git merge (지금 있는 브랜치에 합치고 싶은 브랜치의 이름)
git log --graph --decorate --oneline
merge를 진행할 때 다양한 conflict가 발생될 수 있다.
두 브랜치에 다른 내용이 같은 자리에 있다면 무엇을 선택하여 main에 남길지 결정해야함!
- accept current change 를 선택한다면 현재있는 브랜치, 즉 main 브랜치의 내용을 선택
- accept incoming change 를 선택한다면 병합하는 브랜치의 내용을 선택
- accept both changes 를 선택한다면 두 브랜치의 내용을 모두 선택(main이 윗줄)
만약 분기되었지만 main 브랜치는 수정사항이 없고, 분기된 브랜치에 수정사항이 있을 때 그냥 merge한다면?
분기되지 않은 것처럼 main으로 커밋 기록이 만들어진다.
-> 이런 상황을 fast-forward 라고 한다.
커밋 기록을 꼭 남기고 싶다면?
git merge develop --no-ff
--no-ff 코드를 추가하여 분기를 유지한다.
보통은 분기 기록을 남긴다.
특정 브랜치를 base(기준)로 놓고, 커밋 이력을 정렬하는 것
위처럼 브랜치를 나누었을 때
'main'을 기준으로 'rebase develop'을 실행하면
develop의 커밋 이력을 base로 해서 거기에 이어져서 main의 커밋 이력이 정렬된다.
즉 merge되지 않고 하나의 줄기처럼 커밋 이력이 정렬된다.
- 병합을 위한 방법이 아니고, 커밋 히스토리를 정렬하기 위한 명령어다.
이미 병합이 되었더라고 거기서 rebase를 하면 커밋 이력을 다시 정렬할 수 있다.
rebase를 할 때에도 conflict가 발생할 수 있다.
- merge의 경우 수정 후 바로 add, commit을 진행하면 되지만
- rebase의 경우 수정 후 add, 그리고
git rebase --continue
를 진행해야 한다.
- rebase에서 merge conflict가 발생했을 때 rebase를 취소하고 싶다면
git rebase --abort
pull request란 '내 담당 브랜치에서 작업이 완료되었으니, 이 브랜치의 코드를 가져가서 병합해주세요' 라는 요청을 보내는 것
잘못된 코드가 main에 바로 merge되는 것을 방지하고자 동료들의 코드리뷰가 끝난 후 검사가 완료되면, 관리자가 병합 요청을 승인하여 그때서야 merge를 시키는 것이다.
Pull Request를 하는 이유
- 내가 작성한 코드가 바로 merge될 경우 발생할 수 잇는 문제를 미리 방지
- 현재 코드에 대한 코드 리뷰를 진행
- 프로젝트에 대한 진행상황을 관리
git push origin (내가 수정을 진행한 브랜치 이름)
위 코드를 실행하면 해당 브랜치의 수정 내용이 github로 올라가게 되고 해당 레포에 가면
다음과 같은 버튼이 뜬다.
버튼을 클릭하면 요청서를 작성할 수 있고, 예를 들어 다음과 같은 내용을 포함하게 작성한다.
files change에서 코드 라인별로 comment를 남길 수 있고, 바꿀 것이 없다면 approve(승인)를 한다.
모든 수정이 다 이루어졌다면
Pr을 merge하게 된다.
merge는 커밋으로 남기 때문에 커밋 메세지를 작성한다.
merge된 브랜치는 삭제할 수 있다.
삭제해주는 이유는 이미 해당 브랜치에서 할 작업은 끝났기 때문에, 삭제해서 정확히 우리가 작업을 진행 중인 브랜치만 남겨서 확인하기 위함이다.
Pr 완료 후 내 컴퓨터에 내용을 반영하려면 아래 코드를 입력한다.
git pull origin main
github 상에서 브랜치를 삭제했지만 컴퓨터에선 인식을 하지 못한다
두가지의 브랜치가 있는데
git fetch --prune
git branch -D (),(),() 하나하나 입력해준다
Pr에서 merge conflict가 발생했을 경우 해결방법
git switch (base 브랜치) git pull origin (base 브랜치) git switch (head 브랜치) git merge (base 브랜치)
을 입력하면 conflict를 해결할 수 있다.
221215
milestone을 작성하여 모든 작업을 아우르는 제목과 완성 기한, 설명을 작성한다.
label로 가서 팀마다 필요한 label을 만든 후 사용한다.
new issue를 클릭하여 새로운 issue를 생성한다.
제목을 현재 진행할 작업을 간단히 표현 "Feat: ~"으로 작성하고
내용에 해당 작업의 세부 작업으로 무엇이 있는지 체크리스트 형태로 관리할 수 있도록 작성
assignees로 작업자 지정
label로 해당 작업의 카테고리를 지정
milestone으로 해당 작업이 어느 일정에 속하는 지 지정
issue close를 누르면 issue가 close되고 진행 상황의 %가 채워짐
issue 와 pull request 함께 사용하기
issue 마다 부여되는 이슈 번호를 기억!
issue 이름에 맞춰 브랜치를 생성하고 add, commit 후 해당 브랜치를 push 한다.
pull request를 등록한다.
다음과 같이 close #(이슈 번호) 를 꼬리말에 꼭 입력
이후 merge까지 완료가 된다면 issue가 자동으로 close됨
close, closes, closed, fix, fixes, fixed, resolve, resolves, resolved 등의 단어를 사용해도 됨
wiki에는 업데이트 사항을 기록할 수 있고
서비스 소개(readme.md에 다 적지 못한 부분), 서비스 기능, 매뉴얼, 해당 프로젝트에 기여할 수 있는 방법을 작성
공부 내용을 정리하는 wiki로 사용해도 굿
나의 실수
1. 브랜치를 나누고 브랜치를 pull request 한 후에 실수로 바로 merge를 했다
2. 바로 revert를 해서 merge를 취소했다
3. 닫힌 이슈를 reopen했다
4. 다시 파일을 add하고 commit 하려는데 수정사항이 있어야 해서 다시 내용을 추가했다
5. 후에 add, commit을 했고 pr을 했는데 conflict가 발생하여 merge가 되지 않았다
내 생각
push 전에 pull을 안했나.. 안하면 push 자체가 안되지 않나?
revert를 github에서 하는 것을 추천하지 않는다고 했는데 이런 이유였던 것 같다
앞으로 머리속에서 구조를 잘 생각하고 revert 후의 결과를 미리 생각하고 대처해야겠다
trunk - 기본적으로 하나의 중심 브랜치로만 관리하는 것
trunk based flow - trunk에서 필요할 때만 브랜치를 분기하는 것
총 5 종류의 브랜치를 활용
master, develop은 영구적으로 존재
hotfix, release, feature는 필요할 때마다 브랜치를 만들고 merge가 되면 삭제한다
전체적인 merge순서는 feature - develop - release - master
항상 --no-ff 옵션을 붙인다
hotfix
, develop
release
hotfix-* (hotfix-1)
과 같은 형태로 이름을 지정해서 만든다master
develop
, master
release-* (release-1)
과 같은 형태로 이름을 지정해서 만든다develop
develop
, master
master
feature
, release
feature
feature/* (feature/기능명)
과 같은 형태로 이름을 지정해서 만든다develop
develop
- 큰 규모의 팀
- 퀄리티 보장이 중요한 프로젝트
- release 된 프로젝트에 대한 관리 사이클이 긴 경우
- 작은 규모의 팀 또는 빠른 개발과 업데이트가 중요한 서비스에서는 오히려 비효율적으로 작용
딱 두 종류의 브랜치만 사용
배포용 브랜치인 master, 각 단위 기능 구현을 위한 브랜치인 feature로 구성
feature 브랜치는 merge 후에 삭제
feature
feature
master
master
- 작은 규모의 팀
- release 된 프로덕트에 대한 관리 사이클이 짧은 경우 (업데이트 주기가 짧은 경우)
- 빠른 배포와 관리가 필요한 경우
Gitlab Flow
는 4종류의 브랜치를 사용
github flow 는 테스트를 위한 브랜치가 없고, 배포용 브랜치가 따로 없기 때문에 큰 규모의 서비스에는 적합하지 않다. 그래서 github flow 의 단순함과 git flow 의 체계적인 관리를 합쳐서 절충적으로 git 을 활용하는 방식이 바로 gitlab flow
pre-production 브랜치가 테스트를 담당하고, master 브랜치가 개발용 브랜치 담당
feature 브랜치는 다른 flow 와 마찬가지로 merge 되면 삭제
master
pre-production
production
과 master
에 각각 pr 을 날린다.master
master
production
, master
feature
feature
, pre-production
pre-production
master
master
- 중간 규모의 팀
- 퀄리티 보장이 중요한 프로덕트
- 빠른 배포와 관리가 필요한 경우
- 스타트업 규모에서는 gitlab flow 정도가 적절
- git flow는 브랜치가 조금 많은듯함
이름이 헷갈리지 않게 gitlab flow에서 이름만 다음과 같이 하면 될듯
커밋 메세지
git commit -m""과 같이 적은 내용은 사실 커밋 메세지의 제목에 해당함
제목과 내용을 모두 입력하고 싶다면 git commit 라고만 입력하면 vim 편집기가 실행되어 전체 커밋 메세지를 작성할 수 있다
제목은 간단하게 해당 커밋의 목적을 요약해서 작성
메세지 규칙 -
.
)는 찍지 않는다.무엇을
, 왜
에 맞춰서 작성한다.제목 규칙 -
그리고 단순히 제목의 내용만 적는 것이 아니라,
앞에 Feat:
이라는 단어가 붙어있는데, 이는 해당 커밋의 타입을 명시
본문 규칙 -
꼬리말 규칙 -
폴더 내부에 .github
폴더를 만들고
폴더 내에 issue_template.md
, pull_request_template.md
파일을 만든다
그럼 github에서 해당 파일에 작성한 템플릿이 issue, pr을 만들 때 자동으로 입력되어 나타난다
github 내에서 만들 수 있음
main 브랜치에 에러가 있는 브랜치를 바로 merge하는 것을 방지하기 위해서 미리 방지해야 한다.
설정에 들어가서
왼쪽에서 branches 를 선택하고 add rule
보호하고자 하는 브랜치의 이름/패턴을 입력
아래 7가지 옵션을 선택
→ 일반적으로 사용하게 될 옵션은 1, 3, 7
1번 옵션의 경우 체크를 하면,
require approvals
는 총 몇번의 approval 코드 리뷰가 필요한지 정하는 옵션
dismiss stale pull request approvals ~~
는 새로운 리뷰 가능한 커밋이 push 되면 그 이전의 approval 을 자동으로 삭제하는 옵션
require review ~
는 지정된 코드 관리자로부터 필수적으로 리뷰를 받도록 하는 옵션
→ 여기서는 require approvals 만 사용
1번과 7번에 체크를 하게 된다면 바로 merge가 안되고 pr을 이용해야만 함 (추가적으로 옵션 체크로 조건 추가)
그리고 관리자 또한 절대 우회 불가
git으로 관리되고 있는 폴더에 .gitignore 파일을 생성하고 파일 내부에 숨기고자 하는 파일명을 입력
만약 .gitignore 작성 전에 add, commit을 진행했다면?
git rm -r --cached .
을 입력해서 캐시 제거