브랜치에서 모든 커밋을 가져오고 지정된 커밋을 다른 커밋으로 푸시합니다.


102

다음 분기가 있습니다.

  • master
  • production

및 다음 원격 분기 :

  • origin/master
  • origin/production

origin/master분기를 가져오고 마지막 가져 오기 ( log -p master..origin/master) 에서 변경된 내용의 차이 를 가져 오는 스크립트가 있습니다. 그런 다음 병합 origin/master합니다.

발견 된 커밋은 코드 검토 도구로 푸시됩니다.

성공한 커밋을 프로덕션 브랜치로 푸시 한 다음 origin/production.

어떻게 할 수 있습니까?

또한 두 개의 스크립트가 실행 중입니다. 하나는에서 가져오고 origin/master, 데이터베이스에 커밋 세부 정보를 푸시하고, 병합하고, 다른 하나는 성공적인 커밋을 푸시해야하는 현재 작성 중인 스크립트 입니다.

경쟁 조건 / 병합 충돌을 피하면서 두 스크립트를 실행하고 싶습니다. 지정된 커밋으로 만 작업하고 싶기 때문에 원하지 않는 커밋을 제거 할 수있는 방법이 있을까요?


'성공적인 커밋'이란 무엇을 의미합니까?
bdonlan

검토되고 성공한 것으로 표시된 것입니다. 여기서는 그다지 중요하지 않습니다. 중요한 것은 제가 유지하고 다른 브랜치로 푸시하고 싶은 커밋이 있고 다른 브랜치에서 제거 / 무시하고 싶은 커밋이 있다는 것입니다.
Sylvain

답변:


313

제가 찾고있는 용어는 '체리 픽'입니다. 즉, 한 분기 중간에서 단일 커밋을 가져 와서 다른 분기에 추가합니다.

A-----B------C
 \
  \
   D

된다

A-----B------C
 \
  \
   D-----C'

물론 이것은 git cherry-pick 명령으로 수행 할 수 있습니다.

이 커밋의 문제는 git이 커밋이 모든 기록을 포함하는 것으로 간주한다는 것입니다. 따라서 다음과 같은 세 개의 커밋이있는 경우 :

A-----B-----C

그리고 B를 제거하려고하면 다음과 같이 완전히 새로운 커밋을 만들어야합니다.

A-----------C'

C '는 다른 SHA-1 ID를 가지고 있습니다. 마찬가지로 체리가 한 브랜치에서 다른 브랜치로 커밋을 선택하는 것은 기본적으로 패치를 생성 한 다음 적용하는 것과 관련이 있으므로 그런 방식으로 히스토리도 손실됩니다.

이 커밋 ID 변경은 다른 것들 중에서 git의 병합 기능을 손상시킵니다 (아주 드물게 사용되는 경우이를 해결하는 휴리스틱이 있습니다). 하지만 더 중요한 것은 기능적 종속성을 무시한다는 것입니다. C가 실제로 B에 정의 된 함수를 사용했다면 절대 알 수 없습니다.

아마도 이것을 처리하는 더 좋은 방법은 더 미세한 나뭇 가지를 가지는 것입니다. 즉, '마스터'를 갖는 대신 'featureA', 'bugfixB'등을 갖습니다. 한 번에 전체 브랜치에 대한 코드 검토를 수행합니다. 각 브랜치는 한 가지 작업에만 집중하는 것입니다. 그런 다음 병합합니다. 완료되면 한 지점. 이것이 git이 설계 한 워크 플로이며 장점입니다. :)

패치 수준에서 작업을 고집한다면 darcs를 살펴볼 수 있습니다. 리포지토리를 패치 집합으로 간주하므로 체리 피킹이 기본 작업이됩니다. 그러나 이것은 매우 느린 것과 같은 자체 문제가 있습니다. :)

편집 : 또한 두 스크립트에 대한 두 번째 질문을 이해하지 못합니다. 좀 더 자세하게 설명 할 수있을 것입니다. 혼란스럽지 않도록 별도의 질문으로 설명 할 수 있습니까?


두 번째 질문에 대해서는 변경 사항 (첫 번째 스크립트)을 가져오고 주어진 커밋을 다른 위치 (두 번째 스크립트)로 푸시하는 프로세스가 경쟁 조건 / 병합 충돌없이 작동 할 수 있는지 확인하고 다른 분기로 작업 할 수 있도록하고 싶습니다. 하지만 결국에는 두 스크립트를 하나로 병합 할 수 있으므로 두 스크립트가 동시에 작동하지 않기 때문에 oesn 중요하지 않다고 생각합니다. :)
Sylvain

9
"이 커밋 ID 변경은 다른 것들 중에서 git의 병합 기능을 중단 시킵니다.
Narek 2013-09-19

5
@Narek 그는 아마도 두 번째 브랜치를 병합 할 때 커밋 C의 변경 사항이 커밋 C의 동일한 변경 사항과 충돌 할 것이라는 것을 의미합니다. 이것이 커밋 C 뒤에 기록을 잃은 결과입니다.
bytefu

1
"그리고 B를 제거하려고"-왜 B를 제거하려고합니까?
d512

3
@ user1334007, 그는 이전에 ABC 였음을 의미합니다. 이제 C의 체리 선택으로 인해 분기는 더 이상 'B'를 포함하지 않는 AD-C '입니다.
AnneTheAgile 2015

1

나는 이것이 오래된 질문이라는 것을 알고 있지만 여기에서 참조됩니다 : Git에서 특정 커밋을 병합하는 방법

따라서 새로운 답변 : 기능 분기 및 풀 요청을 사용하십시오.

fA는 기능 A가있는 커밋이고 fB는 기능 B가있는 커밋입니다.

            fA   fC (bad commit, don't merge)
           /  \ /
master ----A----B----C
                \  /
                 fB

풀 요청은 GitHub의 기능과 관련이 있지만 실제로는 누군가가 기능 분기를 마스터로 병합 할 책임이 있다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.