2022. 4. 7. 10:24ㆍ강의 내용 정리/오픈소스SW개발
Git Branch
소프트웨어의 기능을 가지치면서 개발하기 위해 사용한다. 즉, 독립적인 개발을 위해 사용한다.
1. Git의 주요요소
- Snapshot: Commit을 통한 변경 사항
- Tag와 Branch: 특정한 commit을 가리킴
1) SnapShot
- Commit을 할 때 작성한 변경 사항을 저장한다.
- 내부적으로 트리 형태로 저장되고 blob이라는 형태로 관리된다.
- 누가 저장했고, commit할 때 남긴 메세지도 저장한다.
- Commit은 부모 자식관계를 가지지고 있어, 이전 Commit을 가리킨다.
- 최초 Commit을 제외한 나머지는 모두 부모를 가리킨다.
2) Branch
- 레포지터리 생성 시 디폴트 Branch가 생성됨(master)
- git hub에서는 main으로 디폴트 Branch를 가지는 것을 기본으로 가지고 있다.
- 독립적인 개발을 할 때 독립적인 branch를 만들어 작업한다.
- 고객들의 요구사항이 다를 때도 각각의 기능에 대해 branch를 만들어서 개발할 수 있다.
- 실험적인 기능을 개발할 때도 사용하기도 한다.
- 비선형 개발이 가능하다는 장점이 있다. (선형 개발을 하면 서로 개발 중인 것들끼리 영향을 미칠 수 있음)
3) HEAD
- 현재 작업 중인 branch를 가리키는 것이다.
예제에서는 f30ab가 현재 워킹디렉토리에서 작업 중
2. Git branch 순서
1) Git branch 순서
- C는 commit을 의미함
- master라는 branch는 C1이라는 커밋을 가리킴
- HEAD는 master라는 branch를 가리킴
- git brabch experiment라는 명령어로 experiment라는 branch를 만듦
- git branch를 통해 현재 디렉토리의 모든 branch와 사용중인 branch(*)가 나옴
- git checkout(또는 switch) experiment라는 명령어로 experiment로 사용 중인 branch를 바꿈
- C2라는 commit이 생기고 experiment가 C2를 가리킴
- 현재 사용중인 branch도 commit을 하는 것에 맞춰 이동함
- experiment라는 branch가 C3를 가리킴
- 작업했던 branch를 master로 바꾸기 때문에 작업한 내용이 C1으로 바뀜
- 현재 작업중인 branch가 master이기에 C1에서 C4가 만들어지고 master는 이를 가리킴
- C4는 C1을 가리킴
- 현재 작업 중인 branch를 experiment로 바꾸고 파일 수정, add, commit을 진행함
- 이에 따라 C5가 생성되고 experiment는 이를 가리킴
- C5는 C3 commit을 가리킴
- Merge: 두개의 branch를 합친다.
- 합친 결과를 저장하고 싶은 branch로 체크아웃을 한 뒤, 합치고 싶은 branch를 지정하면 작업한 내역들이 사용한 branch로 합쳐지고 C6라는 commit이 생김
- C7과 C6를 합쳐서 새로운 commit을 생성함
2) Git merge 사용 시 유의 사항
Fast-forward merge
- C2는 C1에서 수정해서 만들었기 때문에 부모 자식관계인 경우에는 merge를 할 때 새로운 commit을 만들지 않는다.
- 따라서 아래와 같이 동작한다.
- 위의 경우를 Fast-forward merge라고 하고 master가 C2를 가리킴
3) Git branch Conflicts
충돌이 발생하면 commit 중이되기에 다른 작업을 진행할 수 없기에 왜 충돌이 발생하는지와 해결 방법을 알아야한다.
(1) 충돌은 다음과 같은 상황에서 발생한다.
i) 같은 라인에서 같은 부분을 수정해 충돌이 발생한 경우
ii) 한 파일에는 없지만 다른 파일에는 수정된 경우
iii) Git이 자동적으로 수정할 수 없는 경우
(2) 충돌 해결 방법
i) 충돌이 발생할 때는 직접 파일을 수정해주고 다시 merge를 진행하는 방법이 있다.
ii) 해결할 수 없는 문제인 경우에는 git merge --abort라고 작성해서 commit 중인 것을 취소할 수 있다.
3. Remote Repository
1) Remote Repository와 관련된 개념
(1) workspace
- 워킹 디렉토리
(2) index
- stage area
(3) clone
- remote repository에 저장되어있는 내용을 모두 복제한다.
(4) push
- tracking branch로 지정되어있으면 upstream branch에 push하여 remote repository로 전송되고 이를 반영한다.
(5) fetch
- remote repository로부터 commit을 받는다. 따라서 local에 영향을 미치는 것은 없다.
(6) pull
- 특정한 디렉터리를 지칭하여 가져오고 remote repository에 저장하는 역할로 git fetch와 git merge와 동일한 작업을 한다. 이는 remote와 local repository에 있는 내용을 모두 merge한다.
2) remote branch
- Remote Repository가 가지고 있는 branch
- 서로 작업한 내용을 push할 때 각각 원하는 branch에 저장해야한다.
(1) remote branch 과정
- remote repository에 저장되어있는 것을 그대로 local repository에 저장함
- 이때 local repository에 있는 master branch와 구분해주기 위해 origin/master라는 이름으로 저장됨
- 이때는 [remote repository의 별칭]/[branch]의 이름으로 branch가 지정됨
- origin은 remote repository의 별칭을 정해주지 않았을 때 사용
- origin/master는 별도의 동작을 하지 않았기에 clone을 했을 당시의 commit을 가리킴
- local repository에서는 따로 작업을 진행함
- origin/master branch는 upstream branch을 의미한다.
- master branch는 tracking branch을 의미한다.
2) tracking branch
- local branch로부터 remote branch를 추적하는 것을 의미한다.
- local branch 중에 특정 Remote Repository에 있는 branch를 바꿀 수 있는 것을 tracking branch라고 한다.
- Remote Repository에 있는 branch로 Local Repository의 branch를 바꿀 수 있는 것을 upstream branch라고 한다.
- 명시적으로 코드를 작성해 remote branch를 생성할 수 있음
'강의 내용 정리 > 오픈소스SW개발' 카테고리의 다른 글
오픈소스 SW개발 (6) NodeJS (0) | 2022.04.23 |
---|---|
오픈소스 SW개발 (5), GitHub (0) | 2022.04.14 |
오픈소스SW개발 (4), Git Advanced (0) | 2022.04.11 |
오픈소스 SW개발 (2) Git basic (0) | 2022.03.18 |
오픈소스 SW개발 (1), Open Source Software (0) | 2022.03.11 |