Git에서 마스터에서 브랜치로 변경 사항 가져 오기


691

내 저장소에는 aq내가 일하고 있는 지점이 있습니다.

그런 다음에 새로운 작업과 버그를 해결했습니다 master.

커밋을 aq지점 으로 가져 오는 가장 좋은 방법은 무엇입니까 ? 다른 새 분기를 만들어서 master병합 aq하시겠습니까?


3
앞으로는 수정이 필요한 마스터 및 기타 분기의 공통 조상에서 버그 수정 분기를 시작할 수 있으므로 다른 항목을 선택하지 않고도 모든 분기에 병합 할 수 있습니다.
Cascabel

2
@Jefromi 그러나 그가 프로젝트에서 일하는 유일한 사람이 아니라면 그것은 통제 할 수 없습니다. 다른 사람들이 마스터를 업데이트합니다. 도대체 당신은 세 번째 지점에서 마스터를 업데이트 할 수 있으며 상황은 피할 수 없으며 일반적인 해결책이 필요합니다.
ahnbizcad

@ahnbizcad 나는 그가 자신의 지점을 시작하는 곳을 통제하고 있다고 확신합니다. 그의 지점이 합병하려는 공통 조상이고 사람들이 그 지점에 추가하면 여전히 공통 조상이됩니다.
Cascabel

얘들 아 질문,이 명령을 수행합니까git pull origin my_branch_name
Basheer AL-MOMANI

답변:


795

aq지점을 확인하고에서 베이스를 재설정하십시오 master.

git checkout aq
git rebase master

rebase는 다른 지점에서 올 수 있습니까? 즉. git rebase otherbranch? 내 질문에 조금 벗어난 것 같습니다. 지점에서 분기 한 다음 원래 지점을 변경했습니다.
Slee

2
올바른 경우 끌어 오기 요청을 다시 수행하면 모든 마스터 커밋이 표시됩니다. merge / origin 마스터를 사용하면 모든 마스터 커밋이 1 커밋으로 표시되어 코드 검토가 더 쉬워집니다.
Foo Bar 사용자

4
때로는 git merge더 나을 것입니다. 두 가지 모두 시간이 지남에 따라 진화했다면 어느 것이 가장 적합한 지 고려해야합니다.
erick2red

70

7
분기 aq에 대한 이전 커밋이 공개 인 경우 리베이스하지 마십시오. atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant 2012 년

301

당신은 git merge origin/master당신이 당신의 aq 지점에있을 때 할 수 있어야합니다 .

git checkout aq
git merge origin/master

55
rebase가 "더 나은"경우 특정 상황에 전적으로 의존합니다.
Bombe

13
왜 "git merge origin / master"대신 "git merge master"를 호출하지 않습니까?
Michael Küller

145
rebase지점이 로컬이고로 푸시되지 않은 경우에 사용하십시오 origin. merge지점이 이미 푸시 된 경우 사용하십시오 . rebase기록을 다시 작성합니다.
가비지 수집기

17
@Toskan 로컬 마스터가 리모컨에 최신이 아닌 문제가 발생할 수 있습니다. 이렇게하면 원격 코드 복사본에 병합됩니다.
Chris Kooken

8
@garbagecollector 나는 rebase에 반대하고 있습니다 (rebase는 할 수는 있지만 rebase하지는 않을 것입니다). 불필요하게 복잡하게 만듭니다. 당신은 항상 "나는 이것을 원격으로 밀었습니까?" 숙고하고 새로운 이민자에게 설명하는 것은 고통입니다. 어떤 사람들은 병합 커밋을 피한다고 말합니다. 그러나 병합 커밋을 원합니다 . 그것들은 혼란스럽지 않으며 분기가 병합 될 때 문서화합니다. 마지막으로, 우리 모두가 마스터하기 위해 노력하는 것처럼 행동을 멈출 수 있습니까? 로그에서 병합 커밋을 너무 싫어하는 경우 --no-merges로 필터링하십시오.
nurettin

92

먼저 마스터를 확인하십시오.

git checkout master

모든 변경, 핫픽스 및 커밋을 수행하고 마스터를 푸시하십시오.

지점 'aq'으로 돌아가서 마스터를 병합하십시오.

git checkout aq
git merge master

지점은 마스터와 함께 최신 상태가됩니다. 병합의 좋은 기본 예는 3.2 Git Branching-Basic Branching and Merging 입니다.


25

마스터 버그 수정이 다른 커밋 사이에 있지 않다는 보장은 없으므로 단순히 병합 할 수는 없습니다. 하다

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

이러한 커밋이 버그 수정을 나타낸다고 가정합니다.

이제부터는 버그 수정을 별도의 분기에 보관하십시오. 당신은 단지 할 수있을 것입니다

git merge hotfixes

그것들을 모두 정규 dev 브랜치에 롤백하고 싶을 때.


17

어느 cherry-pick지점에 해당 커밋 aq또는 병합 지점 master지점에 aq.


5
@Slee 당신은 자신에게 대답 ... 그것은이 상황에 대한 해결책이 아닙니다
mtet88

13

와 병합 aq

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push

8

쉬운 방법

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A

7

나에게 이미 변경 사항이 있었고 기본 지점에서 최신 버전을 원했습니다. 나는 할 수 없습니다 rebase, 그리고 cherry-pick내가 다음을했다, 그래서 영원히 걸렸을 것입니다 :

