티스토리 뷰
1. 개요
이전에 git pull과 git merge를 간단히 비교한 글을 작성했었다. 그런데 문득 브랜치의 변경점을 반영하기 위해서 내가 생각보다 git rebase 역시 자주 이용한다는 것을 알게 되었다. 이런 생각을 하니 pull, merge, rebase는 어떻게 다른 건지 갑자기 헷갈리기 시작했다. 그래서 이 세 명령어를 간단히 정리하기로 했다.
2, git merge
- 두 브랜치를 병합하는 명령어.
- 현재 체크아웃된 브랜치에 다른 브랜치의 변경 사항을 반영한다.
- 두 브랜치의 히스토리가 다를 경우, 병합 커밋(Merge commit)이 생성된다.
- 기존의 커밋 히스토리는 유지된다.
3. git pull
- git fetch + git merge인 명령어
- 원격 브랜치의 최신 변경 사항을 가져운 후(fetch), 현재 브랜치에 병합(merge)한다.
- 빠르게 원격 브랜치의 변경 사항을 로컬에 반영할 때 유용하다.
- 병합 과정에서 자동으로 병합 커밋(Merge commit)이 생성된다.
4. git rebase
- 한 브랜치의 커밋을 다른 브랜치 위에 다시 쌓는 명령어
- 현재 브랜치의 커밋을 기준 브랜치의 끝으로 이동시켜 커밋 기록을 새로 작성한다.
- 히스토리가 깔끔해진다. (직선 히스토리를 유지한다.)
- 병합 커밋이 생성되지 않으며, 커밋 히스토리가 다시 작성된다.
- 만약 이미 푸시된 커밋을 리베이스할 경우, 다른 개발자와 충돌이 발생할 수도 있다.
- 충돌이 발생할 경우, 커밋마다 충돌을 해결해야 할 수 있다.
5. 세 명령어 비교
5-1. 주요 차이점을 표로 정리
기능 | git pull | git merge | git rebase |
목적 | 원격 브랜치와 동기화 | 두 브랜치를 병합 | 브랜치 커밋을 다른 브랜치 위로 재배치 |
커밋 히스토리 | 자동으로 병합 커밋 생성 | 병합 커밋 생성 | 병합 커밋 없이 직선 히스토리 유지 |
히스토리 가독성 | 중립적 | 브랜치 간 관계를 볼 수 있다. | 직선형 히스토리로 깔끔하다. |
충돌 해결 | git merge와 동일 | 병합 충돌 해결 | 각 커밋마다 충돌 해결 필요 |
협업 시 안전성 | 안전 | 매우 안전 | 주의 필요 (푸시된 커밋의 리베이스는 자제할 필요가 있다) |
5-2. (추천) 사용 시기
- git pull
- 원격 브랜치와 빠르게 동기화가 필요할 때
- 변경 사항 확인이 필요 없거나, 간단한 작업일 때
- git merge
- 브랜치 간 작업을 병합할 때
- 히스토리 기록을 유지하고 싶을 때
- 협업 환경에서 충돌을 최소화하고 안전성을 유지하려고 할 때
- git rebase
- 직선형 히스토리가 필요한 상황일 때
- 개인 작업 브랜치를 기준 브랜치에 반영하기 전에 히스토리를 정리하고 싶을 때
- 협업 중 푸시된 브랜치에서는 사용을 자제하는 것이 좋음
5-3. 명령어 사용 예시
예를 들어, 작업 브랜치를 기준 브랜치(dev)와 동기화해야 할 때...
- git pull origin dev
- 원격 브랜치 dev와 작업 브랜치를 병합 (자동 병합 커밋 생성)
- git fetch origin dev -> git merge dev
- 병합 전 원격 브랜치 변경 내용을 검토 가능
- git diff HEAD..origin/dev
- 병합 전 원격 브랜치 변경 내용을 검토 가능
- git fetch origin dev -> git rebase dev
- 작업 브랜치 커밋을 dev 브랜치 끝으로 이동
6. 정리
- git pull, git merge, git rebase를 통해 부모 브랜치의 변경점을 자식 브랜치에 반영할 경우, 결과적으로 코드와 파일의 내용(결과물)은 동일하다.
- 하지만 커밋 히스토리의 모양과 관리 방식이 다르다.
- git merge: 히스토리를 유지하며 안전하게 병합
- 병합 커밋이 생성된다.
- 히스토리가 분기와 병합으로 나뉘어 보인다.
- 예시
- A---B---C (dev)
\ \
D---E---M (작업 브랜치)
- A---B---C (dev)
- git pull: 원격 브랜치 동기화 및 간단한 병합
- git fetch + git merge 조합이기에 병합 커밋이 생성된다.
- 히스토리는 git merge와 동일하다.
- git rebase: 히스토리를 깔끔하게 정리할 때 유용
- 작업 브랜치의 커밋을 부모 브랜치의 끝으로 재배치하여 히스토리를 직선화한다.
- 병합 커밋이 생성되지 않으며, 깔끔한 히스토리를 유지한다.
- 예시
- A---B---C---D'---E' (작업 브랜치)
- git merge: 히스토리를 유지하며 안전하게 병합
'기록' 카테고리의 다른 글
Next.js에서 redirect()를 이용할 때 주의할 점, input[disabled]의 FormData 포함 여부 (0) | 2025.02.08 |
---|---|
React 클래스형 컴포넌트에서 자주 사용되는 생명 주기 메서드 간단 기록 (0) | 2025.02.01 |
git pull과 git merge 비교 (0) | 2025.01.25 |
노마드 코더 - 캐럿마켓 클론코딩 강의 배포 전 정리 1. 무한 스크롤 (0) | 2024.12.14 |
백준 - 헌내기는 친구가 필요해 (21736번, C++) (1) | 2024.12.01 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 순열
- SQL
- 알고리즘
- 자바스크립트
- Next.js
- themoviedb
- 햄버거버튼
- C++
- aws
- 스택
- 비트마스킹
- BFS
- 타입스크립트
- 브루트포스
- react
- 동적계획법
- 카카오맵
- CSS
- NextJS
- 리액트
- 완전탐색
- 넥스트js
- 코드스테이츠
- Redux
- 백준
- async
- 프로그래머스
- 구현
- typescript
- 다이나믹프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함