ProgramingTip

마스터 브랜치와 '원산지 / 마스터'가 갈라 졌는데 어떻게 브랜치를 '해제'할까요?

bestdevel 2020. 9. 28. 09:37
반응형

마스터 브랜치와 '원산지 / 마스터'가 갈라 졌는데 어떻게 브랜치를 '해제'할까요?


어떻게 든 내 마스터와 내 원산지 / 마스터 브랜치가 갈라졌다. 나는 실제로 갈라지는 것을 발표합니다. 비용 차이점을보고 '병합해야합니까?


다음을 사용 하여 차이점검토 할 수 있습니다 .

git log HEAD..origin/master

전에 잡아 당겨 (+ 병합을 가져 오기) (참조 : "? 항상 특정 지점에서 당겨에 당신이 자식을 어떻게합니까 " )


다음과 같은 메시지가있는 경우 :

"당신의 브랜치와 '원산지 / 마스터'가 갈라졌고, 1 개와 1 개의 다른 커밋을 가지고 있습니다."

, 업데이트 가 필요한지origin 확인하십시오 . origin최신 인가 경우 origin로컬에서 직접 커밋을 수행하는 동안 일부 커밋이 다른 리포지토리에서 푸시되었습니다 .

... o ---- o ---- A ---- B  origin/master (upstream work)
                   \
                    C  master (your work)

그 업스트림에서 최신 작업이기 때문에 커밋 A에 커밋 C를 기반으로했습니다.

그러나 원점으로 되돌리려 고 시도하기 전에 다른 사람이 커밋 B를 푸시했습니다.
개발 기록이 별도의 경로로 추가되었습니다.

그런 다음 병합하거나 리베이스 할 수 있습니다. 자세한 내용은 Pro Git : Git 분기-리베이스 를 참조하십시오.

병합

git merge 명령을 사용하십시오.

$ git merge origin/master

이 Git에게 변경 사항을 origin/master작업 에 통합하고 병합 커밋을 생성하도록 지시 합니다.
이제 역사 그래프는 다음과 가변합니다.

... o ---- o ---- A ---- B  origin/master (upstream work)
                   \      \
                    C ---- M  master (your work)

새로운 병합 커밋 M에는 해당 커밋에 상위 콘텐츠로 이어지는 하나의 개발 경로를 두 개의 상위가 있습니다.

M 숨겨진 역사는 이제 비선형입니다.

리베이스

git rebase 명령을 사용하십시오.

$ git rebase origin/master

이 Git에게 마치 A 대신 커밋 B를 기반으로 한 것처럼 커밋 C (귀하의 작업)를 재생하도록 지시합니다.
CVS 및 Subversion 사용자는 커밋 전에 업데이트 할 때 업스트림 작업 위에 많은 로컬 변경 사항을 리베이스합니다.
Git은 커밋과 리베이스 단계 사이에 명시적인 분리를 추가합니다.

이제 역사 그래프는 다음과 가변합니다.

... o ---- o ---- A ---- B  origin/master (upstream work)
                          \
                           C'  master (your work)

Commit C '는 git rebase 명령으로 생성 된 새 커밋입니다.
두 가지면에서 C와 많이.

  1. 그것은 다른 역사를 가지고 있습니다 : A 대신 B.
  2. 그 내용은 B와 C 모두의 변화를 설명합니다. 병합 예제의 M과 동일합니다.

C '이면의 역사는 여전히 선형 적입니다.
에서 선형 히스토리 만 허용하도록 (현재) 선택했습니다 cmake.org/cmake.git.
이 접근 방식은 이전에 사용 된 CVS 기반 워크 플로우를 보존하고 전환을 쉽게 할 수 있습니다.
C '를 저장소로 푸시하려는 시도가 작동합니다 (권한이 있고 리베이스하는 동안 아무도 푸시하지 않고 가정).

git pull 명령은 오리진에서 가져오고 로컬 작업을 리베이스하는 간단한 방법을 제공합니다.

