programing

Git merge는 차이가 있지만 "이미 최신"이라고 보고합니다.

linuxpc 2023. 5. 6. 14:06
반응형

Git merge는 차이가 있지만 "이미 최신"이라고 보고합니다.

나는 마스터와 테스트라는 두 개의 브랜치가 있는 git 저장소를 가지고 있습니다.

마스터 분기와 테스트 분기 간에 차이가 있습니다.

두 분기 모두 변경 사항이 커밋되었습니다.

내가 할 경우:

git 체크아웃 마스터
git diff test

변경사항으로 가득 찬 화면이 나타나 차이점을 보여줍니다.테스트 분기의 변경 사항을 병합하고 다음을 수행합니다.

git 병합 테스트

그러나 "이미 최신 상태" 메시지가 표시됩니다.

그러나 각 분기별로 파일을 검사하면 차이가 분명히 나타납니다.

여기서 어떤 문제가 있으며 어떻게 해결해야 합니까?

"이미 최신" 메시지는 병합하려는 분기의 모든 변경사항이 현재 있는 분기에 이미 병합되었음을 의미합니다.더 구체적으로 말하면 병합하려는 분기가 현재 분기의 상위 항목임을 의미합니다.축하해요, 그게 당신이 할 수 있는 가장 쉬운 합병이에요. :)

사용하다gitk저장소를 확인할 수 있습니다."테스트" 분기의 레이블은 "마스터" 분기 레이블 아래에 있어야 합니다.

분기가 상위 항목과 관련하여 최신 상태입니다.병합에 따르면 마지막 병합 이후 상위 항목에 새 변경 사항이 없습니다.이는 분기가 같다는 것을 의미하지 않습니다. 작업 분기에 많은 변경 사항이 있을 수 있고 변경 사항이 있는 것처럼 들리기 때문입니다.

2019년 10월 12일 편집:

이 답변에 대한 논평에서 찰스 드레이크는 문제를 해결하기 위한 한 가지 해결책은 다음과 같습니다.

git checkout master
git reset --hard test

그러면 '테스트' 수준으로 돌아갑니다.

다음을 수행합니다.

git push --force origin master

중앙 보고에 변경 사항을 다시 적용하기 위해.

마스터에 사항이 것을 때 는 원격마스변사있것다는알을있고때을자합다이니일병고려다하사를합여용하음을이므로발생는하주터에경항이▁▁using▁this,▁on다합▁try▁merge▁master원▁to격니▁the▁remote▁so▁i▁when▁to▁often▁changes▁i▁there▁are▁me를 사용하여 병합하려고 합니다.git merge master그러나 이것은 원격 마스터와 병합되지 않고 로컬 마스터와 병합됩니다.

merge,master를 나서 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠgit pull그러면 새 변경사항을 분기에 병합할 수 있습니다.

.master다음 커밋 기록을 사용합니다.

A -- B -- C -- D

이제 분기 테스트를 생성하고 작업한 다음 4개의 커밋을 수행합니다.


                 E -- F -- G -- H
                /
A -- B -- C -- D

master의 머리는 D를 가리키고, 그리고test는 H 머리를 H니다가리킵는을 가리킵니다

병합할 분기의 HEAD가 병합할 분기의 커밋 체인의 상위일 때 "이미 최신" 메시지가 표시됩니다.그렇습니다, 여기 있습니다.D는 의부니다의 입니다.E.

에서 병합할 것은 .testmaster아무것도 변하지 않았기 때문에master그 이후로당신이 여기서 하고 싶은 것은 말 그대로 Git에게 그것을 가지라고 말하는 것입니다.masterH를 과 같은커밋

A -- B -- C -- D -- E -- F -- G -- H

이 작업은 Git 명령 작업입니다. 작업 디렉터리에 이 변경 사항이 반영되도록 하려면 하드 리셋을 수행합니다.

git reset --hard H

이것이 저에게 효과가 있는 것입니다.를 들어, 예들어이, 신당를이 있다고 해 보겠습니다.branch1그리고 당신은 그것을 합병하기를 원합니다.branch2.

git 명령줄을 열고 branch2의 루트 폴더로 이동하고 다음을 입력합니다.

git checkout branch1
git pull branch1
git checkout branch2
git merge branch1
git push

갈등이 , 을 먼저 하세요.git push.

git merge origin/master에 신대git merge master저를 위해 일했습니다.마스터를 피쳐 분기에 병합하려면 다음을 사용합니다.

git checkout feature_branch
git merge origin/master

병합할 분기를 먼저 체크아웃한 다음 풀합니다(로컬 버전이 원격 버전과 일치하도록).

