일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 리팩토링
- Observable
- Human interface guide
- combine
- UITextView
- 클린 코드
- SWIFT
- 애니메이션
- Refactoring
- 스위프트
- 리펙터링
- ios
- map
- Protocol
- swift documentation
- clean architecture
- uiscrollview
- rxswift
- Clean Code
- ribs
- collectionview
- Xcode
- 리펙토링
- HIG
- swiftUI
- UICollectionView
- MVVM
- RxCocoa
- uitableview
- tableView
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[git] 6. branch, reset, merge의 원리 본문
1. branch의 원리
파일 구성도
.git파일 -> refs파일 -> HEAD파일 -> 최신 커밋한 브랜치 파일 -> object(최신 커밋) -> tree, parent object
* HEAD : 현재 사용하고 있는 btanch를 가리킴
ex) 브랜치 파일 git branch [name]으로 하지 않고 생성하기
vim .git/refs/heads/exp
2. reset의 원리와 checkout
1) reset이란?
최신 커밋 시점을 변경하는 것
git reset --hard 8be853e6451aeaeb74dd708d8e121be915e46faf
// 3번 커밋을 최신 커밋으로 바꾸기
2) reset 실행 되돌리기
※ 여기서 reset을 사용해도 4번의 커밋은 실제로 제거되지 않음
: reset전에 ORIG_HEAD파일에 현재의 최신 commit 정보를 가리킨 후 reset됨
아래 명령어를 통해서 돌아갈 수 있음
// reset취소
git reset --hard ORIG_HEAD
// 명령들 확인 방법
git reflog
3) reset의 범위
* 핵심 3가지 요소
working directory : 실제로 작업을 진행하는 곳
index : git add를 했을 때 추가되는 곳
repository : commit(버전)들이 저장되는 곳
<working directory와 index내용 비교>
git diff
4) checkout
- commit id를 브랜치로 가리킬 수 있음
git checkout [commit id]
3. confilict의 원리
- 실제 협업에서 많이 발생하는 일
해결 : 3-way merge
1) confilict
(아래 코드 흐름은 f1.txt를 각 브랜치 마다 수정하면서 커밋을 하는 과정)
(master) f1.txt
function(){
return 'common';
}
<commit 1>
(exp) f1.txt
function(){
return 'exp';
}
<commit 'common -> exp'>
(master) f1.txt
function(){
return 'master';
}
<commit 'common -> master'>
* git checkout -b exp : exp라는 브랜치를 만들고, exp로 checkout
<merge할 경우 confilict 발생>
- master, exp브랜치에서 둘 다 내용을 변경했는데, 파일의 이름이 같고 같은 부분의 내용을 수정한 경우
git checkout master
git merge exp
파일 내용
vim f1.txt
2) 해결방법
- 어떤 부분인지 확인
git status
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: f1.txt
- 확인된 f1.txt파일 수정
4. 3 way merge
1첫째 행을 branch라고 하고
나머지 행을 변경된 내용이라 한다면,
* 여백 : 수정된 내용
*Base : 공통으로 갖는 코드
Me : 현재의 브랜치
Other : 다른사람의 브랜치
* Other의 브랜치를 Me로 병합하는 것
* 두 번째 줄 : other만 다른 것
세 번째 줄 : 모두 같은 내용
네 번째 줄 : 모두 바꾼 내용
다섯 번째 줄 : Me만 다른 것
? : confilict(무엇이 맞는지 모르는 경우를 의미, 단 하나만 수정될 시 수정된 것으로 결정)
2 way merge : Base를 참고하지 않고 Me와 Other를 병합하는 방식
3 way merge : Base를 참고로 하여 Me와 Other를 병합하는 방식
3 way merge가 더 좋음
'Git, CocoaPods, Xcode, Shell > Git' 카테고리의 다른 글
[Git] 8. Rebase, git flow (2) | 2020.06.11 |
---|---|
[git] 7. Tag (0) | 2020.06.10 |
[git] 5. branch, stash (0) | 2020.06.10 |
[git] 4. git의 원리 (0) | 2020.06.09 |
[git] 3. 되돌리기, 메뉴얼 활용 (0) | 2020.06.09 |