git - 병합 시 특정 커밋 건너뛰기
저는 지금 Git를 1년 정도 사용하고 있고 그것이 환상적이라고 생각하지만, 저는 이제 막 두 번째 버전의 프로젝트를 시작했고 그것을 위한 새로운 지점을 시작했습니다.저는 앞으로 일을 처리하는 최선의 방법에 대해 약간 고민하고 있습니다.
master10경우)과경우)이라는 두 . master10(v1의 경우)과 master20(v2의 경우)의 분기입니다.저는 branch master10의 v1에서 버그 수정을 하고 master20의 새로운 것을 개발하고 있습니다.할하고 버을체때 master20크아v2에병다니를 해서 합니다.git merge master10
지금까지는 좋습니다.
그러나 이제 v1에서 v2에서 원하지 않는 변경 사항을 변경했지만 다른 버그 수정 사항을 계속 병합하고 싶습니다.Git에게 특정 커밋(또는 커밋 범위)을 건너뛰라고 어떻게 말하나, 앞으로는 다른 버그 수정을 병합하고 싶습니다.
내 생각에는 말이지…git rebase
제가 필요로 하는 것일 수도 있지만, 의사를 읽고 제 머리는 거의 폭발할 뻔했습니다.
제가 원하는 것은 "git sync" 명령어와 같은 것으로, Git에게 두 개의 분기가 현재 동기화되어 있고 앞으로는 이 동기화 지점의 커밋만 병합하도록 알려줍니다.
도움을 주시면 감사하겠습니다.
예를 들어, 분기 "maint"의 모든 커밋을 "master"로 병합하지 않으려면 이 작업을 수행할 수 있습니다.위에서 언급했듯이 일반적인 사용 사례는 분기의 모든 것을 병합하는 것입니다. 하지만 때때로 다시 통합해서는 안 되는 릴리스 버전으로 변경하는 경우가 발생합니다(아마도 해당 코드가 이미 마스터에서 대체되었을 수 있습니다). 그렇다면 어떻게 표현해야 할까요?자, 이제...
따라서 maintain에는 5가지 변경사항이 적용되었으며, 그 중 하나(maint~3)는 마스터에 다시 병합되지 않습니다. 다른 변경사항도 모두 적용되어야 합니다.이를 3단계로 나누어 수행합니다. 실제로 그 이전의 모든 것을 병합하고, git에게 maint~3이 병합되지 않은 경우에도 병합으로 표시하도록 지시한 다음, 나머지를 병합합니다.마법은 다음과 같습니다.
bash <master>$ git merge maint~4
bash <master>$ git merge -s ours maint~3
bash <master>$ git merge maint
첫 번째 명령은 문제가 되는 유지관리를 마스터에 커밋하기 전에 모든 항목을 병합합니다.기본 병합 로그 메시지는 "분기 'maint'(초기 부분)를 병합하는 것"을 설명합니다.
두 번째 명령은 문제가 되는 main~3 커밋을 병합하지만 "-sour" 옵션은 Git에 특별한 "합병 전략"을 사용하도록 지시합니다. 이는 병합하는 트리를 유지하고 병합하는 커밋을 완전히 무시함으로써 실제로 작동합니다.그러나 여전히 HEAD와 maint~3을 부모로 하여 새로운 병합 커밋을 수행하므로 이제 수정 그래프에서 maint~3이 병합된다고 표시됩니다.은 아마 하여 -m을 사용하고 입니다.git merge
또한, 그 main~3 커밋이 실제로 무시되고 있다는 것을 설명하는 것!
마지막 명령은 유지보수의 나머지 부분(유지보수 ~2..)만 병합합니다.maint)를 마스터로 변환하여 다시 동기화할 수 있습니다.
IMHO는 모든 것을 병합한 다음 gitrevert(commit_you_dont_want)를 사용하여 제거하는 것이 가장 논리적입니다.
예:
git merge master
git revert 12345678
"무시" 커밋이 여러 개 있거나 되돌리기 메시지를 편집하려는 경우:
git merge master
git revert -n 123456
git revert -n abcdef
git commit -m "... Except commits 123456 and abcdef"
그러면 기록이 다음과 같이 표시될 수 있습니다.
| ... Except 123456 and abcdef
|\ Merge branch 'master' into 'your_branch'
이러한 "무시" 커밋만 관련된 충돌이 있는 경우 다음을 사용할 수 있습니다.
git merge master -X ours
그래서 당신의 버전은 다른 버전보다 더 오래 지속될 것입니다.오류 메시지가 없더라도 이러한 원하지 않는 커밋은 충돌하지 않은 다른 변경사항이 있을 수 있고 사용자는 이 변경사항을 원하지 않을 수 있기 때문에 "반환"할 수 있습니다.
무시할 커밋뿐만 아니라 충돌이 있는 경우 수동으로 해결해야 하며, 되돌리는 동안 다시 해결해야 할 수도 있습니다.
범죄에는 조상이 포함됩니다.이전 커밋을 병합하지 않으면 커밋을 병합할 수 없습니다.
물론 체리를 딸 수도 있습니다.브랜치가 유지 보수 모드에 있을 때는 이를 수행하는 것이 좋습니다.
'git cherry-pick' https://git-scm.com/docs/git-cherry-pick 의 전형적인 사례처럼 들립니다. 그것은 정확히 소리나는 대로 합니다.
@araqnid에 의해 설명된 과정을 기본적으로 포장하는 제 프로젝트에 대한 일종의 광고입니다.
이것은 다음과 같은 GIT 흐름을 도입하는 일종의 도우미입니다.
- 유지 관리 지점에서 개발/마스터 지점으로 병합 보류 중인 경우 매일/주별 알림이 있습니다.
- 지점 유지관리자는 상태를 확인하고 모든 커밋이 필요한지 여부를 스스로 결정하여 일부 커밋을 차단하거나 개발자에게 자체 차단을 요청합니다.마지막으로 유지관리 분기가 업스트림에 병합됩니다.
프로젝트 페이지의 인용문:
워크플로우에 따라 마스터 분기와 함께 유지보수 또는 고객별 분기를 가질 수 있습니다.이러한 분기를 LTS 분기라고도 합니다.
종종 핫픽스는 버그가 보고된 분기로 이동한 다음 커밋이 다시 마스터 분기로 병합됩니다.
일반적으로 모든 분기가 마스터와 완벽하게 동기화됩니다. 즉, 특정 분기와 마스터 사이의 명확한 델타를 확인하여 마스터에 모든 기능과 버그 수정이 포함되어 있는지 여부를 파악하려고 합니다.
그러나 특정 커밋은 고객별로 다르며 다른 사용자가 볼 수 없기 때문에 이 커밋을 원하지 않을 수도 있습니다.또는 마스터 브랜치가 문제를 해결하기 위해 완전히 다른 접근 방식이 필요할 정도로 분산되어 있거나, 더 나은 것은 문제가 더 이상 존재하지 않는다는 것입니다.
또한 마스터에서 유지관리 지점으로 체리픽을 선택하는 경우 결과 커밋은 마스터에서 차단됩니다.
깃체리 픽을 사용할 수 있습니다.
git cherry-pick $(git merge-base HEAD origin/branch)..$(git rev-parse <offending-commit-hash>^)
git cherry-pick <offending-commit-hash>..$(git rev-parse origin/branch)
현재의 마지막 공통 커밋에서 모든 커밋을 선택합니다.HEAD
그리고.origin/branch
무시되도록 커밋할 때까지(참고)^
체리픽에게 그 약속의 부모에게 멈추라고 말하는 것).
두 번째 명령은 모든 것을 선택합니다.<offending-commit-hash>
나머지와 함께origin/branch
.
다른 패치를 병합하기 위해 오버 커밋을 건너뛰어야 하는 경우에도 일부 수정 작업이 필요할 수 있습니다(git이 체리 픽을 중지하고 충돌을 해결하도록 알려줍니다).
master10에서 원하는 변경사항에 대한 세 번째 분기를 작성하지만 master20에서는 작성하지 않습니다.항상 master10을 가장 안정적인 분기인 "master"로 생각하십시오.다른 모든 분기가 항상 동기화되도록 유지할 분기입니다.
보다는revert
또는cherry-pick
이 경우에는 건너뛰는 변경사항이 이전 변경사항보다 더 오래된 것으로 간주하기 위해 Git을 받아야 합니다.
그래서:
- 건너뛸 커밋 앞의 마지막 커밋을 병합합니다.물론 이렇게 하면 이전의 모든 커밋이 병합됩니다.
git merge ccc
- 건너뛸 커밋을 병합합니다.
git merge fff --no-commit
- 모든 병합을 준비하고, 모든 변경 사항을 준비하고, 모든 변경 사항을 취소합니다. (아마도 이것을 위한 완전한 명령이 있을 것입니다. 하지만 저는 UI에서 이 부분을 할 것입니다. 어떻게든.)
- 빈 병합을 완료합니다.
git merge --continue
- 건너뛸 커밋 뒤에 커밋을 병합합니다.
git merge source-branch-head
4단계 이후 Git는 이미 처리했기 때문에(자신의 버전을 유지하기로 선택함으로써) 해당 약속보다 더 최근의 분기를 고려합니다.
언급URL : https://stackoverflow.com/questions/727994/git-skipping-specific-commits-when-merging
'programing' 카테고리의 다른 글
앱을 Spring Boot로 마이그레이션한 후 Spring Data Rest를 사용하는 동안 @Id의 엔티티 속성이 더 이상 JSON으로 마샬링되지 않음을 확인했습니다. (0) | 2023.07.03 |
---|---|
Axios 응답 Vuex에서 작업을 호출하는 방법은 무엇입니까? (0) | 2023.07.03 |
C 스타일 배열에서 std:: 벡터를 초기화하는 방법은 무엇입니까? (0) | 2023.07.03 |
캐럿(^) 연산자는 무엇을 합니까? (0) | 2023.06.28 |
서브스크립션 배열 대신 SubSink를 사용하는 이유 (0) | 2023.06.28 |