자식 분기를 마스터와 동기화 상태로 유지하는 방법


275

git이 머리를 쓰는 순간, 나는 다음에 대한 최상의 해결책을 제시 할 수 없습니다.

하나는 master 라고 하고 다른 하나는 mobiledevicesupport 라고 합니다 . 모바일 장치 지원이 안정적 일 때마다 모바일 장치 지원을 마스터 브랜치와 병합 / 동기화되는 연속 분기로 유지하고 싶습니다. 그러면 모바일 장치 지원에서 마스터로 변경 사항이 병합되지만 마스터에서 모든 변경 사항을 모바일 장치 지원으로 가져와 분기가 계속 작동하고 기능이 개선되거나 수정 될 수 있습니다. 중앙 저장소 및 여러 개발자와 함께 작업해야합니다.

다른 사람들이 사용하는 유사한 워크 플로의 예를 보거나이 아이디어가 어리 석다면 다른 옵션을 고려해야합니다. 현재 워크 플로우는 괜찮은 것처럼 보이지만 git이 어떻게 이런 식으로 작동하는지 알 수 없습니다.

고마워, 모든 도움을 주셔서 감사합니다.

업데이트 1 : master를 mobiledevicesupport로, mobiledevice support를 master로 병합하려는 경우 두 지점에서 복제 커밋을 얻습니까? 또는 분기 A에서 분기 B로 최신 변경 사항을 가져 와서 병합 커밋 C를 분기 B로 추가했는지 확인하기에 충분히 똑똑합니다. 그리고 분기 B에서 분기 A로 최신 변경 사항을 가져 와서 병합 커밋 D를 분기에 추가했습니다. ㅏ?

이미지를 게시하려고했지만 평판이 충분하지 않기 때문에 다음 그림이 필요할 것 같습니다. 지속적으로 실행되는 두 개의 브랜치는 종종 양방향으로 진행합니다. 내가 확실하지 않은 핵심은 git이 커밋을 재생하는 방법이며 병합시 다른 브랜치의 커밋으로 브랜치를 채울지 또는 깨끗하게 유지할 것입니다. 나는 전에 rebase를 사용했지만 지점을 끝내고 모든 커밋을 마스터에 넣는 것 같습니다. 또는 잘못했습니다. 지금까지 도움을 주셔서 감사합니다.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L

1
당신이 있다면, 나처럼, GitHub의에 함께 할 방법을 찾고 클라이언트 : help.github.com/articles/merging-branches
cregox

1
이 질문은 몇 세기 동안 나의 목숨을 구했습니다. 이 멋진 질문을 @Mr. 에스겔
DJphy

당신이 포크에서 작업하는 경우에는 따라야 할 help.github.com/articles/syncing-a-fork을
koppor

답변:


416

네 그냥하세요

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

모바일 장치 지원을 마스터와 동기화 유지

그런 다음 mobiledevicesupport를 마스터에 넣을 준비가되면 먼저 위와 같이 master를 병합하십시오.

git checkout master
git merge mobiledevicesupport
git push origin master

그리고 그게 다야.

여기서 mobilexxx는 아직 메인 지점으로 갈 준비가되지 않은 토픽 브랜치입니다. 따라서 모바일 장치 지원이 좋은 곳에서만 마스터로 병합하십시오.


이것은 나에게 합리적으로 들리는데, 이것이 커밋 히스토리를 얼마나 더럽힐 지 확신하지 못한다고 생각합니다.
Mr. EZEKIEL

1
당신은 꽤 많은 "병합 커밋"을 가질 것입니다. 당신이 그것에 대해 걱정하고 분기를 사용하는 유일한 사람이라면 "git merge master"대신 "git rebase master"를 수행하고 커밋을 원격 브랜치에 넣지 마십시오. 당신이 (아마도) 항상 일치하지 않는 커밋의 역사를 보내려고하기 때문에 원산지 / 모바일 장치 지원에 많은 강제 푸시 (git push --force)를하고 있다는 것을 알게 될 것입니다 원격 지사가 있습니다. 자세한 내용은 여기 git-scm.com/book/en/Git-Branching-Rebasing
concept47

나는 이것이 정답이라고 믿고, 그것은 내가 원하는 것과 똑같이 들립니다. 좀 더 명확하게하기 위해 위의 그림을 추가했지만 당신이 말하는 것이 사실이라면 이것이 내가 원하는 방식으로 정확하게 작동해야합니다. 감사합니다.
Mr. EZEKIEL

