git cherry-pick은“… 38c74d는 병합되었지만 -m 옵션은 제공되지 않았습니다”라고 말합니다.
마스터 브랜치에서 약간의 변경을했으며 그 업스트림을 가져오고 싶습니다. 그러나 다음 커밋을 선택하면 fd9f578에 붙어있어 git이 말합니다.
$ git cherry-pick fd9f578
fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given.
자식은 나에게 무엇을 말하려고 노력하고 여기에 사용하는 것이 체리 피킹입니까? 마스터 브랜치에는 업스트림 브랜치에서 수정 된 파일에 대한 변경 사항이 포함되므로 병합 충돌이 발생하지만 곧바로 정리하기에는 나쁘지 않습니다. 어디에서 어떤 변경이 필요한지 알고 있습니다.
이것들은 내가 업스트림으로 가져오고 싶은 커밋입니다.
e7d4cff added some comments...
23e6d2a moved static strings...
44cc65a incorporated test ...
40b83d5 whoops delete whitspace...
24f8a50 implemented global.c...
43651c3 cleaned up ...
068b2fe cleaned up version.c ...
fd9f578 Merge branch 'master' of ssh://extgit/git/sessions_common
4172caa cleaned up comments in sessions.c ...
체리 픽이 작동하는 방식은 변경 세트가 나타내는 차이 (해당 지점의 작업 트리와 부모의 작업 트리의 차이)를 가져와 현재 분기에 적용하는 것입니다.
따라서 커밋에 둘 이상의 부모가있는 경우 두 개 이상의 차이점을 나타냅니다. 어느 하나를 적용해야합니까?
당신은 체리 선택을 시도하고 fd9f578
있는데, 이것은 두 부모와의 합병이었습니다. 따라서 -m
옵션 을 사용하여 cherry-pick 명령에 diff를 계산할 명령을 지정해야합니다 . 예를 들어 git cherry-pick -m 1 fd9f578
부모 1을 기본으로 사용합니다.
특정 상황에 대해 확실히 말할 수는 없지만 git merge
대신 대신 사용 하는 git cherry-pick
것이 좋습니다. 병합 커밋을 선택하면 해당 커밋 으로 지정하지 않은 부모의 모든 변경 사항이 축소 됩니다 . 당신은 그들의 모든 역사를 잃어 버리고 그들의 모든 차이점을 함께 흠집을 내십시오. 당신의 전화.-m
@Borealid의 대답은 맞지만 브랜치의 정확한 병합 기록을 보존하는 데 신경 쓰지 않고 선형 버전을 체리 선택하려고한다고 가정하십시오. 쉽고 안전한 방법은 다음과 같습니다.
시작 상태 : 브랜치 X
에 있고 커밋을 체리 픽 선택하려고합니다 Y..Z
.
git checkout -b tempZ Z
git rebase Y
git checkout -b newX X
git cherry-pick Y..tempZ
- (선택 과목)
git branch -D tempZ
이 작업은를 tempZ
기반으로 분기를 작성 Z
하지만 Y
이후 선형화 된 히스토리를 사용하여 X
호출 된 사본으로 체리 선택합니다 newX
. (돌연변이보다는 새로운 브랜치에서이 작업을 수행하는 것이 더 안전합니다 X
.) 물론 4 단계에서 일반적인 방법으로 해결해야 할 충돌이있을 수 있습니다 (그러면 cherry-pick
매우 유사하게 작동합니다 rebase
). 마지막으로 임시 tempZ
분기를 삭제합니다 .
2 단계에 "현재 분기 tempZ가 최신 상태입니다" Y..Z
라는 메시지가 표시되면 이미 선형 인 것이므로 해당 메시지를 무시하고 3 단계부터 계속하십시오.
그런 다음 newX
원하는대로했는지 검토 하고 확인하십시오.
(참고 :이 간단한 동일하지 않습니다 git rebase X
분기 Z
가 사이의 관계에 어떤 식 으로든 영향을받지 않기 때문에, X
그리고 Y
, 공통 조상 사이의 커밋이있을 수 있습니다 Y
당신이 원하는하지 않았다.)
-m
부모 번호를 의미합니다.
자식 문서에서 :
일반적으로 병합의 어느 쪽이 메인 라인으로 간주되어야하는지 모르기 때문에 병합을 체리 픽픽으로 선택할 수 없습니다. 이 옵션은 메인 라인의 부모 번호 (1부터 시작)를 지정하고 지정된 체리에 대한 체리 픽 선택이 변경을 재생할 수 있도록합니다.
예를 들어 커밋 트리가 다음과 같은 경우
- A - D - E - F - master
\ /
B - C branch one
그런 다음 git cherry-pick E
직면 한 문제가 발생합니다.
git cherry-pick E -m 1
을 사용 D-E
하는 git cherry-pick E -m 2
것을 의미하지만을 사용 하는 것을 의미 B-C-E
합니다
다음은 가능한 접근 방식의 장점 / 위험을 이상적으로 설명하는 허용 된 답변을 다시 작성한 것입니다.
당신은 두 부모와의 합병 인 fd9f578을 체리 선택하려고합니다.
병합을 선택하는 대신 가장 간단한 방법은 병합의 각 분기에서 실제로 원하는 커밋을 선택하는 것입니다.
이미 병합 했으므로 원하는 커밋이 모두 목록에있을 수 있습니다. 체리를 직접 고르면 병합 커밋을 망칠 필요가 없습니다.
설명
체리 픽이 작동하는 방식은 변경 세트가 나타내는 차이 (해당 지점의 작업 트리와 상위 트리의 작업 트리 간의 차이)를 변경하고 현재 지점에 변경 세트를 적용하는 것입니다.
커밋에 병합이있는 것처럼 커밋이 둘 이상인 경우 해당 커밋도 둘 이상의 차이를 나타냅니다. 차이가 적용되어야하는 불확실성으로 인해 오류가 발생합니다.
대안
병합을 포함하고 관련 커밋을 선택하는 것이 필요하다면 두 가지 옵션이 있습니다.
(더 복잡하고 모호한; 또한 역사를 버린다) 당신은 어느 부모를 적용해야하는지 나타낼 수 있습니다.
-m
옵션을 사용하십시오 . 예를 들어,git cherry-pick -m 1 fd9f578
병합에 나열된 첫 번째 상위를 기본으로 사용합니다.또한이 병합 커밋 벚꽃 선택할 때, 그것은 붕괴 것을 고려 모든 당신이 지정하지 않은 부모에서 변경 한
-m
것을에 하나의 커밋을 . 당신은 그들의 모든 역사를 잃어 버리고 그들의 모든 차이점을 함께 흠집을 내십시오. 당신의 전화.
git merge
대신에 사용할 수 있습니다 (단순하고 친숙하며 기록 유지)git cherry-pick
.- 에서와 마찬가지로
git merge
병합하는 브랜치에 존재하는 모든 커밋을 적용하고 git log에 개별적으로 나열하려고 시도합니다.
- 에서와 마찬가지로
하나의 커밋을 고르는데 좋은 @Daira Hopwood 방법의 단순화. 임시 지점이 필요하지 않습니다.
저자의 경우 :
- Z는 커밋을 원합니다 (fd9f578)
- Y는 그 전에 커밋
- X 현재 작업 지점
그런 다음 수행하십시오.
git checkout Z # move HEAD to wanted commit
git reset Y # have Z as changes in working tree
git stash # save Z in stash
git checkout X # return to working branch
git stash pop # apply Z to current branch
git commit -a # do commit
'development' 카테고리의 다른 글
페이지의 관련 구성 데이터가 유효하지 않으므로 요청한 페이지에 액세스 할 수 없습니다. (0) | 2020.02.16 |
---|---|
Swift에서 UIAlertView를 어떻게 만들 수 있습니까? (0) | 2020.02.16 |
전화 번호를 어떻게 표시합니까? (0) | 2020.02.16 |
PHP 메일 기능이 이메일 전송을 완료하지 않습니다 (0) | 2020.02.16 |
Confluence에서 인라인 코드를 포맷하는 방법은 무엇입니까? (0) | 2020.02.16 |