Git Cherry-pick vs Merge Workflow


302

리포지토리의 관리자이고 기여자로부터 변경 사항을 가져 오려면 몇 가지 가능한 워크 플로가 있습니다.

  1. 나는 cherry-pick각각 원격에서 커밋합니다 (순서대로). 이 경우 git은 커밋을 원격 브랜치와 관련이없는 것으로 기록합니다.
  2. 나는 merge 모든 변경 사항을 가져오고 새로운 "충돌"커밋을 추가합니다 (필요한 경우).
  3. 나는 merge 각각 원격 브랜치에서 개별적으로 (다시 순서대로) 커밋하여 모든 커밋마다 충돌을 기록 할 수 있습니다.
  4. 완전성을 위해 rebase(와 동일cherry-pick 옵션 합니까?)를 있지만 내 이해는 이것이 기여자에게 혼란을 줄 수 있다는 것입니다. 옵션 1을 제거 할 수도 있습니다.

두 경우 모두 git은 커밋의 분기 기록을 1과 달리 기록합니다.

무엇 사용과 프로의 양론의 중 하나입니다 cherry-pick또는 merge방법을 설명? 방법 2가 표준이라는 것을 이해하지만, 단일 "충돌"병합으로 큰 커밋을 해결하는 것이 가장 깨끗한 해결책은 아니라고 생각합니다.

답변:


296

rebase(및 cherry-pick) 모두 merge장단점이 있습니다. 나는 merge여기서 주장 하지만 둘 다 이해할 가치가 있습니다. ( 여기서 선호되는 사례를 열거 하는 다른 논쟁의 여지가 많은 답변을 찾으십시오 rebase.)

merge선호되는 cherry-pickrebase몇 가지 이유.

  1. 견고성 . 커밋의 SHA1 식별자는 커밋뿐만 아니라 그 앞에 오는 다른 모든 커밋 과 관련하여 식별 합니다. 이를 통해 지정된 SHA1의 리포지토리 상태가 모든 클론에서 동일하다는 것을 보장 할 수 있습니다. 이론상 누군가가 같은 변화처럼 보이는 것을했지만 실제로 저장소를 손상 시키거나 납치 할 가능성은 없습니다. 개별 변경 사항에서 체리 픽을 선택할 수 있으며 변경 사항은 동일하지만 보장 할 수는 없습니다. (사소한 보조 문제로, 새로운 체리 피킹 커밋은 다른 누군가가 동일한 커밋에서 체리 피킹을 다시 수행하면 작업 공간이 동일하더라도 역사에 모두 표시되므로 추가 공간을 차지합니다.)
  2. 사용 편의성 . 사람들은 merge작업 흐름을 상당히 쉽게 이해하는 경향이 있습니다. rebase더 진보 된 것으로 간주되는 경향이 있습니다. 두 가지를 모두 이해하는 것이 가장 좋지만 버전 관리 전문가가되고 싶지 않은 사람들 (내 경험상 자신이하는 일에 능숙하지만 여분의 시간을 보내고 싶지 않은 많은 동료들이 포함되어 있음) 시간이 합병.

심지어 병합 무거운 워크 플로우 rebasecherry-pick여전히 특별한 경우에 유용합니다 :

  1. 한 가지 단점 merge은 혼란스러운 역사입니다. rebase정기적으로 다른 사람의 변경 사항을 병합하는 경우처럼 커밋이 기록에 흩어지지 않도록합니다. 그것이 실제로 내가 사용하는 주요 목적입니다. 당신이 매우 조심 하고 싶은 것은 rebase다른 저장소와 공유 한 코드 를 작성 하지 않는 것 입니다. 커밋이 끝나면 push다른 누군가가 그 위에 커밋했을 수 있으며, rebasing은 위에서 설명한 것과 같은 종류의 복제를 유발할 것입니다. 최악의 경우 매우 혼란스러운 저장소와 미묘한 오류가 발생하여 페럿을 제거하는 데 시간이 오래 걸립니다.
  2. cherry-pick 은 기본적으로 삭제하기로 결정한 주제 브랜치에서 작은 부분의 변경 사항을 샘플링하는 데 유용하지만 유용한 부분이 몇 가지 있다는 것을 깨달았습니다.

하나 이상의 변경 사항을 병합하는 것을 선호하는 경우 훨씬 간단합니다. 개별 변경 세트를 많이 시작하면 개별 변경 세트를 병합하는 것이 매우 지루할 수 있습니다. git (및 Mercurial 및 Bazaar)의 병합 해상도는 매우 좋습니다. 대부분 긴 지점을 병합하는 데 큰 문제가 발생하지 않습니다. 나는 일반적으로 모든 것을 한 번에 병합하며 , 충돌이 많은 경우 에만 병합 단편을 백업하고 다시 실행합니다. 그럼에도 불구하고 나는 큰 덩어리로 그것을합니다. 매우 실제적인 예로서 저는 3 개월 동안 합병해야 할 동료가 있었고 250000 라인 코드 기반에서 9000 번의 충돌이있었습니다. 우리가 고 쳤던 것은 한 번에 한 달 동안 합병하는 것입니다. 충돌은 선형으로 쌓이지 않고 조각으로 수행하면 훨씬 큽니다.9000 미만의 충돌. 그것은 여전히 ​​많은 작업 이었지만 한 번에 한 번의 커밋을 시도하는 것만 큼은 아닙니다.


