Git Cherry-pick vs 병합 워크플로우
제가 레포의 관리자이고 기여자의 변경 사항을 적용하고 싶다고 가정하면 다음과 같은 몇 가지 가능한 워크플로우가 있습니다.
- I
cherry-pick
분기와이 없는 합니다.이 경우 git는 커밋을 원격 분기와 관련이 없는 것으로 기록합니다. - I
merge
분기, 모든 변경사항을 적용하고 필요한 경우 새 "임의" 커밋을 추가합니다. - I
merge
원격 분기에서 각 커밋을 개별적으로(순서대로) 수행하여 모든 커밋을 하나로 그룹화하는 대신 각 커밋에 대해 충돌을 기록할 수 있습니다. - 위해서 은 완성을위해, 을 할 수 .
rebase
)cherry-pick
옵션?), 하지만 이것이 기여자에게 혼란을 줄 수 있다는 것이 제 이해입니다.아마도 그것은 옵션 1을 제거할 것입니다.
두 경우 모두 2와 3에서 Git는 1과 달리 커밋의 분기 기록을 기록합니다.
설명된 방법 중 하나를 사용하는 것 사이의 장점과 단점은 무엇입니까?제가 알기로는 방법 2가 표준이지만, 하나의 "충돌" 병합으로 대규모 커밋을 해결하는 것이 가장 깨끗한 해결책은 아니라고 생각합니다.
둘다요.rebase
)cherry-pick
및 ) 및merge
장점과 단점이 있습니다.는 찬합니다를 합니다.merge
여기, 하지만 두 가지 모두를 이해할 가치가 있습니다. (여기에서 사례를 열거하는 대체, 잘 주장된 답변을 찾으십시오.)rebase
선호합니다.)
merge
보선는되보다 cherry-pick
그리고.rebase
두어 가지 이유로
- 튼튼함.커밋의 SHA1 식별자는 커밋 자체뿐만 아니라 커밋 이전의 다른 모든 커밋과 관련하여 커밋을 식별합니다.이렇게 하면 지정된 SHA1의 리포지토리 상태가 모든 복제본에서 동일하다는 것을 보장할 수 있습니다.(이론적으로는) 누군가가 동일한 변경 사항을 수행했지만 실제로 리포지토리를 손상시키거나 가로채고 있을 가능성은 없습니다.당신은 개별적인 변화를 선택할 수 있고 그것들은 동일할 수 있지만, 당신은 보장이 없습니다.(작은 부차적인 문제로, 다른 사람이 같은 커밋에서 체리를 다시 선택하면 작업 복사본이 동일하더라도 둘 다 기록에 존재하기 때문에 새로운 체리 선택 커밋은 추가 공간을 차지합니다.)
- 사용 편의성.사람들은 이해하는 경향이 있습니다.
merge
워크플로우를 쉽게 수행할 수 있습니다.rebase
더 발전된 것으로 간주되는 경향이 있습니다.두 가지를 모두 이해하는 것이 가장 좋지만 버전 제어 전문가가 되고 싶지 않은 사람들(내 경험에 따르면 자신이 하는 일에 아주 능숙하지만 추가 시간을 보내고 싶지 않은 많은 동료들)은 병합하는 것만으로도 더 쉬운 시간을 갖습니다.
이 많은 워크플로우에도 병합 작이워로우에서도플rebase
그리고.cherry-pick
다음과 같은 경우에도 유용합니다.
- 의 한 가지 .
merge
어수선한 역사입니다.rebase
사용자가 다른 사용자의 변경사항에 주기적으로 병합하는 경우와 마찬가지로 사용자의 기록에 커밋이 분산되는 것을 방지합니다.그것이 사실 제가 사용하는 주된 목적입니다.당신이 매우 조심하고 싶은 것은 절대 하지 않는 것입니다.rebase
다른 리포지토리와 공유한 코드입니다.이 단일커인 경우push
이 그, 위에서 입니다. ed 다 사 그 이 위 람 는 기 스 야 해 껏 이 위 논 리 서 것 한 에 종 의 베 류 입 니 다 유 할 발 중 의 을 복 른 며 으 있 수 에 서 을 했 밋 커 ▁ed ▁someone 것 ▁at ication 다 입 ▁the ▁on 니 최악의 경우 저장소가 매우 혼란스럽고 미묘한 오류가 발생할 수 있습니다. 이 경우 찾는 데 오랜 시간이 걸릴 수 있습니다. cherry-pick
이 기능은 기본적으로 삭제하기로 결정한 항목 분기에서 변경 사항의 일부를 추출하는 데 유용하지만 몇 가지 유용한 부분이 있음을 참조하십시오.
하나보다 많은 변경사항을 병합하는 것을 선호하는 것에 대해서는: 그것은 훨씬 단순합니다.변경사항이 많아지면 개별 변경사항 집합을 병합하는 것이 매우 지루해질 수 있습니다.git(및 Mercurial 및 Baza)의 병합 해상도는 매우 좋습니다.대부분의 경우 긴 분기를 병합하는 데도 큰 문제가 발생하지 않습니다.일반적으로 모든 항목을 한 번에 병합하고 충돌이 많은 경우에만 병합을 개별적으로 백업하고 다시 실행합니다.그런데도 저는 큰 덩어리로 합니다.매우 실제적인 예로, 3개월 동안 병합해야 하는 변경 사항이 있었고 250000 라인 코드 기반에서 약 9000건의 충돌이 발생했습니다.우리가 해결하기 위해 한 달치를 한꺼번에 병합하는 것입니다. 갈등은 선형적으로 누적되지 않고, 조각조각 분할하면 9000개 미만의 충돌이 발생합니다.그것은 여전히 많은 일이었지만, 한 번에 한 번씩 그것을 하려고 노력하는 것만큼은 아니었습니다.
제 생각에는 체리 따기는 필요한 드문 상황을 위해 예약해야 합니다. 예를 들어 '마스터' 지점(트렁크, 메인 개발 지점)에서 직접 수정한 후 '유지'에도 적용해야 한다는 것을 깨달았을 경우입니다.워크플로우는 병합 또는 기본 재배치(또는 "git pull --rebase")를 기준으로 해야 합니다.
Cherry-picked or rebased commit은 Git의 관점(SHA-1 식별자가 다름)과는 다르므로 원격 저장소의 commit과는 다릅니다. (Rebase는 일반적으로 commit id가 아닌 patch id, 즉 변경 사항을 확인하기 때문에 이를 처리할 수 있습니다.)
또한 한 번에 많은 분기를 병합할 수 있습니다. 문어 병합이라고 합니다.문어 병합은 충돌 없이 성공해야 합니다.그럼에도 불구하고 유용할 수 있습니다.
HTH.
기본 및 체리픽만이 커밋 기록을 정리할 수 있는 유일한 방법입니다.병합을 사용하지 않고 병합 충돌을 만들지 않습니다.만약 당신이 gerrit를 사용하고 있다면, 필요하다면 하나의 프로젝트를 Merge로 설정하고 다른 하나의 프로젝트를 체리픽 모드로 설정하여 사용해 보십시오.
언급URL : https://stackoverflow.com/questions/1241720/git-cherry-pick-vs-merge-workflow
'programing' 카테고리의 다른 글
Postgres 스크립트에서 오류가 발생할 경우 어떻게 중지할 수 있습니까? (0) | 2023.05.14 |
---|---|
에서 구조체의 기본 생성자를 정의할 수 없는 이유는 무엇입니까?NET? (0) | 2023.05.14 |
"instantiated"와 "initialized"의 차이는 무엇입니까? (0) | 2023.05.14 |
git 디렉터리에 없는 동안 git pull (0) | 2023.05.14 |
지난 10일의 날짜가 포함된 기록을 나열하는 방법은 무엇입니까? (0) | 2023.05.14 |