마스터에서 Git 브랜치 업데이트


675

나는 Git을 처음 접했고 지금은이 상황에 처해있다.

  • 나는 네 가지 지점 (master, b1, b2 및 b3)을 가지고 있습니다.
  • b1-b3 작업을 한 후 지점 마스터에서 다른 모든 지점에 변경해야 할 사항이 있음을 깨달았습니다.
  • 나는 내가 필요한 것을 바꾸었고 master... 여기 내 문제가있다.

master지점 코드로 다른 모든 지점을 어떻게 업데이트 합니까?


3
여기에서 내 대답을 찾았습니다 : 선택 파일을 git-merge와 어떻게 병합합니까?
wjandrea

58
또 다른 간단한 작업은 Git에 의해 어려워졌습니다. Git 개발자는 SDLC 루프에서 스택 오버플로를 피드백으로 사용해야합니다. 30 만 명이 Git의 워크 플로우에 심각한 문제가 있음을 표시해야합니다. 그들은 UX 전문가를 고용해야합니다. 왜냐하면 그들은 스스로 스스로 그것을 명확하게 통제 할 수 없기 때문입니다.
jww

답변:


620

두 가지 옵션이 있습니다.

첫 번째는 병합이지만 병합에 대한 추가 커밋을 만듭니다.

각 지점을 점검하십시오.

git checkout b1

그런 다음 병합하십시오.

git merge origin/master

그런 다음

git push origin b1

또는 리베이스를 수행 할 수 있습니다.

git fetch
git rebase origin/master

15
이 접근법에 대해 우려하고 있습니다. git log --graph를 실행하면 그래프가 마스터가 실제로 토픽 브랜치에 병합되었음을 보여줍니다. 장기적으로 문제가 발생합니까? 모범 사례는 항상 주제 분기를 다시 마스터로 병합하는 것이라고 생각했습니다. 의견을 부탁합니다.
패트릭

2
병합 워크 플로를 진행하는 경우이 문제를 확인하십시오. randyfay.com/node/89
Hampus Ahlgren

22
마스터를 b1에 병합하고 있습니다. 왜 당신은 got push origin master... 이해가되지 않습니다. 마스터 브랜치를 변경하지 않습니다. 나는 그것이 119 upvote와의 실수라고 생각합니다 : /
Yves Lange

22
병합 방법을 사용하지 마십시오. git rebase master정답을 사용 하십시오
Weston Ganger

6
나중에 읽는 사람들에게-오타에 대한 @Kursion의 관심은 저자의 편집으로 해결되었습니다. 또한 아래에서 두 번째로 높은 투표 응답은 기본적 으로이 답변과 동일하지만 분기 구조 다이어그램과 리베이스하지 않으려는 이유에 대한 경고가 있습니다.
thetertheteal

495

기본적으로 두 가지 옵션이 있습니다.

  1. 당신은 합병합니다. 실제로는 매우 간단하고 완벽하게 로컬 작업입니다.

    git checkout b1
    git merge master
    # repeat for b2 and b3
    

    이렇게하면 역사가 그대로 유지됩니다. 마스터에서 분기하고 모든 지점을 변경 한 후 마지막으로 마스터에서 변경 한 내용을 세 지점 모두에 통합했습니다.

    git이 상황을 실제로 잘 처리 할 수 ​​있으며 모든 방향에서 동시에 발생하는 병합을 위해 설계되었습니다. 모든 스레드를 올바르게 연결할 수 있다고 믿을 수 있습니다. 단지 병합 커밋이 분기 b1병합 인지 master또는 master병합 인지는 신경 쓰지 않습니다 b1. 유일한 차이점은 어떤 분기가이 병합 커밋을 가리키는 것입니다.

  2. 당신은 rebase. SVN 또는 이와 유사한 배경을 가진 사람들이 더 직관적입니다. 명령은 병합 사례와 유사합니다.

    git checkout b1
    git rebase master
    # repeat for b2 and b3
    

    이 방법은 모든 지점에서 선형 이력을 유지하기 때문에이 방법을 좋아합니다. 그러나이 선형 이력은 거짓말이며 그 사실을 알고 있어야합니다. 이 커밋 그래프를 고려하십시오.

    A --- B --- C --- D <-- master
     \
      \-- E --- F --- G <-- b1
    

    이 합병으로 실제 이력이 나타납니다.

    A --- B --- C --- D <-- master
     \                 \
      \-- E --- F --- G +-- H <-- b1
    

    그러나 rebase는 다음과 같은 이력을 제공합니다.

    A --- B --- C --- D <-- master
                       \
                        \-- E' --- F' --- G' <-- b1
    

    요점은 커밋이 있다는 것입니다 E', F'그리고 G'진정으로 존재하지 않았던, 가능성 테스트 적이있다. 컴파일조차 할 수 없습니다. 실제로 변경 사항이에서 master개발에 중요 할 때 리베이스를 통해 무의미한 커밋을 만드는 것은 실제로 쉽습니다 b1.

    이것의 결과는 세 개의 커밋의 어떤 구별 할 수없는, 할 수있다 E, F그리고 G실제의 값을 감소, 회귀를 소개 git bisect.

    나는 당신이 사용해서는 안된다고 말하는 것이 아닙니다 git rebase. 용도가 있습니다. 그러나 그것을 사용할 때마다, 당신은 역사에 대해 거짓말하고 있다는 사실을 알아야합니다. 그리고 적어도 새로운 커밋을 컴파일 테스트해야합니다.


