형식 패치는 합리적으로 잘 작동하여 더 나은 방법을 찾고 있습니다.

StackOverflow https://stackoverflow.com/questions/773685

  •  13-09-2019
  •  | 
  •  

문제

나는 Rebasing이 효과가없는 것처럼 보일 정도로 다른 두 가지 가지가 있습니다. 또는 어떻게 해야할지 모르겠습니다.

파일이 제거 된 "공개"브랜치가 있습니다 (필터 브랜치 사용). 대부분의 커밋은 델타 측면에서 일치하지만 커밋 ID는 모두 다릅니다. 나는 Dev 지점에서 공개 지점으로의 변경 사항을 가져 오는 몇 가지 방법을 시도했습니다 ... 나는 그것이 내가 원하는 일을 할 수 있다고 믿기 어렵다는 것을 알았습니다. 해. 어쨌든 이것은 잘 작동하지만 잘못된 것 같습니다.

git checkout dev
git format-patch --stdout last_sync_tag > catchup.mbox
git checkout public
git am catchup.mbox
git --skip # talks about a missing file
git --skip # talks about a missing file
git --skip # talks about a missing file

공개 지점에서 원하지 않는 파일을 필터 브랜치 아웃 파일을 포함하지 않는 팁이나 제안은 (하지만 어떻게 그것을 제거합니까?) 환영합니다.

내 나무는 다음과 같이 보인다.

dev: a-b-c-d-e-f-g-h-i-j-k
pub: t-u-v-w-x

t ≅ a, u ≅ c, v ≅ d, w ≅ e, x ≅ g. I, J, K는 내가 넘어 가고 싶은 새로운 패치입니다.

checkout pub
rebase --onto pub i  # I really expected this to work
도움이 되었습니까?

해결책

git 's cherry-pick 명령이 유용 할 수 있습니다. 나는 당신의 상황에서 그것을 사용하지 않았지만 효과가 있다고 생각합니다. 유일한 고통은 커밋 범위에서 작동하도록 설계되지 않았기 때문에 스크립트/자동화하려면 다음과 같은 것을 사용해야합니다. git rev-list.

다시, 나는 이것을 시도하지 않았지만 이와 같은 bash 스크립트는 당신에게 좋은 출발점을 줄 수 있습니다.

git checkout public
for rev in $(git rev-list --reverse last_sync_tag..dev) ; do
   git cherry-pick $rev && git tag -f last_sync_tag $rev || exit 1
done

다른 팁

공개되지 않은 개발자 지점에서 파일을 정기적으로 유지합니까? 아니면 그냥 걸어 다니고 있습니까?

당신이 그들을 변경하는 경향이 있고, 역사를 조금 다시 쓰는 것이 좋습니다. 당신이 할 수있는 일은 공개 지점을 기반으로 단일 커밋으로 만들도록 준비하는 것입니다. 그리고 그것을 다시 공개적으로 병합하지만 실제로 들어가는 것을 막기 위해 "-s ours"와 합병합니다.git merge -s 우리의 이전 답변)

같은 것 :

git checkout -b dev public
git am create-dev-only-files.patch
git checkout public
git merge -s ours dev
git checkout dev
# write more dev patches...
git checkout public
git merge dev
# and this should merge in the patches without bringing in the
#  dev-only files

따라서 Dev Branch에서 후속 변경을 수행하여 공개적으로 병합 한 경우 공개되지 않은 파일을 변경하지 않으면 다른 모든 것이 단순히 적용됩니다. 그러나 파일 세트가 공개 변경을 억제하려는 경우 까다로울 수 있습니다. 예를 들어 공개 지점에서 커밋을 시작하기 전에 특정 파일에 사전 커밋 후크를 추가하여 방지 할 수 있습니다.

"필터 브랜치"를 사용했기 때문에 git이 다시 반역을 수행하기위한 올바른 커밋을 찾도록 도와야합니다.

나는 여기서 추측 할 것입니다. 그러나 아마도 당신은 아마도 당신은 공개 지점의 헤드 와이 커밋이 (미지 필터링)에 해당하는 두 가지 버전의 '거의'공통 커밋을 가지고 있습니다. 공개 헤드 커밋에 전화하십시오 <PH> 그리고 개발자는 이것이 (필터링 전)에 해당한다고 커밋합니다. <DevPH>.

Dev Branch가 체크 아웃되면 다음과 같은 작업을 수행하고 싶습니다.

git rebase --onto <PH> <DevPH>

이것은 Rebase에게 각 커밋이 소개 한 패치를 가져 오라고합니다. <DevPH> 현재 지점 에서이 커밋을 신청합니다. <PH>. 나는 이것이 당신이 필요로하는 것이라고 생각합니다.

편집하다:

질문에 대한 귀하의 업데이트는 H가 Dev Branch의 공개 스트림 헤드와 동일하며 여기에서 Dev Branch의 공개 지점으로 모든 것을 이식하려고한다는 것을 보여줍니다. 그렇다면 명령이 있습니다

git rebase --onto pub h

글쎄, 내가 .gitignore의 Fileit Lands를 원하지 않는다면. 아마도 실제 코드가 아닌 구성이므로 추적이 전혀 필요하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top