2014-12-29 4 views
11

새 코드를 작성하는 동안 많은 변경 사항을 추적하기 위해 커밋을 많이 만듭니다. 그러나 우리 회사는 각 기능을 단일 커밋으로 처리하는 것을 선호합니다. 그래서 해결책은 내 전체 브랜치를 단일 커밋으로 스쿼시하는 것입니다.전체 스쿼시 전체 스쿼시 - 한 줄 스쿼시 명령

git rebase --interactive을 사용하지 않고 전체 분기를 스쿼시 한 ​​다음 모든 커밋에 대해 picksquash으로 변경하는 방법은 무엇입니까?

+4

어쩌면'git merge --squash'를 사용하여 손에 있기 전에 전체 지점을 스쿼시하지 않아도 될까요? – twalberg

+0

는 @twalberg 답변 – jthill

+1

가'자식 --squash' 당신이 Github에서이 일을 할 수 @meagar 꽤 일반적인 경우 – meagar

답변

1

을 편집 자식 구성 파일 ~/.gitconfig

[alias] 
    squash = "!f(){ CUR=`git rev-parse HEAD` && git reset --soft ${1} && git commit -m \"$(git log --format=%B ${1}..${CUR})\"; };f" 

이 별명은 현재 HEAD 해시를 저지 얻을 수 별칭 섹션에 다음을 추가가, 다시로 재설정 지정한 커밋, 새로운이 모두 보존 커밋 생성 커밋 메시지.

사용법 :

git squash <refspec> 

refspec이 HEAD^HEAD~3

2

당신이 분기를 시작하기 전에 바로 커밋의 해시를 찾아 유효한 같은 커밋 해시, 지점 이름, 태그 이름으로 참조 커밋 될 수 있습니다 그것을 클립 보드에 복사하십시오. 그런 다음 해당 해시로 재설정하십시오.

$ git reset [hash] 

그런 다음 변경 사항을 단일 메시지에 추가하고 다시 적용하십시오.

$ git add -A 
$ git commit -m 'EVERYTHING SQUASHED' 
+1

, 당신이 있기 때문에, ('자식이'--soft 를 재설정) 명시 적으로'--soft' 플래그를 사용할 필요가 힘내는 기본적으로 혼합 리셋을한다. – Jubobs

+0

기본 혼합 재설정은 원하는 스쿼시를 달성합니다. – onlythefinestwilldo

+3

네,하지만 다음과 같이 작성하십시오 : * 해당 해시로 소프트 리셋 *; 그건 잘못된 것입니다. – Jubobs

11

필자가 선호하는 방법은 두 줄짜리 (아래 1 단계 및 4 단계 제외)입니다. 이점은 커밋 ID를 알거나 레코드 할 필요가 없기 때문에 모든 단계를 수행하기위한 간단한 별칭을 작성할 수 있으며 실제로 전체 분기를 origin//master에 이동하면 master 로의 실제 병합을 수행 할 수 있습니다. 빨리 감기하고 어떤 갈등도있을 수 없습니다.

첫째, 내 가정 :

  • 당신은 분기에 최선을 다하고은 my-feature-branch을했다. 이 지점은 여러 커밋에 의해 master에서 분기되었습니다. 이것은 체크 아웃 된 브랜치입니다.
  • 지역 master 트랙 원격 지사 origin/master
  • 당신은 (원산지/마스터의 현재 상태의 ontop을 하나의 커밋으로 날짜가 될 수있는, master 지역되지를 my-feature-branch에서 커밋의 모든 스쿼시 할 다음과 같이) 변경의
  • 모두 최선을 다하고 있습니다, 당신은 (그들이) git reset --hard 동안 손실됩니다

내 처리가 더 unstaged 변경 사항이 없습니다 :

  1. 그래서 origin/master가 최신, 가져 오기 :

    $ git fetch 
    
  2. origin/master

    $ git reset --mixed origin/master 
    
  3. 병합에 가리 키도록 재설정하여 해당 지역의 지점에있는 모든 커밋을 버리고 기존의 모든 변경 지점의 이전 주에서 색인으로

    $ git merge --squash [email protected]{1} 
    
  4. 변경 사항을 커밋 - 힘내는 숙청의 모든 커밋 메시지를 포함하는 커밋 메시지와 함께 편집기를 미리 채 웁니다 범

내가 언급 간단한 별칭은 다음과 같습니다 아마

alias squash="git fetch; git reset --mixed origin/master; git merge --squash [email protected]{1}" 
4

가장 좋은 방법은 병합시 git merge --squash을 사용하는 것입니다. 그 결과, 커밋 Z에서 특정 기능이 변경되었다는 생각을 가지기 때문에 문제가 발생하기 쉬운 지사를 떠날 것입니다. 특정 커밋을 살펴보면 모든 커밋을 볼 수 있습니다. 여러 파일에 대한 모든 변경 내용 - 개발 커밋 결과가 누락 된 단일 커밋을 보면 "다른 파일에서이 다른 하나를 변경해야했습니다. , 너무 ... ". 전체 경로를 사용할 수있을 때 git bisect을 사용하면 이익을 얻을 수 있습니다. "이 커다란 커밋이 무언가를 망쳤습니다."

git merge --squash의 결과는 분기에서 누적 된 변경 사항을 포함하는 "병합"중인 분기에 대한 단일 커밋이지만 원래 분기 만 남겨 둡니다.

0

나는이 질문에 대한 정답이라고 생각하지 않습니다.

는하지만 일반적으로 다음 명령을 사용하여 원격 상류 마스터에 끌어 오기 요청을하기 전에 내 지점 스쿼시 :

git rebase -i master 

그러나 당신은 여전히 ​​선택하고 스쿼시 할 선택해야합니다.