Skip to content

Commit c4e03c9

Browse files
committed
docs: github rebase
1 parent a115bd7 commit c4e03c9

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

github/.DS_Store

0 Bytes
Binary file not shown.

github/rebase.md

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Git rebase란?
2+
3+
Git rebase는 두 개의 공통 Base를 가진 Branch에서 한 Branch의 Base를 다른 Branch의 최신 커밋으로 branch의 base를 옮기는 작업입니다. 용어 그대로 베이스를 다시 설정하는 작업입니다.
4+
5+
6+
7+
Git rebase의 장점
8+
1. 공유 branch의 최신 변경사항을 즉각 반영할 수 있다.
9+
git merge는 공유 branch에 대한 변경사항을 즉각 대응하기 어렵습니다.
10+
11+
12+
13+
반면에 Git rebase를 사용한다면, 동료 개발자들이 올린 commit들의 수정사항을 내가 작업하고 있는 branch에 즉각 반영할 수 있습니다.
14+
15+
즉, 공유 branch에 대한 최신 commit을 반영하면서 작업을 해야할 때 git rebase를 사용한다면 작업 branch에서 항상 최신 변경사항을 적용한 commit을 유지할 수 있습니다.
16+
17+
2. rebase는 커밋이력을 남기지 않으므로 commit History가 깔끔해진다.
18+
git merge를 사용하여 최신 이력을 가져올 경우, 복잡하고 어지러운 커밋 History가 됩니다.
19+
20+
반면, git rebase로 만들어진 History는 두, 세 줄의 깔끔하고 직관적인 History로 프로젝트를 관리 할 수 있습니다.
21+
22+
23+
24+
특히, git-flow를 사용할 때 Rebase and Merge 전략으로 깔끔한 History로 작업할 수 있습니다.
25+
26+
git-flow에서는 develop 브랜치를 생성하고 개발자들이 각각 기능별로 feature를 생성하고 개발이 완료되면 develop에 merge를 합니다.
27+
28+
위 처럼 git-flow를 적용하여 자신은 feature/b에서 작업을 하는 중이고, 동료 개발자가 feature/a에서 작업을 하고 develop에 merge를 하였다고 가정을 해 봅시다.
29+
30+
merge 했을 때의 그래프
31+
feature/b에서 작업을 모두 끝냈다거나, feature/a에서 작업한 내용들을 가져오고 싶어서 feature/b를 develop에 merge를 한다고 가정하면 위와 같은 커밋 그래프가 형성됩니다.
32+
33+
위의 commit history는 feature가 두개라서 그나마 보기에는 편할 것 같지만 feature가 10개 이상 된다면 어떨까요?
34+
35+
극단적으로 Merge만 할 경우 엄청나게 복잡한 Commit History가 생길 수 있다.. ㄷㄷ
36+
위처럼, 조금 극단적이긴 하지만 feature가 많다면 엄청 복잡한 History가 생길 가능성이 있습니다.
37+
38+
저런 그래프를 관리하면서 이전 버전에서 버그가 났을 경우 커밋을 추적할 수 있을까요?
39+
Commit History 관리도 프로젝트 관리에서 중요한 작업이라고 생각합니다.
40+
41+
그렇다면 rebase 후에 merge를 해보도록 하겠습니다.
42+
43+
$ git checkout feature/b
44+
$ git rebase develop
45+
명령어를 입력한 후에 feature 브랜치를 develop에 merge 하도록 하겠습니다.
46+
47+
rebase 후 merge 했을 때 그래프
48+
feature/b의 base를 develop의 최신 commit으로 옮겼습니다.
49+
50+
그리하여 두 줄의 Commit History로 훨씬 간결하고 보기좋은 그래프로 바뀌었습니다.
51+
52+
또한, feature/b의 커밋들에도 최신 변경사항들이 반영 된 커밋들로 존재하게 됩니다.
53+
54+
Git rebase의 단점 아닌 단점
55+
내 작업 branch의 각각 commit마다 conflict를 해결해야 한다.
56+
merge는 충돌이 발생하면 한번만 처리하면 되지만 rebase는 나의 branch의 각각의 commit마다 충돌처리를 해주어야 합니다.
57+
58+
즉, 오래전에 수정했던 커밋을 rebase 과정에서 또 다시 conflict를 해결해줘야 할 수도 있습니다.
59+
60+
그래서, 각각의 커밋마다 충돌을 해결하고 Resolve Confilct와 Continue rebase를 해주어야 하는 번거로움이 있을 수 있습니다.
61+
62+
하지만, 이것이 단점이 아닌 장점이다.
63+
오히려 회사에서 git-flow를 오래 사용하면서 느낀 결과, develop의 이전 커밋들과 내 브랜치의 커밋들을 어느 커밋에서 충돌이 난건지도 모른채로 하나의 커밋에서 충돌을 해결하는 것은 바람직한 방법은 아니라고 생각합니다.
64+
65+
오히려 feature 브랜치의 모든 커밋이 전부 정상적으로 동작하도록 각각의 커밋마다 충돌을 해결하는 것이 코드 에러를 줄이고 품질을 높이는 방법이라고 생각하기 때문에 더 좋은 방법이라고 생각하고, 회사에서도 위에 나열한 장점들 때문에 Rebase and Merge를 사용하고 있습니다.
66+
67+

spring/.DS_Store

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)