원격 지점에서 체리 픽을하는 방법?


135

체리 픽을 수행하는 데 문제가 있습니다. 내 로컬 컴퓨터에서 현재 "마스터"지점에 있습니다. "zebra"라는 다른 지점에서 커밋을 선택하고 싶습니다. "제브라"분기는 원격 분기입니다.

따라서 자식 상태 :

# On branch master
nothing to commit (working directory clean)

좋아, 이제 내가 원하는 커밋을 선택하려고합니다.

git cherry-pick xyz
fatal: bad object xyz

여기서 "xyz"는 지사 "zebra"에서 발생한 커밋의 서명입니다.

첫 번째 명백한 질문은 왜 내가 참조하고있는 커밋을 찾을 수 없습니까? 나는 이것이 어떻게 정직하게 작동하는지 이해하지 못한다. git은 다른 모든 브랜치에 대해 작업 디렉토리에 로컬로 커밋 데이터베이스와 같은 것을 저장합니까? cherry-pick 명령을 실행할 때 로컬 데이터베이스를 검색하여 내가 말하고있는 커밋을 찾습니까?

"얼룩말"은 원격 지점이므로 로컬에 데이터가 없다고 생각했습니다. 그래서 지점을 바꿨습니다.

git checkout zebra
Switched to branch 'zebra'

이제 로컬 컴퓨터에서 디렉토리의 파일이 얼룩말의 상태를 올바르게 반영 함을 알 수 있습니다. 다시 마스터로 전환하고 체리 피킹을 다시 시도하십시오 (커밋 데이터를 사용할 수 있음).하지만 같은 문제가 발생합니다.

나는 여기에서 무슨 일이 일어나고 있는지에 대한 근본적인 오해를 가지고 있습니다. 어떤 도움이라도 좋을 것입니다.


2
개념적으로 모든 것이 옳아 보입니다. 커밋의 올바른 해시 (시그니처 호출)를 사용하고 있습니까? 'git show <hash>'를 시도하여 확인하십시오.
0xc0de

안녕하세요, 예 긍정적입니다. 두 분기가 모두 github에 있으며 커밋 페이지를 찾는 데 사용할 수 있습니다. 내가 이해한다면, 내 컴퓨터의 상태는 git이 'master'의 맥락에서 'zebra'에서 해시를 찾을 수없는 상태입니다. '얼룩말'이 로컬에도 존재한다는 것을 어떻게 말해야합니까?
user291701

그리고 'git show xyz'를 수행하면 "치명적 : 잘못된 개체"와 같은 오류가 발생합니다. (xyz를 올바른 해시로 바꾸고 있습니다).
user291701

그리고 명확하게하기 위해 'xyz'해시를 사용하여 " github.com/me/test/commit/xyz " 와 같이 문제없이 github에서 커밋을 볼 수 있습니다 .
user291701

답변:


195

"얼룩말"은 원격 지점이므로 로컬에 데이터가 없다고 생각했습니다.

올바른 데이터가 없지만 올바로 해결하려고했습니다. 원격 소스에서 로컬로 데이터를 수집하려면을 사용해야 git fetch합니다. 당신이했을 때 git checkout zebra해당 지점의 상태가 당신이 가져온 마지막 시간이었다 무엇으로 전환. 따라서 먼저 원격에서 가져 오십시오.

# fetch just the one remote
git fetch <remote>
# or fetch from all remotes
git fetch --all
# make sure you're back on the branch you want to cherry-pick to
git cherry-pick xyz


1
Github에서 업스트림 수정 프로그램을 체리 픽픽 (pick-pick)하기 위해이 접근 방식을 시도했는데 체크 아웃 된 해시가 Github의 업스트림 수정과 다릅니다. 따라서 나는 체크 아웃하고 해시를 얻고 그것을 선택해야했습니다.
DustWolf

1
git cherry-pick <remote> <hash>
Jared

원격 브랜치를 가져온 후 잘 작동했습니다. 감사합니다 :)
Adeel

그래도 나를 위해 가져온 후 일했습니다. git cherry-pick에 대한 자세한 내용은 atlassian.com/git/tutorials/cherry-pick
Satheesh M

12

OP의 답변에 대한 부록과 마찬가지로

문제가있는 경우

fatal: bad object xxxxx

