깃 git

[git] Squash 란? 스쿼시하기/ 커밋 단장하기

니블 2024. 7. 9. 16:18

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 까지 완료하면 끝