최근 에이 주제에 대해 블로그 를 작성했습니다.
이 기능 분기를 최신 상태로 유지하려면 어떻게해야합니까? 최신 업스트림 커밋을 병합하는 것은 쉽지만 업스트림으로 푸시 될 때 인식 할 수 없기 때문에 병합 커밋을 생성하지 않으려 고합니다. 그들은 새로운 부모를 얻습니다). 이는 병합 된 커밋이 개인 GitHub 기능 브랜치에 해당 업데이트를 푸시 할 때 GitHub 풀 요청에 반영되기 때문에 특히 중요합니다 (풀 요청을 발행 한 후에 수행하더라도).
이것이 병합 대신 리베이스가 필요한 이유입니다.
git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel
rebase 옵션과 git에 대한 rebase 명령은 트리를 깨끗하게 유지하고 병합 커밋을 방지합니다. 그러나 그것들은 리베이스되고 있고 현재 원격 github repo 브랜치에있는 원래 해시와는 다른 새로운 커밋 해시가있는 첫 번째 커밋 (첫 번째 풀 요청을 발행 한)입니다. .
이제 이러한 업데이트를 개인 GitHub 기능 브랜치로 푸시하는 것은 여기서 실패합니다. 두 브랜치가 다르기 때문입니다. 로컬 브랜치 트리와 원격 브랜치 트리는 서로 다른 커밋 해시로 인해 "동기화되지 않았습니다". Git은 먼저 git pull --rebase
, 그런 다음 다시 푸시 하라고 알려 주지만 히스토리가 다시 작성되었으므로 이것은 간단한 빨리 감기가 아닙니다. 하지마!
여기서 문제는 처음으로 변경된 커밋을 원래 그대로 가져 와서 로컬 브랜치 위에 병합된다는 것입니다. 동기화되지 않은 상태로 인해이 끌어 오기가 제대로 적용되지 않습니다. 커밋이 두 번 나타나는 깨진 기록을 얻을 수 있습니다. 이 모든 것을 GitHub 기능 브랜치로 푸시하면 이러한 변경 사항이 원래 풀 요청에 반영되어 매우보기 흉해집니다.
AFAIK, 실제로 이것에 대한 완전히 깨끗한 해결책은 없습니다. 내가 찾은 가장 좋은 해결책은 로컬 브랜치를 GitHub 브랜치로 강제 푸시하는 것입니다 (실제로는 비 빨리 감기 업데이트를 강제 실행).
git-push (1)에 따라 :
Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.
따라서 당기지 말고 다음과 같이 강제로 누르십시오.
git push svg +user-non-unique
또는:
git push svg user-non-unique --force
이것은 실제로 로컬 브랜치의 모든 것을 원격 브랜치로 덮어 씁니다. 원격 스트림에있는 (그리고 실패를 일으킨) 커밋은 그대로 남아 있지만 매달린 커밋이되어 결국 git-gc (1)에 의해 삭제됩니다. 별거 아니야.
내가 말했듯이 이것은 AFAICS가 가장 깨끗한 솔루션입니다. 이것의 단점은 PR이 최신 커밋으로 업데이트되고 나중에 날짜가 표시되고 PR의 댓글 기록에서 동기화되지 않을 수 있다는 것입니다. 큰 문제는 아니지만 혼란 스러울 수 있습니다.