$ git pull --rebase

이 위의 가져 오기 및 리베이스 단계를 하나의 명령으로 결합합니다.


나는 "내가 가지고있는 응답을 읽은 후에도 무엇인지에 대해 미스터리했습니다. 내 해결책은

git reset --hard origin/master

그런 다음 (원격) 원점 / 마스터로 표시되는 올바른 지점으로 마스터의 (로컬) 복사본 (내가 망친 가정)을 설치합니다.

경고 : 아직 푸시되지 않은 모든 변경 사항이 손실됩니다 origin/master.


git pull --rebase origin/master 

대부분의 경우 도움이 될 수있는 단일 명령입니다.

편집 : 오리진 / 마스터에서 커밋을 가져오고 새로 가져온 브랜치 기록에 변경 사항을 적용합니다.


원격 브랜치를 추적하는 브랜치 리베이스 하려고 할 때 이런 상황에 처했고 마스터에서 리베이스하려고했습니다. 이 시나리오에서 리베이스를 시도하면 브랜치가 갈라져서 git nubees가 아닌 엉망이 될 수 있습니다!

마스터에서 분기 된 my_remote_tracking_branch 분기에 있다고 가정 해 보겠습니다.

$ git status

# my_remote_tracking_branch 브랜치에서

커밋 할 항목 없음 (작업 디렉터리 정리)

이제 마스터에서 다음과 같이 리베이스하려고합니다.

자식 리베이스 마스터

지금 중지하고 문제를 해결하십시오! 대신 다음과 같이 병합을 사용하십시오.

자식 병합 마스터

예, 분기에 추가 커밋이 발생합니다. 그러나 "분할 해제"브랜치가 아니라면 리베이스보다 훨씬 더 부드러운 워크 플로우가 될 것입니다. 더 자세한 설명 이 블로그참조하십시오 .

당신의 지점 만있는 경우 반면에, 지역 지점은 확실히 REBASE을 수행해야합니다 (즉, 아직 원격 푸시되지 않음) (그리고 분기되지 않습니다 분기 이 경우).

당신이 이것을 읽고 있다면 지금 당신은 이미 때문 이다 시나리오 등 REBASE 때문에, 다시 마지막에 얻을 수 있습니다 사용하여 (미 - 갈라 상태 즉) 원점에서 커밋 "분기"에서 :

git reset --hard origin / my_remote_tracking_branch


제 경우에는 분기 메시지 를 발생시키기 위해 제가 한 일이 있습니다 . 제가 git push했지만 git commit --amend커밋 메시지에 무언가를 추가했습니다. 그리고 또 다른 커밋을했습니다.

그래서 제 경우에는 단순히 원산지 / 마스터가 구식임을 의미했습니다. 나는 아무도 다른 감동 원산지 / 마스터 없었다 알고 있기 때문에, 수정 사소한했다 : git push -f(여기서 -f수단의 힘)