그 커밋에 액세스 할 수 없기 때문입니다. 즉, 해당 저장소가 로컬에 저장되어 있지 않습니다. 그때:

git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx

여기서 xxxxxxx는 원하는 커밋 해시입니다.


내가 업스트림 플래그없이 이미 repo를 추가했을 때 흠?
Gobliins

10

체리 픽하려는 원격 저장소 ( "foo") 추가

$ git remote add foo git://github.com/foo/bar.git

그들의 가지를 가져옵니다

$ git fetch foo

커밋을 나열하십시오 (가져온 모든 커밋을 나열해야합니다 foo)

$ git log foo/master

필요한 커밋을 체리 픽

$ git cherry-pick 97fedac

5

개발 브랜치를 마스터에 병합 한 후 일반적으로 개발 브랜치를 삭제합니다. 그러나 개발 브랜치에서 커밋을 체리 선택 하려면 "잘못된 개체"오류를 피하기 위해 병합 커밋 해시를 사용해야합니다 .


3

먼저 로컬 드라이브에서 두 가지 데이터를 모두 가져와야합니다.

무슨 일이 일어나고 있는지는 현재 지점 b에 있지만 지점 a의 로컬 사본이 아직 업데이트되지 않은 지점 a에서 지점 b로 체리 선택하려고합니다 (git pull on을 수행해야 함) 두 가지가 먼저).

단계 :
-자식 체크 아웃 분기
-a-자식 풀 원점 분기
-a-자식 체크 아웃 지점
-b-자식 풀 원점 분기
-b-자식 체리-픽 <해시>

출력 :
[branch-b <hash>] 로그 데이터
작성자 : 작성자 <저자
1 파일 변경, 1 삽입 (+), 3 삭제 (-)


1

풀 요청 커밋 ID 탭에서 커밋 ID를 사용한 후이 오류가 반환되었습니다. 그 커밋은 이후에 뭉개져 병합되었습니다. github pull 요청에서 커밋 탭에서 커밋 ID를 사용하는 대신 "merged commit xxxxxxx into ..."라는 텍스트를 찾으십시오.


1

커밋은 로컬에 있어야합니다 git log. 를 사용하여 확인하십시오 .

커밋이 없으면 git fetch최신 원격으로 로컬을 업데이트하십시오.


0

SourceTree를 사용하여 쉽게 수행 할 수도 있습니다.

  • 마스터 지점을 확인하십시오
  • "로그 / 이력"탭을여십시오
  • xyz 커밋을 찾아 마우스 오른쪽 버튼으로 클릭하십시오.
  • "병합 ..."을 클릭하십시오

완료 :)


이것은 올바르지 않습니다. 이제 선택한 커밋 대신 마스터의 HEAD를 얼룩말로 병합하기 때문입니다.
Chef Pharaoh

0

가져 왔지만 여전히 이런 일이 발생하면 다음과 같은 이유가있을 수 있습니다.

선택하려는 커밋이 더 이상 어떤 브랜치에도 속하지 않을 수 있습니다. 리베이스 할 때 발생할 수 있습니다.

이 경우 원격 저장소에서 :

  1. git checkout xxxxx
  2. git checkout -b temp-branch

그런 다음 리포지토리에서 다시 가져옵니다. 커밋을 포함하여 새 브랜치가 페치됩니다.


0

체리 피킹하려는 커밋으로 분기를 진행 하여이 문제를 해결했습니다.

git checkout <branch With Commit To Cherry-Pick>

커밋 해시를 찾기 위해 로그 사용

git log

노트 패드에서 해시 컷 및 붙여 넣기를 찾은 경우 명령을 사용하여 해시를 얻기 위해 위로 스크롤하면 커밋을 배치하려는 분기를 체크 아웃하십시오.

git checkout < branch I Want To Place My Cherry-Picked-Hash In>

마지막으로 git에서 cherry-pick을 호출하십시오. (주) -x는 cherry-pick 메시지를 원본에 추가하는 것입니다. "커밋을 기록 할 때이 변경이 체리에서 선택된 커밋을 나타 내기 위해 원래 커밋 메시지에"(체리에서 커밋…) "이라는 행을 추가하십시오."

git cherry-pick -x <your hash commit to add to the current branch>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.