깃 설치나 사용자 설정, 저장소 셋팅까지 모두 끝냈다면
'워크 플로우'를 반복하면서 프로젝트를 구축할 차례입니다.
아래는 git ebook 에서 설명하고 있는 워크플로우입니다.
1. Working area의 구분
Local 기준, 총 3가지 장소로 나뉩니다.
Remote 까지 합하면 4개로 나눌 수 있겠네요.
Working Directory : 원래 작업파일. 이클립스나 안드로이드 스튜디오 등을 의미.
Staging Area : 파일을 임시저장한 경로.
.git directory : commit 정보를 SHA-1 코드로 41 바이트 크기로 저장해두는 장소.
remote repository 를 제외한다면 commit까지가 끝입니다.
해설들어갑니다.
* Working Directory -> Staging Area : git add <option> 명령어로 Stage에 Fix 할 수 있습니다.
* Staging Area -> .git directory : git commit 종류 명령어로 최종 commit 할 수 있습니다.
* .git directory -> Working Directory : 이미 commit 된 정보를 작업중인 파일로 불러옵니다.
이를 checkout 이라고 하며 일반적으로 branch 마다 commit 정보가 다르기 때문에
branch의 commit 정보를 불러온다고 생각하면 됩니다.
2. 실제 작업 Life cycle
위 이미지는 매우 중요합니다.
다른 작업 정보 설정이 완료됐을 때 이 그림만 이해하고 있다면
기초적인 git을 다룰 줄 아는 거라고 생각합니다.
프로젝트에는 여러가지 파일들이 있습니다.(class etc.)
이 파일들은 git에서 각각
Untracked / Tracked (비추적 / 추적) 혹은
Modified / Unmodified (변경된 / 변경되지 않은)
파일로 관리합니다.
아래는 작업 순서별로 예시입니다.
//
A라는 class 를 만들었습니다.
Git은 만들어진 건 알고 있지만
아직 파일의 변경요소를 추적하고 있지는 않습니다.
그래서 이 파일은 Untracked 파일입니다.
//
A class 의 작성이 어느정도 완료되어
Stage에 add 합니다.
Staged 파일로 분류됩니다.
//
Staged 된 A 파일(시점)을 완전히 commit 시킵니다.
변경사항을 모두 저장했으니 Unmodified 파일입니다.
//
아 그런데 A파일에 변경사항이나 확장 사항이 있습니다.
수정합니다.
Modified 파일로 분류됩니다.
//
파일 변경이 완료되어 다시 Stage 에 add합니다.
Staged파일로 다시 분류됩니다.
//
위 사항이 반복되다가
파일을 지웁니다.
지워졌으니 변경사항이 생길 일도 없습니다.
A파일은 Untracked 파일입니다.
3. Brach work flow
정말 중요한 내용 중 하나입니다.
위 내용이 git이 파일을 어떻게 분류하고 관리하는지에 대한 설명이라면
아래는 프로젝트의 시점을 저장하는 branch 의 cycle 입니다.
3-1. 기본 master branch 에서 C0 시점부터 시작하여 commit 을 2회 한 모습입니다.
3-2. issue 가 생겨 임시 branch를 생성함과 동시에 checkout까지 합니다.
branch생성 시 자동으로 최신 commit 정보를 반영합니다.
참고로 HEAD라는 포인터는 iss53 branch를 바라봅니다.(checkout 됐으니까)
3-3. 임시 branch에 checkout 한 상태로 새로운 commit 을 합니다.
아래에서 issue 를 해결하기 위해
iss53 branch에는 메서드를 하나 추가했다면
당연히 master 브랜치에는 그 메서드가 없습니다.
iss53 branch만 한 단계 더 나아갔습니다.
3-4. 여기서 새로운 긴급 오류가 생겨서 C2를 참조하는(C3는 다른 issue 해결을 위한 별도의 branch이므로)
새로운 branch를 만든다고 해보자.
$git checkout master
$git branch -b hotfix
이제 C2를 참조하는 brach 가 2개가 되었다.
3-5. Fast forward
hotfix branch가 성공적이어서 merge를 한다.
$git checkout master
$git merge hotfix
(덮어쓰기 당하는 브랜치로 checkout하고
덮어쓸 업데이트 파일을 merge한다.)
위는 master 브랜치에 hotfix 브랜치의 변경사항을
merge하는 것이다.
단, 아래의 경우는 단지 시점을 앞으로 이동하는 것에 불과하기 때문에
(master+a)
Fast forward 라고 부른다.
이제 hotfix branch는 의미가 없어졌으므로
$git branch -d hotfix 로 삭제해준다.
3-6. merge
hotfix branch가 마무리되어서 지웠죠?
원래 진행하던 iss53 branch로 돌아갑니다.
master branch는 Fast forward 된 채로 둡니다.
C2를 분기로 해서 여전히 갈려져있습니다.
iss53 도 진척이 있어서 새로운 commit 을 실행했습니다.
3-7. 3 way merge
Fast forward 와는 다르게 C5는 C3가 조상이고 C4는 C2가 조상이기 때문에
master branch에 checkout 하고 merge시키면 Fast forward가 아니라 3 way merge가 됩니다.
Git이 자동으로 공통 조상을 찾아서
공통조상 branch / checkout 한 branch / merge 할 branch
위 3 way branch merge를 한 후
아예 새로운 commit 정보를 만든다.
그리고 checkout 되어있던 branch가 새로운 merge commit 을 가리키도록 한다.
이제는 iss53 branch 또한 필요없어졌으므로
$git branch -d iss53 해준다.
'Tools' 카테고리의 다른 글
[Git, Android] Main 브랜치로 시작하기(리젝 방지) (0) | 2022.04.03 |
---|---|
[Firebase] Firestore(NoSQL) 설계 (0) | 2021.08.22 |
[Git] revert / reset (0) | 2021.01.13 |
[Git] 초기설정 후 github 연동 및 branch 세팅(Android) (0) | 2021.01.09 |
[Git] git 설치 및 설치 직후 환경 설정(windows/Android) (0) | 2021.01.09 |