2012-05-24 7 views
2

저는 다른 개발자와 함께 작은 프로젝트를 진행하고 있으며 약간의 상황이 있습니다. 우리는 모두 SVN에 익숙하지만 Git은 우리 모두에게 새로운 것입니다.Git에서 병합 충돌이 잘못되었습니다. 이후로 변경 사항을 유지하면서 나쁜 커밋을 다시 시도 하시겠습니까?

우리는 저장소의 단일 지점에서 작업하고 있으며 각 저장소는 프로젝트의 다른 측면에서 작업하고 있습니다.

그가 뭔가를 저 지르다가 뭔가를 저 지르면 충돌이 일어났습니다 (디자이너 파일에서는 새 파일 두 개를 같은 "자리"에 넣으려고 했으므로). 그리고 해결할 때마다 뭔가를 놓쳤지 만 지금은 효과가 없습니다. 나는 어떻게해서든지 파일을 작동 상태로 만들 수 있었고, 즐거운 방법으로 계속해서 불량 충돌 해결의 영향을받지 않는 것들을 추가했습니다.

이렇게 보입니다.

A (양호) -> B (불량) -> C (수정 시도 중) -> D (되돌리기 나쁜 커밋) -> A -> E (완전히 새로운 파일) -> F (완전히 새로운 파일) > G (큰 문제부터 다른 개발자가 먼저 커밋하면 더 많은 문제와 충돌이 발생합니다.)

기본적으로 원하는 것은 A.로 돌아가서 내 B, E 및 F 커밋을 병합하는 것입니다. 다른 개발자는 G를 저지 할 수 있습니다.이 시점에서 나는 B와 E 사이에 어떤 일이 일어 났는지 모릅니다. 그래서 문제를 해결하려고 노력하는 것만 큼 차라리 버릴 것입니다. 그러나 내가 A로 돌아 가면 나는 원래 B를 저질렀을 때와 똑같은 갈등에 대한 메시지를받지 못했습니다.

신이 도와주세요.

+0

"내가 A로 돌아갈 때"란 무엇을 의미합니까? 'git reset A '하고 있니? – ellotheth

답변

4

SHA 참조를 사용하여 A 커밋을 체크 아웃하고 git에서 cherry-pick 명령을 사용하여 B, E 및 F를 선택하여 체리를 선택합니다.

git checkout -f A23FDE (A) 
git checkout -b new-branch-name 
git cherry-pick F45HJ2 (B) 
git cherry-pick E49FG2 (E) 
git cherry-pick K83D87 (F) 
+0

이것은 환상적으로 일했습니다! 약간의 시간이 걸렸지 만, 우리가 마주 치고 있던 병합 오류로 인해서, 우리가 일하고 싶은 프로젝트로 우리를 되돌려 놓았습니다. 나의 유일한 다른 질문은 이제 "CherryPick"이라는 브랜치를 "master"브랜치에 병합했기 때문에 우리는 어떻게 이것을 origin/master와 origin/head로 밀어 넣을 수 있습니까? 우리가 주인과 함께있는 곳은 바로 그 둘을 원한다 ... 리셋? 베이스? 우리는 독서를 시도했지만 리셋은 단지 커밋 일뿐입니다? 그것은 모두 매우 혼란 스럽다. 도와 줘서 고마워! –

+1

CherryPick을 마스터에 병합 한 상태에서 마스터의 상태가 만족 스러우면 '원본 마스터를 밀어'할 수 있어야합니다. 마스터가 앞 또는 뒤인 경우 먼저 '원본 마스터를 당겨'해야하며 밀어 내기 전에 로컬에서 충돌을 해결해야합니다. 로컬 마스터 브랜치가 원점을 덮어 쓰기를 원한다면 원점 마스터에 푸쉬 할 때 강제 플래그를 사용하면됩니다. 나는 원격 리포지토리에 업데이트를 강제해서는 안되기 때문에이 방법을 권장하지는 않는다. –