1
실제로 이론적으로 Mallory는 동일한 SHA1이지만 다른 내용으로 커밋을 생성하여 저장소를 손상시킬 가능성이 있지만 실제로는 발생하지 않을 것입니다. :)
Bombe

1
Ha :) 나는 "이론적으로 확률이 너무 낮아서 일어날 수없는 일에 의존 할 수있다"는 것을 의미했지만, 당신은 그것이 곤경에 처한 것을 읽는 것이 옳다.
quark

"merge --squash"에 대해 어떻게 생각하십니까?
cmcginty

@Bombe Mallory가 성공하기를 원한다면, 동일한 SHA1을 사용하여 원래 커밋과 두 번째 커밋을 구체적으로 작성해야합니다. 그래서 또 다른 질문이 될 수 있습니다 : 두 (거의) 가짜 커밋이 나타날 확률은 무엇입니까? ;)
João Portela

64
9000 충돌? 나는 직장을 그만두고 꿀벌지기가되었습니다.
Sebastian Patten

95

내 생각에 체리 피킹은 예를 들어 '마스터'브랜치 (트렁크, 주요 개발 브랜치)에서 직접 수정 한 다음 '메인 트'에도 적용해야한다는 것을 알았을 때 드문 상황이 필요할 때 예약해야합니다. '. 병합 또는 리베이스 (또는 "git pull --rebase")를 기준으로 워크 플로우를 작성해야합니다.

체리 또는 촬상으로 업데이트 커미트 즉 기억하십시오 다른 힘내의 관점에서 원격 저장소에 커밋보다 상이한 있도록 원본보다 (SHA-1 다른 식별자를 갖는다). Rebase는 일반적으로 패치 ID, 즉 커밋 ID가 아닌 변경 사항을 확인하므로이를 처리 할 수 ​​있습니다.

또한 git에서는 많은 분기를 한 번에 병합 할 수 있습니다 : 소위 octopus merge . 문어 병합은 충돌없이 성공해야합니다. 그럼에도 불구하고 유용 할 수 있습니다.

HTH.


19
rebase / cherry-picking이 실제로 커밋을 "복사"하여 원래 커밋에 대한 연결을 잃는 지점에 대해 +1입니다.
studgeek

1
우리는 이러한 방식으로 cherry-pick을 사용하여 독점적으로 버그 수정 (아마도 매우 작은 기능)에 대한 커밋을 기존 릴리스 분기로 이동하여 패치를 준비합니다. 여러 커밋에 걸친 기능은 일반적으로 마스터를 기반으로하는 릴리스 브랜치에 들어가는 것을 보증합니다.
foxxtrot

3
@ foxxtrot : 또 다른 해결책은이 버그를 나타내는 가장 오래된 커밋을 기반으로 버그 수정에 대한 별도의 분기를 만들고 'maint'및 'master'에 병합하는 것입니다 ...이 경우 해당 버그 수정을 알아야합니다 두 가지 모두에 적용됩니다.
Jakub Narębski

4
@Jakub 버그 픽스 브랜치를 생성하고 병합하는 데 없어서는 안될 두 가지 명령 : git blame버그를 도입 한 커밋을 찾고 git branch --contains브랜치를 병합 할 위치를 결정하는 것입니다. 이 게시물
gcbenison

-10

Rebase와 Cherry-pick은 확실한 커밋 기록을 유지할 수있는 유일한 방법입니다. 병합 사용을 피하고 병합 충돌을 피하십시오. gerrit을 사용하는 경우 필요한 경우 하나의 프로젝트를 병합으로 설정하고 하나의 프로젝트를 체리 픽 모드로 설정하고 직접 시도하십시오.


이것이 어떻게 질문에 대답하는지 명확하지 않은 경우, 일부 예는 약간의 빛을 가져올 것입니다.
Adrian Nasui

1
역사가 똑바로 보인다는 것이 이해하기 쉽다는 것을 의미하지는 않습니다.
nicolimo86

합병은 깨끗한 역사를 갖는 일반적인 방법입니다. Cherry-pick and rebase는 주로 기록을 수정해야하는 상황에 사용됩니다. 병합이 항상 첫 번째 선택이어야한다는 것을 의미합니다. 리모컨과 여러 사람과 함께 일할 때 rebase가 comit sha를 변경하는 것은 매우 위험한 원인입니다.
Radon8472

여기이 사람은 메달을받을 자격이 있습니다. 그는 자신이 계속 투표권을 행사할 것이라는 것을 알고 있지만 정답입니다. 명성.
PW Kad

죄송합니다. 지금까지 이러한 의견을 보지 못했습니다. 결론을 내리기 전에 테스트 환경에서 시도해보고 효과가있는 작업을 수행하십시오! 여러 제품 브랜치에 기여하는 약 600 명의 개발자가 있습니다. 개발자가 로컬 작업 영역에서 수행하는 작업에 신경 쓰지 않습니다. 통합을 위해 변경 사항이 제출되면 개발 브랜치에서 체리 픽 선택이 가능하거나 때로는 릴리스 또는 버그 수정 브랜치가 가능해야합니다. 참고로 저는 Gerrit를 사용합니다.
Nagaraj Magadum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.