git fetch origin <base branch name>  
git merge FETCH_HEAD

따라서이 경우 :

git fetch origin master  
git merge FETCH_HEAD

7

이것은 ( 여기에서 ) 나를 위해 일했습니다.

git checkout aq
git pull origin master
...
git push

인용 :

git pull origin master마스터 브랜치의 내용을 가져와 브랜치와 병합하고 병합 커밋을 만듭니다. 병합 충돌 이있는 경우이 단계에서 알림을 받고 진행하기 전에 병합 커밋을 해결해야합니다 . 새 병합 커밋을 포함하여 로컬 커밋을 원격 서버에 푸시 할 준비가되면를 실행하십시오 git push.


특히 병합 이 필요한 경우, 즉 어떤 이유로 마스터 브랜치를 리베이스 할 수없는 경우이 솔루션은 완벽합니다 .
cudacoder

3

몇 가지 옵션이 있습니다. git rebase master aq커밋 이름을 유지하는 브랜치에 있지만 원격 브랜치 인 경우 리베이스하지 마십시오. git merge master aq커밋 이름 유지에 신경 쓰지 않으면 할 수 있습니다 . 커밋 이름을 유지하고 원격 브랜치 인 git cherry-pick <commit hash>경우 커밋은 브랜치 에 커밋됩니다.


0

한 줄을 실행하여이 작업을 수행 할 수도 있습니다.
git merge aq master

이것은

git checkout aq
git merge master

이것은 당신이 생각하는 것을하지 않습니다. git merge a b가지를 병합 a하고 b현재 지점에. 그러나 git merge a지점에 a있을 때 아무것도하지 않을 것입니다 (이것이 생각하고있는 것처럼하는 것처럼 보입니다). ( git-scm.com/docs/git-merge#Documentation/… 참조 )
MikeBeaton

0

편집하다:

문서 내 대답은 아래 병합하는 방법 master으로 aq당신이 그것을에 변경 사항이 나열 병합의 세부 볼 경우, aq병합 이전이 아니라 변화에했다 master. 나는 그것이 당신이 생각한다고해도 그것이 당신이 원하는 것이 아니라는 것을 깨달았습니다!

다만:

git checkout aq
git merge master

괜찮습니다.

예,이 간단한 병합 보여줄 것의 변경 master에 수행 된 aq그 시점에서, 원형이 아닌 다른 방법; 그러나 그것은 괜찮습니다 – 그것이 일어난 일이기 때문입니다! 나중에 분기를 master에 병합 할 때, 즉 병합에서 최종적으로 모든 변경 사항이 표시되는 시점 master(정확히 원하는 것, 사람들이 해당 정보를 찾을 것으로 예상되는 커밋)입니다.

나는 확인하고 한도 정확히 쇼 같은 변경 (에 모든 변경 사항 아래의 방법 aq때문에 원래 사이의 분할 aqmaster당신이 마지막으로 병합 모든 것을 다시 위의 정상적인 방법 등) master. 그래서 유일한 단점은 (복잡하고 비표준 ... :-/을 제외하고는) 최근의 변경 사항을 뒤로 되돌리고 git reset --hard HEAD~<n>병합을 지나면 아래 버전이 롤백 된다는 것입니다 . '잘못된'브랜치. 손으로 수정해야합니다 (예 : git reflog& git reset --hard [sha]).


[그래서 내가 이전에 생각한 것은 :]

문제가 있습니다 :

git checkout aq
git merge master

병합 커밋에 표시된 변경 사항 (예 : Github, Bitbucket 또는 자주 사용하는 로컬 git history viewer에서 지금 또는 나중에 보는 경우)이 마스터에서 변경 한 것이므로 원하는 것은 아닐 수도 있습니다.

반면에

git checkout master
git merge aq

아마도 이는 AQ에서 만든 프로그램의 변경 입니다 당신이 원하는 무엇을. (또는 적어도 내가 원하는 것입니다!) 그러나 올바른 변경을 보여주는 병합은 잘못된 브랜치에 있습니다!

대처하는 방법?!

전체 프로세스는 aq에 대한 변경 사항 (위의 두 번째 병합에 따라)을 표시하는 병합 커밋으로 끝나지만 aq 분기에 영향을 미치는 병합은 다음과 같습니다.

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

이것은 aq를 마스터에 병합하고 aq와 동일한 병합을 빨리 전달하고 마스터에서 실행 취소 한 다음 다시 aq로 되돌립니다!

뭔가 빠진 것 같은 느낌이들 것입니다. 이것은 분명히 원하는 것 같고 어려운 것 같습니다.

또한 리베이스는 동일하지 않습니다. aq에 대한 커밋의 타임 스탬프와 신원을 잃어 버렸습니다.이 또한 내가 원하는 것이 아닙니다.


0

시나리오 :

  • 나는 master-1에서 branch-1을 작성하여 로컬로 가져 왔습니다.
  • 내 친구는 master say branch-2에서 지점을 만들었습니다.
  • 그는 몇 가지 코드 변경 사항을 마스터에 적용했습니다.
  • 이제 마스터 브랜치에서 로컬 브랜치로 이러한 변경 사항을 적용하고 싶습니다.

해결책

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

"git stash apply"를 실행 한 후 파일에서 충돌을 찾을 수 있습니다. 수동으로 수정해야하며 이제 푸시 할 준비가되었습니다.

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