그런 다음 병합을 수행할 지점으로 다시 체크아웃하면 Git 병합이 작동합니다.

병합할 분기의 로컬 복사본이 오래되었기 때문에 이 문제가 발생합니다.나는 내 지점을 가지고 있습니다, 전화를 받았습니다.MyBranch그리고 나는 그것을 병합하고 싶습니다.ProjectMaster.

_>git status
On branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

nothing to commit, working tree clean

_>git merge ProjectMaster
Already up-to-date.

하지만 합병해야 할 변경 사항이 있다는 것은 알고 있습니다!

제가 타이핑을 할 때, 이것이 있습니다.git merge ProjectMasterGit는 이 지점의 로컬 복사본을 봅니다. 이 지점은 최신 상태가 아닐있습니다.이게 사실인지 확인하기 위해 먼저 Git에게 제 지점이 오래되었는지 확인하고 변경사항이 있는지 확인하라고 말합니다.fetch그런 다음 병합할 지점으로 이동하여 무슨 일이 일어나고 있는지 확인합니다.

_>git fetch origin

_>git checkout ProjectMaster
Switched to branch ProjectMaster
**Your branch is behind 'origin/ProjectMaster' by 85 commits, and can be fast-forwarded.**
  (use "git pull" to update your local branch)

아하! 내 지역 사본은 85개의 커밋으로 진부해요, 그것이 모든 것을 설명해 줍니다!저는 이제Pull내가 놓친 변화들을 따라 내려가, 그리고 나서 위로 뛰어갑니다.MyBranch병합을 다시 시도합니다.

_>git pull
Updating 669f825..5b49912
Fast-forward

_>git checkout MyBranch-Issue2
Switched to branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

_>git merge ProjectMaster
Auto-merging Runbooks/File1.ps1
CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1

Automatic merge failed; fix conflicts and then commit the result.

그리고 또 다른 문제를 해결해야 합니다...

은 항상 커밋( 태그 간에 .
인덱스 파일은 시작할 때 HEAD 커밋의 트리(즉, 마지막 커밋의 내용)와 일치해야 합니다.
다른말하면로,하면,git diff --cached HEAD변경 사항을 보고하지 않아야 합니다.

합된커이있습니에 .HEAD이것은 "이미 최신"이라고 불리는 가장 간단한 경우입니다.

커밋은 되므로, 테, 스, 즉트인중마서에스이만지로수다므행되서에마스,git diff test여전히 약간의 차이가 있을 것입니다.

제게 일어났고 이 페이지로 보내졌습니다. 제가 같은 시나리오를 가지고 있는지는 모르겠지만, 제가 그 "테스트" 브랜치를 "재결합"하려고 했던 것입니다.

그래서 이전에 병합했지만 병합 과정에서 일부 특정 변경 사항을 의도적으로 제외했기 때문에 분기 간에 분명히 차이가 있습니다.그런 다음 다시 병합해야 한다는 것을 깨닫고 잊어버리고 이전에 제외했던 특정 변경/파일을 추가하려고 했습니다. 다시 병합하면 이전에 제외했던 모든 변경 내용이 표시되기를 바랐지만, 제가 잘못했고 대신 "이미 최신" 메시지가 표시됩니다.

@Bombe의 의견/답변을 읽고, 그가 옳으며, Git는 그렇게 행동한다고 생각합니다. 그래서 제가 한 일은 테스트 브랜치에 있는 파일을 하드 백업한 다음 마스터 브랜치를 체크아웃하고 수동으로 파일을 그 안에 붙여넣은 다음 새로운 변경 사항인 것처럼 커밋한 것입니다.

이것이 올바른 방법인지 아니면 이와 같은 문제를 가진 다른 사람들에게 도움이 될 수 있는지 확신할 수 없지만, 그것은 제 특정 사례에 대한 해결책을 제공했습니다.

GIT는 이상하게도 로컬 지점이 원격 지점과 다르다고 생각했기 때문에 이런 일이 발생했습니다.이는 분기 그래프에서 확인할 수 있습니다. 즉, 원격/원점/지점_이름 및 branch_name이라는 두 개의 서로 다른 분기를 표시했습니다.

솔루션은 로컬 레포를 제거하고 원격에서 다시 복제하는 것이었습니다.하다는 것을 할 수 , 저는 "branch_name"을 할 수 .git merge branch_name.

rm <my_repo>
git clone <my_repo>
cd <my_repo>
git checkout <branch_name>
git pull
git checkout master
git merge <branch_name>

분기 A를 분기 B로 병합하는 경우 "이미 최신 상태"가 보고되면 역방향이 항상 참인 것은 아닙니다.지점 B가 지점 A의 하위인 경우에만 해당되며, 그렇지 않은 경우에는 지점 B가 단순히 A에 없는 변경 사항을 가질 수 있습니다.

예:

  1. 마스터에서 분기 A 및 B를 생성합니다.
  2. 마스터에서 일부 변경 사항을 적용하고 이러한 변경 사항을 B 지점에만 병합합니다(A 지점 업데이트 또는 업데이트를 잊지 않음).
  3. 당신은 A 지점에서 몇 가지를 변경하고 A를 B로 병합합니다.

이 시점에서 A를 B로 병합하면 "이미 최신 상태"가 보고되지만 B 지점에는 마스터의 업데이트가 있는 반면 A 지점에는 업데이트가 없기 때문에 분기가 다릅니다.

Git Bash를 사용하여 이 시나리오에 직면했습니다.

저장소에는 여러 개의 분기가 있으며 각 분기마다 커밋 주기가 다르며 병합이 가끔 발생합니다.New_Branch의 상위 항목으로 Old_Branch가 사용되었습니다.

Old_Branch가 New_Branch와 병합해야 하는 일부 변경 사항으로 업데이트되었습니다.

모든 분기에서 모든 소스를 가져오기 위해 분기 없이 아래 pull 명령을 사용했습니다.

git pull 기원

이상하게도 이것이 모든 지점에서 모든 커밋을 끌어내지는 못합니다.표시된 것이 거의 모든 지점과 태그를 보여주기 때문에 그렇게 생각했습니다.

따라서 이 문제를 해결하기 위해 Old_Branch가 다음을 사용하여 최근에 가져온 것을 확인했습니다.

git checkout Old_Branch

git pull origin Old_가지

이제 New_Branch에서 체크아웃했습니다.

git checkout New_Branch

확실히 하기 위해 당겼습니다.

깃뽑기 원산지 New_Branch

git merge Old_Branch

그리고 Viola는 Old_Branch에서 New_Branch로 수정해야 할 충돌을 얻었습니다 :) 예상했습니다.

