Squash란 ?
스쿼시 해주세요 ~ == 커밋 단장해주세요~~
- “squash” 는 여러 커밋을 하나로 합치는 것
- git 브랜치를 병합할때 가장 자주 수행된다.
- git squash 명령은 없다.
(a) 병합하기 전에 스쿼시하기로 결정하면 기능 브랜치의 모든 개별 커밋이 단일 커밋으로 결합
- 따라서 주요 커밋 기록은 이 통합에 대한 단일 커밋만 표시
- 불필요하고 많은 개별 커밋 대신, 주 커밋 기록에 단 하나의 커밋만 나타난다.
Squash 하기
1. 3개의 커밋을 squash(combined) 하려고 한다.
제일 오래된 커밋에 합치는것만 가능하다. (452f802a)
- 제일 최근 커밋에 합치려고하면 오류가 난다. (bcbdb771)
터미널을 열고 (인텔리제이에서 터미널여는법 -> 창 맨 하단에 run,build 그쪽에 있는 Terminal 을 클릭)
git rebase -i HEAD~3
- git rebase -i HEAD~(합치고자 하는 커밋의 개수)
2. 명령어를 작성하고 enter 하면
2-1. 위에서부터 순서대로 커밋 과거순.
[452f802] 만 두고 밑에 2개의 커밋 pick → s 로 바꾼다.
pick 452f802 페이징 처리
s 2628763 답변 페이징,정렬 추가
s bcbdb77 카테고리 오류-
요런식으로
<리눅스 편집기 명령어> 를 이용해서
3. 커밋 메세지를 편집할 수 있다.
-->
커밋메세지를 정리했다.
esc -> :wq
하면
성공적으로 squash 가 됐다.
4. 원격 브랜치에 푸시하기 -> push rejected 된다.
왜 push rejected 가 되는가 ?
- 원격 브랜치의 상태
A -- B -- C -- commit1 -- commit2 -- commit3 (origin/feature)
- 로컬 브랜치의 상태
A -- B -- C -- squashed_commit1 (feature)
원격 브랜치의 커밋 히스토리와 로컬 브랜치의 커밋 히스토리가 다르기 때문에 git은 이를 병합 할 수 없다고 판단하고 푸시를 거부한다. 히스토리를 덮어쓰는 것을 방지 하기 위한 보호 장치.
해결방법
4.1 강제 푸시
git push -u origin +(branch 명)
4.2 원격 브랜치 삭제후 push
잘못하면 작업한 코드가 사라질 위험이 있음.
4.2 base 커밋에서 temp브랜치를 따서 (feature/test-temp 브랜치) 내가 한 작업 cherry pick 으로 넣기
push 까지 완료하면 끝
'깃 git' 카테고리의 다른 글
[git] Rebase란? / rebase 하기 (+소스트리) (1) | 2024.07.08 |
---|---|
[github config] 단일 저장소만 사용자이름, 이메일 다르게 (0) | 2024.05.20 |
깃 branch 개념 (0) | 2023.06.28 |