나는 다음과 같이 새로운 지점을 만듭니다 master
.
git checkout -b testbranch
나는 그것에 20 커밋을합니다.
이제 20 개의 커밋을 스쿼시하고 싶습니다. 나는 그걸로 그렇게한다 :
git rebase -i HEAD~20
커밋이 몇 개인 지 모르면 어떻게해야합니까? 다음과 같은 작업을 수행하는 방법이 있습니까?
git rebase -i all on this branch
나는 다음과 같이 새로운 지점을 만듭니다 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에 의존하지 않기 때문에 별칭을 사용할 수도 있습니다 .
YourBranch
현재 위치를 커밋하기 위해 체크 아웃하는 것이 좋습니다. YourBranch
당신이 할 때 이것은 그대로 유지됩니다reset
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
현재 사용중인 지점을 자동으로 사용할 수 있습니다 . 그리고 명령을 사용하면 분기 이름에 의존하지 않으므로 별칭을 사용할 수도 있습니다.
git push --force
(및 해당 지점에서 여러 사람이 작업중인 경우 동료에게 경고)
모든 커밋을 하나의 커밋으로 스쿼시하려는 지점을 체크 아웃하십시오. 그것의 호출을 말해 보자.feature_branch
.
git checkout feature_branch
origin/feature_branch
현지 master
지점 으로 소프트 재설정을 수행하십시오 (필요에 따라 출발지 / 마스터로 재설정 할 수도 있음). 이렇게하면 추가 커밋이 모두 재설정됩니다.feature_branch
되지만 파일 변경 사항은 로컬로 변경하지 않습니다.
git reset --soft master
git repo 디렉토리의 모든 변경 사항을 새로 만들 커밋에 추가하십시오. 그리고 메시지로 같은 것을 커밋하십시오.
git add -A && git commit -m "commit message goes here"
-f
플래그 없이 원격 지사로 푸시 할 수 있습니다 .
당신이하고있는 일은 꽤 오류가 발생하기 쉽습니다. 그냥 해:
git rebase -i master
분기의 커밋 만 현재 최신 마스터에 자동으로 리베이스합니다.
commit -am "the whole thing!"
reset origin/master
메소드가 마스터에서 직접 커밋을하는 것과 동일하기 때문에 실제로 나쁜 것이라고 생각합니다. '병합 지점'이력, 풀 요청 옵션이 없습니다. @WaZaA의 대답은 내가 생각하는 정상적인 자식 워크 플로우를 유지하는 데 훨씬 더 도움이됩니다.
이를 수행하는 또 다른 간단한 방법은 원점 분기로 이동하여을 수행하는 것 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
이것은 마스터가 기본 분기라고 가정합니다.
이전에 많은 답변에서 언급했듯이 Git 재설정은 원하는 것을 달성하는 가장 쉽고 간단한 방법입니다. 다음 워크 플로에서 사용합니다.
(개발 지점)
git fetch
git merge origin/master #so development branch has all current changes from master
git reset origin/master #will show all changes from development branch to master as unstaged
git gui # do a final review, stage all changes you really want
git commit # all changes in a single commit
git branch -f master #update local master branch
git push origin master #push it
이 모든 git reset, hard, soft 및 여기에 언급 된 모든 것이 단계를 올바르게 수행하고 일종의 지니를 수행하면 아마도 작동하지 않을 것입니다 (나에게는 적합하지 않음).
평균 Joe smo 인 경우 다음을 시도하십시오.
git merge --squash를 사용하는 방법?
내 목숨을 구하고 스쿼시로가는 길을 알게되었으므로 이것을 4 번이나 사용했습니다. 간단하고 깨끗하며 기본적으로 1 개의 comamnd. 한마디로 :
브랜치에 있다면 개발에서 "my_new_feature"라고 부르고 풀 요청에 35 개의 커밋 (또는 많은 수)이 있고 1을 원합니다.
A. 브랜치가 최신인지 확인하십시오. "my_new_feature"와의 충돌을 개발, 최신 화 및 병합 및 해결하십시오
(이 단계는 항상 가능한 한 빨리 수행해야합니다)
B. 새로운 분기로 최신 개발 및 분기를 가져와 "my_new_feature_squashed"
C. 마법이 여기 있습니다.
당신은 "my_new_feature"에서 "my_new_feature_squashed"로 작업을하고 싶다.
그렇게하라.
git merge --squash my_new_feature
모든 변경 사항은 이제 새로운 지점에있을 것입니다. 자유롭게 테스트 한 다음 해당 지점의 단일 커밋, 푸시, 새로운 PR을 수행하고 다음 날 반복을 기다리십시오.
코딩을 좋아하지 않습니까? :)
이 작업을 위해 특별히 만든 도구를 사용할 수 있습니다.
https://github.com/sheerun/git-squash
기본적으로 전화 git squash master
를해야하고 끝났습니다
git rebase -i 58333012713fc168bd70ad00d191b3bdc601fa2d
commitnumber가 마지막 어디에 숙박을 커밋 느릅 나무 대화 형 REBASE을 할 것입니다 변경