git format-patch를 사용하여 커밋을 하나의 패치로 압축하는 방법은 무엇입니까?
저는 아직 깨달음을 얻지 못한 몇몇 사람들에게 이메일을 보내고 싶은 지점에 8개의 커밋이 있습니다.지금까지 제가 하는 모든 작업은 처음부터 8개의 패치 파일을 제공하거나 지사의 기록에 있는 모든 커밋에 대한 패치 파일을 제공하기 시작했습니다.저는 커밋을 제거하기 위해 상호작용적인 Gitrebase를 사용했지만, 이제 제가 시도하는 모든 것은 처음부터 저에게 수백만 개의 패치를 제공합니다.내가 뭘 잘못하고 있는 거지?
git format-patch master HEAD # yields zillions of patches, even though there's
# only one commit since 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
당신이 이미 알고 있듯이, 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개의 커밋 전 커밋)의 8개 커밋을 모두 재생하십시오.
git branch delivery X
git checkout delivery
git merge --squash master
git format-patch HEAD
이렇게 하면 "전달" 분기에 하나의 커밋만 있고, 이 커밋은 최근 8개 커밋을 모두 나타냅니다.
이것은 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)$
가장 쉬운 방법은 사용하는 것입니다.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
텍스트가 아닌 파일(예: 이미지 또는 비디오)을 처리할 경우
두 태그 사이의 형식 패치:
git checkout <source-tag>
git checkout -b <tmpsquash>
git merge --squash <target-tag>
git commit -a -m "<message>"
git format-patch <source-tag>
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
언급URL : https://stackoverflow.com/questions/616556/how-do-you-squash-commits-into-one-patch-with-git-format-patch
'programing' 카테고리의 다른 글
Git 프로젝트의 모든 분기에서 'grep 검색'을 수행할 수 있습니까? (0) | 2023.07.15 |
---|---|
그렇지 않은 경우 다음 반복으로 루프 건너뛰기 R (0) | 2023.07.15 |
Excel 날짜 형식 지정 (0) | 2023.07.15 |
새 페이지로 리디렉션할 spx 페이지 (0) | 2023.07.15 |
'Microsoft' 유형에 대한 서비스가 없습니다.AsNetCore.MVC.기능 보기.'ITempDataDictionaryFactory'가 등록되었습니다. (0) | 2023.07.15 |