2016-10-18 5 views
0

병합 충돌을 해결하고 이전 코드베이스로 되돌아가 이전의 작동 방식을 파악해야했습니다. 직관적으로 작업 복사본을 숨기고, 내가 원하는 것을 선택하고 은닉을 적용했습니다. 이제 코드가 저장 되었기 때문에 많은 문제가 있습니다. 터미널의 분기 이름 옆에 |MERGING이 더 이상 나타나지 않으며 다른 분기에서 모든 커밋을 잃어 버렸습니다. git의 경우 병합 커밋처럼 보이지 않지만 새로운 코드가 변경됩니다.git stash unresolved merge conflicts

내가 잘못했거나 나중에 같은 문제가 발생하지 않도록하려면 어떻게해야합니까?

참고 : 우리는 2 개의 다른 repos에서 작업 중이며 때때로 서로 병합해야하기 때문에이 옵션을 그대로 사용하는 것은 옵션이 아닙니다. 병합 중 체크섬을 변경하면 다음 병합 git에서 이전에 병합 된 코드를 인식하지 못하기 때문에 엄청난 양의 충돌이 발생합니다. 동일한 저장소를 여러 번 병합하는 것이 여러 번 병합되는 것처럼 보입니다. 체크섬은 그대로 유지해야합니다.

답변

1

커밋을 통해 git stash이 (가) 작동하므로 아무 것도 추가되지 않습니다. 당신이 충돌 병합의 중간에 있다면, 당신은 커밋을 할 수 없습니다

내가 병합 충돌을 해결했다

... 나는 직관적으로 내 작업 복사본을 은닉, 따라서 당신은 할 수 없습니다 : 당신은 말했다 git stash 사용

... [set up some conflicts; get onto branch b2, with b1 ready to conflict] 

$ git add README && git commit -m 'b2-readme' 
[b2 c548973] b2-readme 
1 file changed, 1 insertion(+) 
$ git merge b1 
Auto-merging README 
CONFLICT (content): Merge conflict in README 
Automatic merge failed; fix conflicts and then commit the result. 
$ git status 
On branch b2 
You have unmerged paths. 
    (fix conflicts and run "git commit") 

Changes to be committed: 

    new file: file1 

Unmerged paths: 
    (use "git add <file>..." to mark resolution) 

    both modified: README 
$ git stash 
README: needs merge 
README: needs merge 
README: unmerged (af8a7b1af61c4d6a71415c41d0f19a418d5a1e3c) 
README: unmerged (1eafc235a9f2cb59959d554ba9b9e11877c88349) 
README: unmerged (7616840fd1336b8bcae3f33e2c6c69890e563121) 
fatal: git-write-tree: error building trees 
Cannot save the current index state 

당신은 충돌을 해결해야 감춰 실제로 일어날 수 있도록. 힘내는 물론, 당신이 그들을 해결하는 방법을 상관하지 않는다 :

$ cat README 
We put a dummy README file into the base, 
to get an initial commit. 
<<<<<<< HEAD 
conflicting b2 change 
||||||| merged common ancestors 
======= 
conflicting change in b1 
>>>>>>> b1 
$ git add README # Yuck! "resolve" conflicts by leaving markers 
$ git status --short 
M README 
A file1 
$ git stash 
Saved working directory and index state WIP on b2: c548973 b2-readme 
HEAD is now at c548973 b2-readme 

을이 오히려 내 바보 예보다, 갈등과 재치있는 뭔가를하고있는 동안 - 아마도 무슨 짓을했는지 경우 여기에 - 그리고 당신은 이런 짓을 :

$ git stash pop # NB: better to "git stash apply" really 
On branch b2 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

    new file: file1 

Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: README 

Dropped refs/[email protected]{0} (8a947fcd34b3259fbb2fbf667bc0b99cc139a88c) 

당신은 일종의 문제지만 너무 많지는 않습니다. 문제는 이제 색인 및 작업 트리에 성공한 (성공한 경우) git stash 상태를 가지고 있지만 병합 상태 파일 (.git/MERGE_HEAD 및)을 잃어버린 것입니다.

