git cherry-pick이 작동하지 않습니다.


110

마스터에서 커밋을 선택하여 현재 프로덕션 브랜치로 가져 오려고합니다. 그러나 실행 git cherry-pick <SHA-hash>하면 다음 메시지가 나타납니다.

# On branch prod_20110801
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#   site/test-result/
 nothing added to commit but untracked files present (use "git add" to track)
 The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

    git commit --allow-empty

Otherwise, please use 'git reset'

참고 : 재설정 및 재설정 --hard HEAD ^를 시도했지만 아무것도 변경하지 않은 것 같습니다.

왜 이것이 나를 위해 작동하지 않는지 혼란 스럽습니다.

이 문제를 해결하는 방법에 대한 통찰력, 조언 또는 아이디어가 도움이 될 것입니다 ~!


실수로 잘못된 커밋을 선택하려고 할 때 이런 일이 발생했습니다. gitk를 사용할 때 가끔 발생합니다.
cst1992

답변:


141

Git은 체리 픽을 no-op으로 해결하고 있습니다. 해당 커밋에 의해 도입 된 모든 변경 사항은 현재 브랜치의 일부 커밋에 의해 도입되었습니다. (또는 어쨌든 Git이 생각하는 것입니다.) 체리 피킹중인 커밋이 적절한 병합, 리베이스 / 체리-픽 또는 단편적인 패치와 같이 어떤 식 으로든 이미 병합되지 않았는지 확인합니다. ( git show <commit-id>차이를 보려면 사용 하십시오.)


16
조언을 해주셔서 감사합니다. 체리 픽이 이미 진행된 것으로 밝혀졌고 제가해야 할 일은 github에 푸시하는 것뿐이었습니다.
제이 테일러

맞습니다. 저는 그것이 commit-id가 주어진 파일의 내용을 확인하고 있다는 것을 깨닫지 못했습니다. 로그에서 commit-id를 찾았지만 찾을 수 없었습니다. 그것은 이미 합병 된 것으로 밝혀졌습니다.
mparaz

불행하게도 이것이 문제의 유일한 이유는 아닙니다. 이전 커밋을 되 돌리는 커밋을했을 때와 똑같은 상황이 발생했습니다. 다른 브랜치에서 체리를 선택했을 때 변경 사항이 되 돌리지 않았습니다. ). 물론 그것은 내 잘못입니다. 그러나이 경우 git은 너무 똑똑해 지려고하는 대신 충돌 상태로 실패하여 사용자를 혼란스럽게 할 것으로 예상됩니다.
Artem Pisarenko

병합 커밋을 되돌리고 체리 피킹 할 커밋이 되 돌린 브랜치에있는 경우 이러한 상황이 발생할 수 있습니다.
matt

11

제 경우에는 제가 체리를 고르고 싶은 특정 커밋이 제 현재 브랜치에 병합 되지 않았다는 것이 분명했기 때문에 이것이 저를 미치게 만들었습니다.

누군가 이미 체리가 일주일 전에 커밋을 고른 것으로 밝혀졌습니다 . 변화 가 아니라 특정의 SHA 내 현재 지점에 이미 있었고, 나는 그들을 발견하지 않았다.

체리 픽을 시도중인 파일을 확인하십시오. 이미 변경 사항이있는 경우 커밋 버전이 이미 선택되었거나 다른 방식으로 추가되었습니다. 따라서 체리를 다시 선택할 필요가 없습니다.


체리 픽이 새로운 해시가 될 것이기 때문에 특정 커밋이 체리 픽에 의해 들어 왔을 때 당신의 브랜치에 결코 존재 하지 않을 것이라고 확신합니다 . 아니면 오해입니까?
msouth

@msouth 내가 원래 다른 답변에서 빼앗긴 것은 "커밋이 이미 병합되었습니다"였지만 내 지점 에 없다는 것을 알 수있었습니다 . 체리 픽이 항상 새로운 SHA라는 말이 맞습니다.
pkamb

그래, 나는 그것을 입력했을 때 "해시로 식별되는 특정 커밋"을 생각하고 있었다. 내 언어가 정확하지 않았습니다. 나는 종종 git log --graph --pretty --decorate --oneline주어진 SHA가 내 지점에 있는지 여부를 확인하기 위해 의 출력을 뒤돌아보고 있습니다. 커밋 메시지가 변경 사항을 나타냅니다. 그렇지 않은 상황이 있으며 이것이 원래이 질문으로 이어진 이유입니다. 사람의 뇌는 그러한 지름길을 만드는 경향이 있으며 때때로 돌아와서 당신을 물릴 수 있습니다.
msouth

6

또한 빈 파일 (예 :) .gitkeep을 트리에 추가하는 것은 cherry-pick에서 빈 커밋으로 간주됩니다.


제 경우에는 체리 픽 시도 전에 되돌리기 커밋 (빈 커밋 자체를 되 돌리는 것)이 있었으므로 비어있는 것이 있으면이 메시지가 나타날 것입니다.
lidkxx

3

여기에 이것이 발생할 수있는 또 다른 혼란스러운 상황이 있습니다.

자식 로그 스크린 샷

나는 분명히 아무것도 아닌 9a7b12e를 체리로 선택하려고 노력하고 있었다. 심지어 4497428이 내가 정말로 원했던 것이라고 git 로그 출력의 그 줄에 말하려고 시도했다. (내가 한 일은 커밋 메시지를 찾아서 내가 본 첫 번째 해시를 잡는 것입니다). 어쨌든, 그냥 체리를 선택하지 않도록 속일 수있는 또 다른 방법이 있다는 것을 사람들에게 알리고 싶었습니다.


10
설명없이 반대표를 던지는 데는별로 도움이되지 않습니다. 이것은 제가 검색에서이 질문을 찾도록 이끈 문제를 정확히 재현 한 것입니다. 이를 개선하기위한 권장 사항이 있으시면 단순히 반대 투표 대신 의견으로 알려주십시오.
msouth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.