2
이것이 왜 좋은 조언이 아닌지 이해하려면 이것을 읽으십시오 : kentnguyen.com/development/visualized-git-practices-for-team/… . 그것은 Git 관리자에 의해 작성되었으므로 아마도이 특정 주제와 관련하여 자신이 말하고있는 것을 알고 있다고 말할 수 있습니다.
Dan Molding

2
커밋 기록이 지저분합니다. 내 답변이 rebase를 통해 수행됩니다.
Gob00st

43

마스터에서 작업 지점으로 변경 사항을 가져 오려면을 수행하십시오 git rebase <remote>/master. 충돌이있는 경우 그들을 해결하십시오.

작업 지점이 준비되면 다시 기지를 만든 다음을 수행하십시오 git push <remote> HEAD:master. 그러면 원격 (중앙 저장소)의 마스터 분기가 업데이트됩니다.


3
허용 된 답변 대신이 방법을 사용하여 장단점은 무엇입니까?
Hampus Ahlgren

33
지옥에서 rebase 지옥에서 5 시간을 보낼 때까지 Sane
IcedDante

21
이는 지점이 개인 저장소에있는 경우에만 해당됩니다. 업스트림으로 밀려 난 물건을 리베이스하지 마십시오. 이런 이유로 : git-scm.com/book/en/v2/...
Kleag

3
히스토리를 다시 쓰면서 rebasing의 문제는 rebased commit의 SHA가 변경되어 (예를 들어)의 출력에 의존 할 수 없다는 것 git branch --contains <commit>입니다.
jnns

13

concept47의 접근 방식이 올바른 방법이지만 커밋 기록을 명확하게 유지하려면 --no-ff 옵션과 병합하는 것이 좋습니다.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master

9

네 당신의 접근 방식에 동의합니다. 모바일 장치 지원을 마스터로 병합하려면 다음을 사용할 수 있습니다

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

마찬가지로 모바일 장치 지원에서 마스터를 병합 할 수도 있습니다.

Q. 교차 병합이 문제가되는지 여부입니다.

A. 그것은 마지막으로 동기화 된 시점부터 모바일 * 지점 및 마스터 지점에서 이루어진 커밋에 달려 있습니다. 이 예제를 보자 : 마지막 동기화 후,이 분기들에 다음 커밋이 발생한다

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

이제 커밋 B가 파일 a.txt를 약간 변경하고 커밋 D도 a.txt를 약간 변경했다고 가정합니다. 이제 병합 작업의 각 영향에 대해 살펴 보겠습니다.

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.

이제 두 가지 유형의 병합이 가능합니다

  1. 빨리 감기 병합
  2. 진정한 병합 (수동 노력 필요)

Git은 먼저 FF 병합을 시도하고 충돌이 git에 의해 해결 될 수없는 것을 발견하면 시도합니다. 병합에 실패하고 병합을 요청합니다. 이 경우 a.txt의 충돌을 해결하는 새로운 커밋이 발생합니다.

따라서 결론은 교차 병합은 문제가 아니며 궁극적으로 수행해야하며 동기화가 의미합니다. 생산중인 작업을 수행하기 전에 분기 병합에서 손을 더 럽히십시오.


1
이렇게 교차 병합하는 것이 문제가되지 않습니까?
Mr. EZEKIEL

교차 병합은 동기화라고하며 두 지점의 커밋이 충돌을 일으키지 않는 한 문제가되지 않습니다. 업데이트 된 답변을 참조하십시오.
sachinjain024

3

git merge를 통해 허용 된 답변은 작업을 완료하지만 지저분한 커밋 조직을 남깁니다. 다음 단계를 통해 올바른 방법이 '리베이스'되어야합니다 (PR 전에 최종 푸시를 수행하기 전에 기능 분기를 sycn에 유지하려는 경우) ).

git fetch기능 지점에서 1 (작업중인 기능 지점이 최신으로 업데이트되었는지 확인)

2 git rebase origin/develop

3 충돌이 발생하면 하나씩 해결하십시오.

4 git rebase --continue모든 충돌이 해결되면 사용

5 git push --force


1
이것은 읽기 어렵고 이해하기 어렵다. 의견을 명령과 분리하려면 답변을 업데이트하고 적절한 코드 마크 다운을 사용하십시오.
not2qubit

2

올바른 방향으로 생각하고 있습니다. 모바일 장치 지원이있는 마스터를 계속 병합하고 모바일 장치 지원이 안정적인 경우 모바일 장치 지원을 마스터와 병합 각 개발자는 자신의 지점을 가지고 있으며 자신의 역할에 따라 마스터 또는 모바일 장치 지원과 통합 할 수 있습니다.

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