참고 : 우리는 2 개의 다른 repos에서 작업 중이며 때때로 서로 병합해야하기 때문에 옵션을 그대로 사용하는 것은 옵션이 아닙니다.

커밋은 실패와 마찬가지로 always an option입니다! 이 경우, 예를 들어, 트릭은 지금 결과를 커밋하고 돌아가서 병합을 다시 시작하는 것입니다. 때문에 망할 놈에 지사의 혼란 성격의

, 그것은 더 이상 를 저지 포함하지 b2 지금이 권리를 위탁하고 b2 (이름을)하는 것이 가능합니다. 그러나 새로운 지점 이름을 먼저 만드는 것이 쉽거나 더 쉽고 분명히 덜 혼란 스럽습니다. 그렇다면 b2이 아닌 커밋을 할 수 있습니다.

$ git checkout -b save-merge-result 
M README 
A file1 
Switched to a new branch 'save-merge-result' 

# NOTE: use "git status" (not shown here) to see what you 
# still need to "git add" (which is `README` in my case) 

$ git add README 
$ git commit -m 'save merge result on temp branch' 
[save-merge-result f8b2251] save merge result on temp branch 
Date: Tue Oct 18 05:58:14 2016 -0700 
2 files changed, 20 insertions(+) 
create mode 100644 file1 

이제 다시 b2에 가서 물론 다시 충돌로 실패합니다 git merge을 다시 할 수 있습니다

$ git checkout b1 
Switched to branch 'b1' 
$ git merge b2 
Auto-merging README 
CONFLICT (content): Merge conflict in README 
Automatic merge failed; fix conflicts and then commit the result. 

1

지금 임시 병합의 결과를 추출 할 수 있습니다. 예를 들어 :

$ git checkout save-merge-result -- . 
$ git status 
On branch b1 
All conflicts fixed but you are still merging. 
    (use "git commit" to conclude merge) 

Changes to be committed: 

    modified: README 
    new file: file2 

이 시점에서 당신은 수정하고 필요에 따라 git add 파일은 더/원했다.

당신이 만든 은닉에 git pop을 아직하지 않았다면, git stash branch을 사용하여 은닉을 고유 한 가지로 모두 변환 할 수 있습니다. git stash save이 단순히 커밋을 수행하기 때문에, git stash을 사용하려면이 필요합니다. 그냥 분기를 만들고 커밋하십시오. 그 모든 git stash 않는 분기 이름 대신 stash, 이름으로 기억되는 커밋됩니다.

(덧붙여, 지점 stash의 이름을 지정하고 git stash 사용을 시작하지 않습니다. 힘내이 어떤 문제가되지 않습니다,하지만 당신은
자신 중 지옥. :-) 혼동됩니다)


git rerere을 사용하지 않는다고 가정합니다.

+0

죄송합니다. 그것은 합산하지 않습니다. 나는 정교화 할 것이다 : 나는 모든 갈등을 IDE에서 하나씩 해결했지만, 나는 아직 모든 변화를 저지른 적이 없다. 자, 내가 그 시점에 그것을 숨겨 두지 않았다면, 나는 PR을 만들고 다른 repo에서 오는 github에서 많은 새로운 커밋을 보았습니다. 그러나 나는 내 일을 감추었 기 때문에 지금은 한 커밋 만 볼 수 있습니다. 나는 다른 레포에서 체크섬을 잃어 버리고 다음 머지에서 많은 충돌에 직면 할 것이기 때문에 나는 그것을 병합 할 수 없다. – yuranos87

+0

아, 그동안 IDE가 있습니다. 아마 명령 행에 직접 들어가거나 방해가 될 수있는 방법이 있거나 최소한 명령 행에서 할 수있는 일을하는 방법이있을 것입니다. 이 경우 필요에 따라 이들을 조합하여 다른 분기를 커밋하고 병합을 다시 시작하십시오. – torek

관련 문제