힘내 : 지점에서 모든 커밋을 스쿼시하는 방법 개의 커밋을 스쿼시하고 싶습니다.

나는 다음과 같이 새로운 지점을 만듭니다 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을 사용하는 경우 브랜치를 병합 할 때 스쿼시 옵션 이 있으므로 더 이상이 작업을 수행 할 필요가 없습니다 .
Gitlab 스 쿼싱 옵션


답변

스 태싱에 대한 몇 가지 Stackoverflow 질문과 답변을 읽은 결과, 이것은 지점의 모든 커밋을 스쿼시하기에 좋은 라이너라고 생각합니다.

git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master

이것은 마스터가 기본 분기라고 가정합니다.


답변

클릭을 선호하는 사람들을위한 솔루션 :

  1. 소스 트리 설치 (무료)

  2. 커밋이 어떻게 보이는지 확인하십시오. 아마도 당신은 이것과 비슷한 것을 가지고 있습니다.
    여기에 이미지 설명을 입력하십시오

  3. 부모 커밋을 마우스 오른쪽 버튼으로 클릭하십시오 . 우리의 경우에는 마스터 브랜치입니다.

여기에 이미지 설명을 입력하십시오

  1. 버튼을 클릭하여 이전 커밋과 스쿼시 할 수 있습니다. 이 경우에는 두 번 클릭해야합니다. 커밋 메시지를 변경할 수도 있습니다
    여기에 이미지 설명을 입력하십시오

  2. 결과는 훌륭하고 우리는 추진할 준비가되었습니다!
    여기에 이미지 설명을 입력하십시오

참고 사항 : 부분 커밋을 원격으로 푸시하는 경우 스쿼시 후에 강제 푸시를 사용해야합니다