저도 같은 문제가 있었습니다.리모컨에 변경 사항이 있는데 "이미 최신 상태"로 표시됩니다.저장소를 다시 복제하여 문제를 해결했습니다.

이것은 사소한 것처럼 보일 수 있지만 저는 많은 사람들이 그것을 그리워하고 그냥 하는 것을 보았습니다.git merge모 지점에 있는 동안.그러면 자동으로 "이미 최신" 메시지가 표시됩니다.

는 " 병명령다같합니야다아"가 되어야 합니다.git merge branchNametoMergeFrom

예를 들어, 분기 A와 분기 B가 두 개 있고 B를 A로 병합해야 한다고 가정합니다.먼저 Branch A체크아웃한 다음 merge 명령을 사용하여 이 경우 Branch B에서 병합할 분기를 지정해야 합니다.

따라서 명령이 정당하지 않아야 합니다.git merge하지만 그래야 합니다. git merge branchB.

다음은 병합 기록에 관계없이 다른 분기에서 변경 사항을 가져오는 방법입니다(CAREful: 이렇게 하면 작업 트리가 지워지므로 변경 사항을 저장하거나 커밋한시도하십시오).

// stash changes to ensure you don't lose any edits
git checkout your-branch-that-won't-simply-merge
git stash


git checkout branch-with-changes -- .

git checkout에 대한 -- . 인수는 동일한 분기로 체크아웃되는 동안 다른 분기에서 모든 파일을 체크아웃합니다.그런 다음 원하는 대로 추가하고 커밋할 수 있습니다.

저는 이것도 함께 사용했습니다.git add -p그러면 "허크"에서 변경 사항을 준비할 수 있습니다.변경된 라인 덩어리를 스테이징할지 여부를 y/n에 묻습니다. 즉, 다음 커밋에서 원하지 않는 변경 사항을 남길 수 있습니다.

여기 제가 찾은 원답의 링크가 있습니다, 좋아요를 주세요.: https://stackoverflow.com/a/15536640/8272035

89개의 투표가 "현재 경로를 제공함으로써 가능"합니다. .:

git checkout other-branch-name -- .

이 작업은 파일을 체크아웃하지 않고 "다른 방향"에서만 HEAD를 다른 분기로 전환하는 것과 유사합니다.

@민준에서 언급했듯이 커밋되지 않은 변경사항은 덮어씁니다.필요하면 먼저 숨겨두거나 어딘가에 약속하는 것을 기억하세요." by @Kache