제 경우에는 변경 사항을 푸시 origin/master한 다음 그렇게하면 안된다는 것을 깨달았습니다. :-( 이것은 로컬 변경 사항이 하위 트리에 있다는 사실로 인해 복잡해졌습니다. 그래서 "나쁜"로컬 이전의 마지막 좋은 커밋으로 돌아갔습니다. (SourceTree 사용) 변경하고 "분산 메시지"를 받았습니다.

내 문제를 로컬에서 수정 한 후 (여기에서는 세부 사항이 중요하지 않음) 원격 origin/master브랜치를 "시간을 거슬러 올라가"원격 브랜치가 로컬과 master다시 동기화되도록하고 싶었 습니다. 제 경우의 해결책은 다음과 같습니다.

git push origin master -f

-f(강제) 스위치에 유의하십시오 . 이로 origin/master인해 실수 로 푸시 된 "잘못된 변경 사항"이 삭제 되었으며 이제 로컬 및 원격 분기가 동기화됩니다.

이 작업은 잠재적으로 파괴적인 작업이므로 원격 마스터를 제 시간에 "이동"하는 것이 정상인지 100 % 확신하는 경우에만 수행하십시오.


차이점을 보려면 :

git difftool --dir-diff master origin/master

그러면 두 분기 간의 변경 사항이나 차이점이 표시됩니다. araxis (내가 좋아하는)에서는 폴더 diff 스타일로 표시합니다. 변경된 각 파일을 표시합니다. 그런 다음 파일을 클릭하여 파일의 변경 사항에 대한 세부 정보를 볼 수 있습니다.


여기에 많은 답변이 있다는 것을 알고 있지만 , 분산 된 상태를 해결하는 동안 git reset --soft HEAD~1마지막 로컬 (푸시되지 않은) 커밋의 변경 사항을 유지할 수 있기 때문에 약간의주의를 기울일 가치가 있다고 생각 합니다. rebase로컬 커밋을 검토하고 다른 브랜치로 옮길 수도 있기 때문에 이것이 pull with보다 다재다능한 솔루션이라고 생각합니다 .

열쇠는 --soft가혹한 대신 사용하는 것입니다 --hard. 커밋이 2 개 이상인 경우 변형 HEAD~x이 작동합니다. 내 상황을 해결 한 모든 단계는 다음과 같습니다 (원격에 1 개의 로컬 커밋과 8 개의 커밋이 있음).

1) git reset --soft HEAD~1 로컬 커밋을 취소합니다. 다음 단계에서는 SourceTree의 인터페이스를 사용했지만 다음 명령도 작동해야한다고 생각합니다.

2) git stash 1)에서 변경 사항을 숨 깁니다. 이제 모든 변경 사항이 안전하며 더 이상 차이가 없습니다.

3) git pull 원격 변경 사항을 가져옵니다.

4) git stash pop 또는 git stash apply마지막 숨김 변경 사항을 적용한 다음 원하는 경우 새 커밋을 적용합니다. 이 단계는 로컬 커밋의 변경 사항을 폐기하려는 경우 2) 와 함께 선택 사항입니다. 또한 다른 브랜치로 커밋하고자 할 때 원하는 브랜치로 전환 한 후이 단계를 수행해야합니다.


제 경우에는 분쟁 해결을하지 않았기 때문에 발생했습니다.

git pull명령 을 실행하여 문제가 발생했습니다 . 원본이 변경되면 로컬 저장소와 충돌이 발생하여 해결했습니다. 그러나 나는 그들을 저 지르지 않았습니다. 이 시점에서 해결책은 변경 사항 ( git commit해결 된 파일) 을 커밋하는 것입니다.

충돌을 해결 한 후 일부 파일도 수정 한 경우 git status명령은 로컬 수정 사항을 미 단계 로컬 수정으로 표시하고 병합 해결을 단계적 로컬 수정으로 표시합니다. 이 문제는 먼저에 의해 병합에서 변경 사항을 커밋 git commit한 다음 평소와 같이 단계되지 않은 변경 사항을 추가하고 커밋하여 올바르게 해결할 수 있습니다 (예 :) git commit -a.


이미 푸시 된 커밋의 마지막 커밋 메시지를 편집하려고 할 git commit --amend -m "New message"다음을 사용하여 동일한 메시지 git push --force-with-lease repo_name branch_name가 표시되었습니다. 변경 사항을 푸시 할 때 아무런 문제가 없었습니다.


분기 A를 기반으로 분기를 만들 때이 문제를 만났습니다.

git checkout -b a

그런 다음 분기 a의 업스트림을 원본 분기 B로 설정합니다.

git branch -u origin/B

그런 다음 위의 오류 메시지가 나타납니다.

이 문제를 해결하는 한 가지 방법은

  • 브랜치 삭제
  • 새 분기 만들기 b by
git checkout -b b origin/B

참고 URL : https://stackoverflow.com/questions/2452226/master-branch-and-origin-master-have-diverged-how-to-undiverge-branches

반응형