나는 다음과 같이 새로운 지점을 만듭니다 master
.
git checkout -b testbranch
나는 그것에 20 커밋을합니다.
이제 20 개의 커밋을 스쿼시하고 싶습니다. 나는 그걸로 그렇게한다 :
git rebase -i HEAD~20
커밋이 몇 개인 지 모르면 어떻게해야합니까? 다음과 같은 작업을 수행하는 방법이 있습니까?
git rebase -i all on this branch
답변
커밋을 모두 없애는 또 다른 방법은 인덱스를 마스터로 재설정하는 것입니다.
git checkout yourBranch
git reset $(git merge-base master yourBranch)
git add -A
git commit -m "one commit on yourBranch"
“yourBranch”가 어느 지점에서 왔는지 알기 때문에 완벽하지 않습니다.
참고 : Git을 사용 하면 원점을 쉽게 찾을 수 없습니다 ( 여기 에서 볼 수 있듯이 시각적 인 방법이 가장 쉽습니다 ).
편집 : 당신이 사용해야합니다 git push --force
Karlotcha Hoa 는 다음 과 같이 주석을 추가합니다 .
재설정을 위해 할 수있는 일
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
[그것]은 현재있는 지점을 자동으로 사용합니다.
그리고 그것을 사용하면 명령이 branch name에 의존하지 않기 때문에 별칭을 사용할 수도 있습니다 .
답변
모든 커밋을 하나의 커밋으로 스쿼시하려는 지점을 체크 아웃하십시오. 그것의 호출을 말해 보자.feature_branch
.
git checkout feature_branch
1 단계:
origin/feature_branch
현지 master
지점 으로 소프트 재설정을 수행하십시오 (필요에 따라 출발지 / 마스터로 재설정 할 수도 있음). 이렇게하면 추가 커밋이 모두 재설정됩니다.feature_branch
되지만 파일 변경 사항은 로컬로 변경하지 않습니다.
git reset --soft master
2 단계:
git repo 디렉토리의 모든 변경 사항을 새로 만들 커밋에 추가하십시오. 그리고 메시지로 같은 것을 커밋하십시오.
git add -A && git commit -m "commit message goes here"
답변
당신이하고있는 일은 꽤 오류가 발생하기 쉽습니다. 그냥 해:
git rebase -i master
분기의 커밋 만 현재 최신 마스터에 자동으로 리베이스합니다.
답변
이를 수행하는 또 다른 간단한 방법은 원점 분기로 이동하여을 수행하는 것 merge --squash
입니다. 이 명령은 “squashed”커밋을 수행하지 않습니다. 당신이 그것을 할 때, 당신의 지점의 모든 커밋 메시지가 수집됩니다.
$ git checkout master
$ git merge --squash yourBranch
$ git commit # all commit messages of yourBranch in one, really useful
> [status 5007e77] Squashed commit of the following: ...
답변
마스터에서 분기한다고 가정하면 항상 yourBranch
재설정 단계 를 시작할 필요가 없습니다 .
git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"
설명 :
git rev-list --count HEAD ^master
마스터에서 기능 분기를 만든 이후 커밋을 계산합니다 (f.ex). 20.git reset --soft HEAD~20
마지막 20 개의 커밋을 소프트 리셋합니다. 이렇게하면 파일에 변경 사항이 남지만 커밋은 제거됩니다.
용법 :
내 .bash_profile gisquash
에서 하나의 명령 으로이 작업을 수행 하기 위해 별칭을 추가했습니다 .
# squash all commits into one
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'
재설정하고 커밋 한 후에는 git push --force
.
힌트 :
Gitlab> = 11.0을 사용하는 경우 브랜치를 병합 할 때 스쿼시 옵션 이 있으므로 더 이상이 작업을 수행 할 필요가 없습니다 .
답변
스 태싱에 대한 몇 가지 Stackoverflow 질문과 답변을 읽은 결과, 이것은 지점의 모든 커밋을 스쿼시하기에 좋은 라이너라고 생각합니다.
git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master
이것은 마스터가 기본 분기라고 가정합니다.
답변
클릭을 선호하는 사람들을위한 솔루션 :
-
소스 트리 설치 (무료)
-
부모 커밋을 마우스 오른쪽 버튼으로 클릭하십시오 . 우리의 경우에는 마스터 브랜치입니다.
참고 사항 : 부분 커밋을 원격으로 푸시하는 경우 스쿼시 후에 강제 푸시를 사용해야합니다