2011-08-26 6 views
4

John과 Tom이 동일한 원격 저장소를 복제합니다. 원격 REPO의 내용은 다음과 같이이다 :힘내는 어떻게 병합 할 것인가?

FileA.c 

요한은 요한라는 이름의 폴더에 FileA.c 이동, 즉, 지역이 같은 커밋하고 로컬로 커밋합니다.

John\FileA.c 

톰 또한 톰라는 이름의 폴더에 FileA.c 이동, 로컬 즉, 같은 커밋하고 로컬로 커밋합니다.

Tom\FileA.c 

톰과 존은 모두 원격의 repo에 자신의 지역의 repos를 밀어 경우, GitHub에, 어떻게 힘내이 병합 것이라고?

내가 분명히했으면 좋겠다. 감사합니다.

답변

4

git commit을 수행하지만 git push을 수행하지 않으면 변경 사항이 로컬 저장소에 추가되고 전역 저장소에 반영되지 않습니다. 따라서 원격 서버가 다른 사용자가 아직 변경하지 않은 내용을 알지 못하기 때문에 자신의 변경 사항을 먼저 푸시하는 사용자는 아무런 충돌을 느끼지 않습니다. pushed. 나중에 다음 사용자가 변경 사항을 푸시하려고하면 git은 글로벌 repo가 ​​변경되었다는 오류를 표시하므로 먼저 변경 사항을 가져와야합니다. 변경 사항은 동일한 파일에 있고 위치가 변경 되었기 때문에 git 자체로는 해결되지 않는 충돌이 발생합니다. 다음 사용자는 변경 사항을 다시 작성하여 글로벌 repo를 업데이트해야합니다.

1

push 동안 병동이 병합되지 않습니다. 두 개발자 중 하나 (마지막에 푸시하려고하는 가난한 사람)는 충돌을 로컬에서 해결하고 파일을 이동할 위치를 git에 알려야합니다. 힘내라, 파일이 사람의 개입없이 어디에서 끝나야할지 알 수 없다.

# dev1 
git clone … 
mkdir John && git mv FileA.c John/FileA.c 
git commit -m 'move file to john subdir' 
git push origin master 

# dev2 
git clone … 
mkdir Tom && git mv FileA.c Tom/FileA.c 
git commit -m 'move file to tom subdir' 
git push origin master 
# git errors out: non-fast-forward, pull first to resolve potential conflicts 
git pull origin master 
# merge conflict in FileA.c 
# tell git which file to delete and which file to keep: 
git rm Tom/FileA.c && git add John.FileA.c 
git commit # creates a merge commit 
git push origin master 
2

힘내/SVN/등 최선을 가능한 한 병합을 수행 그들은 코드의 분리, 비 간섭 라인이 추가 된 것을/삭제/수정, 그것은 단순히 존에 의해 변경 사항을 결합하는 것 보면 /FileA.c와 Karen/FileA.c (예를 들어 누군가를 여자로 만드는 연습 = P). 병합 스크립트에서 코드의 동일한 줄이 편집되었다는 것을 확인하면 파일에서 충돌로 표시됩니다.

이 시점이되었다고 생각하지만이 프로세스는 로컬에서 발생합니다. 카렌이나 존에 의해, 누가 시도하고 마지막으로 밀어 사람이 누군지에 따라. 마지막으로 푸시 한 사용자는 원격 저장소에서 당겨 자신의 변경 사항을 푸시하기 전에 충돌을 해결하도록 알립니다.

1

두 번째 푸시 작업이 실패합니다. 병합은 로컬에서 수행해야합니다. 이 경우 수동으로 해결해야하는 충돌이 있습니다.

0

다른 답변의 요점은 자식은 이라고 생각하지 않습니다. [미리 코딩 된 추정을 사용하여] 어떤 일이 발생해야하는지, 오히려 다양한 것을 읽는 것을 염려하지 않으므로 사용자에게 어려움을 경고합니다. 사용자 의도.

이러한 병합을 수행 할 수 있다고 주장하는 대부분의 다른 시스템은 투시력 테스트에 실패합니다. 그들은 당신이 정말로 원하는 것을 모릅니다. 지적인 사람들 (당신과 나 ;;)이 결정을하도록하십시오.

1

git에 대한 좋은 점은 서버에 영향을 미치지 않고 이러한 문제를 쉽게 해결할 수 있다는 것입니다.마지막으로 밀어 넣을 사람의 결과는 다음과 같습니다.

02:32:54 ~/desktop/tom 
$ git push 
To /cygdrive/h/desktop/test 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '/cygdrive/h/desktop/test' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

02:32:54 ~/desktop/tom 
$ git pull 
remote: Counting objects: 3, done. 
remote: Total 2 (delta 0), reused 0 (delta 0) 
Unpacking objects: 50% (1/2) Unpacking objects: 100% (2/2) Unpacking objects: 100% (2/2), done. 
From /cygdrive/h/desktop/test 
    307f68a..2539f44 master  -> origin/master 
error: refusing to lose untracked file at 'John/FileA.c' 
error: refusing to lose untracked file at 'John/FileA.c' 
CONFLICT (rename/rename): Rename "FileA.c"->"Tom/FileA.c" in branch "HEAD" rename "FileA.c"->"John/FileA.c" in "2539f448bb15d10f14bef74688dc3470975c2dbf" 
CONFLICT (rename/rename): Rename "FileA.c"->"Tom/FileA.c" in branch "HEAD" rename "FileA.c"->"John/FileA.c" in "2539f448bb15d10f14bef74688dc3470975c2dbf" 
Automatic merge failed; fix conflicts and then commit the result 

멋진 이름이고 어떤 이름이 올바른지 묻습니다. 모든 버전 제어 시스템이 이러한 종류의 이름 바꾸기/이름 바꾸기 충돌을 감지 할 수있는 것은 아닙니다.

관련 문제