문제

나는 아직 계몽되지 않은 사람들에게 이메일을 보내고 싶은 지점에 8 개의 커밋을 받았습니다. 지금까지 내가하는 모든 일은 8 개의 패치 파일을 주거나 시작 이후 지점의 모든 커밋에 대한 패치 파일을 제공하기 시작합니다. 나는 git rebase를 사용하여 커밋을 스쿼시하기 위해 간부 활동을 사용했지만 이제 내가 시도한 모든 것은 처음부터 수백만의 패치를 제공합니다. 내가 뭘 잘못하고 있죠?

git format-patch master HEAD # yields zillions of patches, even though there's 
                             # only one commit since master
도움이 되었습니까?

해결책

다음과 같이 throwaway 브랜치 에서이 작업을 수행하는 것이 좋습니다. 커밋이 "Newlines"지점에 있고 이미 "Master"지점으로 다시 전환 한 경우 다음과 같은 트릭을 수행해야합니다.

[adam@mbp2600 example (master)]$ git checkout -b tmpsquash
Switched to a new branch "tmpsquash"

[adam@mbp2600 example (tmpsquash)]$ git merge --squash newlines
Updating 4d2de39..b6768b2
Fast forward
Squash commit -- not updating HEAD
 test.txt |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

[adam@mbp2600 example (tmpsquash)]$ git commit -a -m "My squashed commits"
[tmpsquash]: created 75b0a89: "My squashed commits"
 1 files changed, 2 insertions(+), 0 deletions(-)

[adam@mbp2600 example (tmpsquash)]$ git format-patch master
0001-My-squashed-commits.patch

도움이 되었기를 바랍니다!

다른 팁

냄비에 솔루션을 하나 더 추가하려면 : 대신 사용하는 경우 :

git format-patch master --stdout > my_new_patch.diff

그런 다음 여전히 8 개의 패치가 될 것입니다 ... 그러나 모두 단일 패치 파일에 있고 다음과 같이 적용됩니다.

git am < my_new_patch.diff

나는 항상 당신의 예에서 git diff를 사용합니다.

git diff master > patch.txt

이것은 당신의 변경이 마스터 지점에있는 경우 Adam Alexander 답변의 적응입니다. 이것은 다음을 수행합니다.

  • 우리가 원하는 지점에서 새로운 던지기 브랜치 "tmpsquash"를 만듭니다 ( "git -log"또는 Gitg와 함께 SHA 키를 찾으십시오. tmpsquash 헤드가되고 싶은 커밋을 선택하십시오. 스쿼시 커밋).
  • 마스터에서 tmpsquash로의 변경 사항을 병합합니다.
  • tmpsquash에 대한 스쿼시 변경 사항을 저지른다.
  • 스쿼시 커밋으로 패치를 만듭니다.
  • 마스터 브랜치로 돌아갑니다

laura@rune:~/example (master)$ git branch tmpsquash ba3c498878054e25afc5e22e207d62eb40ff1f38
laura@rune:~/example (master)$ git checkout tmpsquash
Switched to branch 'tmpsquash'
laura@rune:~/example (tmpsquash)$ git merge --squash master
Updating ba3c498..40386b8
Fast-forward
Squash commit -- not updating HEAD

[snip, changed files]

11 files changed, 212 insertions(+), 59 deletions(-)
laura@rune:~/example  (tmpsquash)$ git commit -a -m "My squashed commits"
[test2 6127e5c] My squashed commits
11 files changed, 212 insertions(+), 59 deletions(-)
laura@rune:~/example  (tmpsquash)$ git format-patch master
0001-My-squashed-commits.patch
laura@rune:~/example  (tmpsquash)$ git checkout master
Switched to branch 'master'
laura@rune:~/example  (master)$

이미 아시다시피, a git format-patch -8 HEAD 8 개의 패치를 줄 것입니다.

당신이 당신의 8 개의 커밋이 하나로 나타나고 싶다면, 당신의 지점의 역사를 다시 쓰는 것을 신경 쓰지 마십시오 (o-o-X-A-B-C-D-E-F-G-H), 당신은 할 수 있습니다 :

git rebase -i
// squash A, B, C, D, E ,F, G into H

또는 더 나은 해결책이 될 것입니다. 8 개의 커밋을 모두 재생하십시오 X 새 지점에서

git branch delivery X
git checkout delivery
git merge --squash master
git format-patch HEAD

그렇게하면 "배송"지점에 커밋이 하나만 있으며 마지막 8 개의 커밋을 모두 나타냅니다.

두 태그 사이의 형식 패치 :

git checkout <source-tag>
git checkout -b <tmpsquash>
git merge --squash <target-tag>
git commit -a -m "<message>"
git format-patch <source-tag>

가장 쉬운 방법은 사용하는 것입니다 git diff, 그리고 추가하십시오 git log 스쿼시 방법이 출력 될 것이라는 결합 된 커밋 메시지를 원한다면. 예를 들어, 커밋 사이에 패치를 만듭니다 abcd 그리고 1234:

git diff abcd..1234 > patch.diff
git log abcd..1234 > patchmsg.txt

그런 다음 패치를 적용 할 때 :

git apply patch.diff
git add -A
git reset patch.diff patchmsg.txt
git commit -F patchmsg.txt

잊지 마세요 --binary 논쟁 git diff 텍스트가 아닌 파일을 처리 할 때는 이미지 또는 비디오를 처리합니다.

Adam Alexander의 답변을 바탕으로 :

git checkout newlines
## must be rebased to master
git checkout -b temporary
# squash the commits
git rebase -i master
git format-patch master
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top