저도 마찬가지였습니다.하지만 시나리오는 조금 달랐고, 마스터 브랜치가 있었고, 그 중에서 release_1(say)을 잘라냈습니다.release_1 분기를 일부 변경하여 오리진에 병합했습니다.그런 다음 SSH를 수행하고 원격 서버에서 git checkout -b release_1 명령을 사용하여 release_1을 다시 체크아웃합니다. 이 명령은 이미 존재하는 branch release_1을 origin에서 체크아웃하는 것이 아니라 실제로 마스터에서 새 branch release_1을 잘라냅니다."-b" 스위치를 제거하여 문제 해결

어리석지만 그럴 수도 있습니다. 참조: " " " " " ")가 붙었다고 합니다.#91-fix-html-markup이하면 다음과 같습니다.

$ git merge #91-fix-html-markup

그것은 의도한 대로 작동하지 않을 것입니다. 왜냐하면 모든 것이 끝난 후이기 때문입니다.# 왜냐하면 무됩니, 왜하면 때문입니다.#인라인 주석을 시작합니다.

에는 " " " " " 을 한 분기의 할 수 .#이름을 .git merge '#91-fix-html-markup'.

현재 분기에서 변경 사항을 커밋한 다음 오리진 분기에서 병합이 작동했습니다.

저는 현재 지점을 자체적으로 재배치하는 문제를 해결했습니다.

제 경우에 어떤 문제가 있었는지는 정확히 알 수 없지만, 문제의 근원은 그것인 것 같습니다.branchB 체아했다에서 사항을 수 . 에서 최신 변경 사항을 가져올 수 없습니다.branchA...

체크아웃을 해야 했습니다.branchA,pull,그리고나서checkout branchB그리고.merge branchA예상대로 작동하기 위해서입니다.

다음 명령을 실행합니다.

git checkout master
git pull
git fetch --all
git rebase --abort

git checkout test
git pull
git reset --hard  
git merge origin master

대부분 기본 재배치를 사용하거나 이미 병합 분기를 사용하는 경우 섀도 히스토리가 있으며, 분기를 지우거나 재설정하면 파일에서 병합 항목을 가져오는 데 도움이 됩니다.

다시 병합하는 방법이 있습니다. 마스터하려면 릴리스 분기를 병합해야 합니다.

상태: 릴리스 분기 코드가 황금색입니다. 즉, 마스터는 잘못된 반면 릴리스 분기는 올바른 것입니다.

증상:릴리스를 마스터에 병합할 때 마스터의 잘못된 부품이 릴리스된 부품으로 업데이트되지 않습니다.

여기에 단계, 거부권이 있습니다. 깃에 대한 제 지식은 제한적이며, 그것을 달성하는 더 나은 방법이 있어야 합니다.

  1. 릴리스 분기 체크아웃, 풀링을 수행합니다.[커밋 #A]
  2. 최신 마스터를 릴리스에 병합 [Commit #B](잘못된 파일이 릴리스 분기에 기록됨)
  3. [Commit #B]의 역커밋을 수행하지만 단계를 유지합니다(예비 커밋이 [Commit #C]로 커밋된 경우 Commit #B로 소프트 재설정). (기본적으로 잘못된 파일을 되돌립니다)
  4. 파일 편집, 파일이 올바른지 확인, 원하지 않는 파일 삭제(있는 경우)
  5. 4단계의 변경 내용 저장 [Stash{X}]
  6. 릴리스를 다시 커밋 #A로 재설정(원격과 동일)
  7. 최신 마스터를 병합하여 다시 릴리스 [Commit #D](diff 해시는 동일해야 하지만 커밋 해시는 b와 달라야 함)
  8. 스택 {x} 적용
  9. 마스터에 커밋하고 병합합니다.

편집: Prat 리모컨을 사용해야 하는 경우 의도한 부품이 적용되었는지 확인하기 위해 9단계를 로컬에서 수행할 수 있습니다.

안녕하세요, 제가 전화한 깃 별칭을 만들었습니다.git remerge문제를 해결하는 데 도움이 됩니다.

  1. 그것이 먼저일 것입니다.git merge <FEATURE-BRANCH-NAME>.
  2. 그런 다음 분기 간에 서로 다른 파일의 모든 충돌을 다시 계산합니다.

여기서 사용할 수 있습니다!

제안이 있거나 프로젝트에 기여하고 싶다면 언제든지 환영합니다!

언급URL : https://stackoverflow.com/questions/634546/git-merge-reports-already-up-to-date-though-there-is-a-difference

반응형