나는 다른 소스 브랜치 (마스터가 아닌)를 병합하고 있었고이 멋진 답변에 추가하는 추가 단계는 병합하기 전에 로컬 리포지토리에서 업데이트하는 것이 었습니다 (최신 코드를 로컬로 가져 오기 위해) git checkout <source branch> git pull. 그런 다음 위와 같이 계속하십시오 : git checkout b1...
Rod

3
오랜 SVN 사용자는 리베이스보다 병합 옵션을 선호합니다. 모든 버전 제어를 사용하면 변경 사항과 이유를 정확하게 기록하는 것이 매우 중요합니다. 나는 명백한 역사를 단순화하기위한 rebase의 호소를 볼 수 있지만, 다시 돌아가서 E ', F', G '의 커밋 주석에 추가해야하며 rebase가 자동으로 해당 주석에 추가되어야합니다. 그렇지 않으면 빌드 / 테스트 / 테스트 배포 프로세스가 G '에서 중단되면 전체 정보없이 변경이 발생한 이유를 해결해야합니다.
WillC

13
역사는 거짓말이다
piratemurray

감사합니다. "git merge any-branch-name"을 사용하여 한 분기 코드를 다른 분기로 병합합니다. 내가 지점 2에있는 동안 로컬로 지점 1의 코드를 테스트 할 수 있습니다
Priti

1
충돌이 모두 일어날 병합 @blamb git mergegit rebase. 그것들을 피하는 것은 없습니다. git rebase여러 가지 rebasing 단계를 숨길 수 있다는 장점이 있습니다 (즉, 동일한 분기를 여러 가지 다른 커밋에 순서대로 재배치하여 각 단계의 충돌 정도를 줄입니다). 그럼에도 불구하고, rebase가 역사에 대해 거짓말한다는 사실은 그러한 다단계 rebase에서 좋은 섹스를 훨씬 쉽게 만들어줍니다. .
cmaster-monica reinstate

238

git rebase master이 작업을 수행하는 올바른 방법입니다. 병합한다는 것은 병합을 위해 커밋이 생성되는 반면 rebasing은 커밋되지 않음을 의미합니다.


52
이미 원점으로 푸시 한 시점은 어떻습니까? 리베이스하면 커밋 기록을 다시 작성하게되며 이는 원격 지사와 충돌합니다. 나는 rebase를 끌어 당기거나 원격 지점으로 밀지 않은 경우에만 사용해야한다고 생각합니다.
Matt Smith

6
원격 지점에서 일하는 유일한 사람이라면 git push --force origin 기능을 사용하여 원격 지점을 rebased local branch로 업데이트 할 수 있습니다. stackoverflow.com/questions/8939977/…
stormwild

7
rebase와 두 작업 모두 병합하면 rebase는 깨끗한 기록 그래프를 제공하므로 개인 브랜치에 가장 적합합니다. 이 답변은 최고입니다
Junchen Liu

5
명확성 (단일 사용자 또는 소규모 팀에 적합) 또는 지저분한 사실 (다중 기여자 코드 브랜치-유지 관리에 필요함 (내 경험-YMMV)) 간의 절충에 대해 더 명확해야합니다.
WillC


53

지점에서 온 / 오프 작업을했거나 다른 지점에서 작업을하던 중에 다른 지점에서 많은 일이 발생한 경우 지점을 마스터로 리베이스하는 것이 가장 좋습니다. 이것은 역사를 깔끔하게 유지하고 일을 훨씬 더 쉽게 만들어줍니다.

git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed

노트:

  • 다른 사람들과 공동 작업 한 지점을 리베이스하지 마십시오.
  • 항상 마스터가 아닐 수도있는 병합 할 지점을 리베이스해야합니다.

http://git-scm.com/book/ch3-6.html 에 rebasing에 대한 장이 있으며 웹에 많은 다른 리소스가 있습니다.


간단한 해결책에 감사드립니다
다른 키 큰 사람

18

@cmaster가 가장 정교하게 답변했습니다. 간단히 :

git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`

나중에 참조 할 수 있도록 분기 히스토리를 다시 쓰지 말고 실제 상태로 유지하십시오. 마스터로 병합하는 동안 하나의 추가 커밋이 생성되지만 저렴합니다. 커밋은 비용이 들지 않습니다.


13

마스터 분기 복사본으로 (백업)과 같은 다른 분기를 업데이트합니다. 어느 쪽이든 따라갈 수 있습니다 (리베이스 또는 병합) ...

  1. 리베이스 를 수행하십시오 (백업 브랜치에 대한 추가 커밋은 없습니다).
  2. 브랜치 병합 (백업 브랜치에 자동으로 추가 커밋이 있음)

    참고 : Rebase는 새로운 기반 (새로운 사본)을 설정하는 것입니다.

git checkout backup
git merge master
git push

(backup2 등과 같은 다른 지점에서는 반복하십시오.)

git checkout backup
git rebase master
git push

(backup2 등과 같은 다른 지점에서는 반복하십시오.)



1

이 문제에는 두 가지 옵션이 있습니다.

1) 자식 리베이스

2) 자식 병합

병합시 위의 두 가지 만 diff 만 사용하면 추가 커밋이 기록됩니다

1) 자식 체크 아웃 지점 (B1, B2, B3)

2) git rebase origin / master (git rebase --continue를 수행하여 로컬에서 충돌이 해결되는 경우)

3) 자식 푸시

또는 git merge 옵션은 비슷한 방식입니다.

1) 자식 체크 아웃 "your_branch"(b1, b2, b3)

2) 자식 병합 마스터

3) 자식 푸시


0

마스터에서 브랜치를 업데이트하려면 :

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