Git에는 한 지점에서 다른 지점으로 모든 변경 사항을 병합하지만 동시에 단일 커밋으로 스쿼시하는 방법이 있습니까?
나는 종종 별도의 브랜치에서 새로운 기능을 수행하며 정기적으로 커밋 / 푸시합니다-주로 백업 또는 내가 작업중 인 것을 다른 머신으로 전송합니다. 대부분의 커밋은 “Feature xxx WIP”또는 무엇인가 중복이라고 말합니다.
해당 작업이 완료되고 WIP 분기를 다시 마스터로 병합하려면 모든 중간 커밋을 삭제하고 하나의 클린 커밋을 삭제하고 싶습니다.
이 작업을 수행하는 쉬운 방법이 있습니까?
또는 분기가 시작된 시점부터 분기에 대한 모든 커밋을 축소하는 명령은 어떻습니까?
답변
다른 옵션은 git merge --squash <feature branch>
마지막으로을 수행하는 것 git commit
입니다.
에서 힘내 병합
--squash
--no-squash
진짜 병합 (병합 정보 제외) 일어난 것처럼 작업 트리와 인덱스 상태를 생산하지만, 실제로 커밋 만들거나 이동하지
HEAD
않으며, 기록은
$GIT_DIR/MERGE_HEAD
다음 원인이
git commit
명령은 머지 커밋을 만들 수 있습니다. 이를 통해 현재 분기 위에 단일 커밋을 만들 수 있으며 그 효과는 다른 분기를 병합하는 것과 동일합니다 (또는 문어의 경우 더 많음).
답변
그것을 발견! 병합 명령에는 --squash
옵션이 있습니다
git checkout master
git merge --squash WIP
이 시점에서 모든 것이 병합되고 충돌 할 수 있지만 커밋되지는 않습니다. 그래서 지금 할 수 있습니다 :
git add .
git commit -m "Merged WIP"
답변
git rebase -i master
기능 지점에서 시도하십시오 . 그런 다음 커밋을 결합하기 위해 하나의 ‘pick’을 제외하고 모두 ‘squash’로 변경할 수 있습니다. 리베이스로 스쿼시 커밋 보기
마지막으로 마스터 브랜치에서 병합을 수행 할 수 있습니다.
답변
수락 된 답변git merge --squash <feature branch>
으로 사용 하면 트릭이 제안되지만 병합 된 분기는 실제로 병합 된 것으로 표시되지 않습니다.
따라서 더 나은 해결책은 다음과 같습니다.
- 최신 마스터에서 새 브랜치를 만듭니다
- 를
<feature branch>
사용하여 위의 병합git merge --squash
- 새로 만든 브랜치를 마스터로 병합
이 위키 는 절차를 자세히 설명합니다.
답변
정확히 이것을하기 위해 내 자신의 자식 별칭을 만들었습니다. 나는 그것을 부르고있다 git freebase
! 기존의 지저분하고 복구 할 수없는 기능 분기를 가져 와서 다시 작성하여 커밋이 하나의 커밋으로 스 쿼치되고 지정한 분기 (기본적으로 마스터)에 기반한 동일한 이름의 새 분기가됩니다. 마지막에는 새로 “무료 기반”브랜치에 원하는 커밋 메시지를 사용할 수 있습니다.
.gitconfig에 다음 별명을 배치하여 설치하십시오.
[alias]
freebase = "!f() { \
TOPIC="$(git branch | grep '\\*' | cut -d ' ' -f2)"; \
NEWBASE="${1:-master}"; \
PREVSHA1="$(git rev-parse HEAD)"; \
echo "Freebaseing $TOPIC onto $NEWBASE, previous sha1 was $PREVSHA1"; \
echo "---"; \
git reset --hard "$NEWBASE"; \
git merge --squash "$PREVSHA1"; \
git commit; \
}; f"
다음을 실행하여 기능 분기에서 사용하십시오.
git freebase <new-base>
나는 이것을 몇 번만 테스트 했으므로 먼저 읽고 그것을 실행하고 있는지 확인하십시오. 작은 안전 조치로 시작 sha1을 인쇄하므로 문제가 발생하면 이전 분기를 복원 할 수 있어야합니다.
github의 내 도트 파일 저장소에서 유지 관리합니다 :
https://github.com/stevecrozz/dotfiles/blob/master/.gitconfig
답변
git merge --squash <feature branch>
“git commit”은 모든 기능 브랜치 커밋 메시지를 유지하도록 선택합니다.
커밋 병합을 줄입니다.
git merge x 번 –git reset HEAD ^ –soft git commit.
위험 요소가 삭제 된 파일이 다시 나타날 수 있습니다.
답변
“rebase”명령으로이를 수행 할 수 있습니다. 브랜치를 “main”과 “feature”라고하자 :
git checkout feature
git rebase main
rebase 명령은 “feature”에 대한 모든 커밋을 “main”과 같은 부모를 가진 하나의 커밋으로 재생합니다.
“feature”가 생성 된 이후 (또는 가장 최근의 병합 이후) “main”이 변경된 경우 git merge main
이전 에 실행할 수 있습니다 git rebase main
. 이렇게하면 병합 충돌이 발생한 경우에도 전체 기록이 유지됩니다.
리베이스 후에 브랜치를 main으로 병합하면 빨리 병합됩니다.
git checkout main
git merge feature