2011-09-20 3 views
0

나는 프로젝트의 독점 개발자입니다. 예를 들어 , 나는 다음과 같은 시나리오가 있다고 가정 :병합 충돌없이 2 곳의 다른 곳에서 git 저장소에 어떻게 기여합니까?

A 실을 - 코드를 변경, 푸시

오피스 B 다음를 저지 - 변화에 노력하지만, 어떤 변경이있는 경우 그것은 불평한다. 변경 사항을 잊어 버리고 최신 버전을 얻고 싶습니다.

기본적으로 저는 사무실 A & B 사이를 전환 중이며 원격 저장소에 대한 변경 사항을 커밋하고 다음 번 사무실에서 변경 사항을 다시 가져올 때마다 전환하고 있습니다. Git은 작업 카피에 약간의 변경이있을 수 있으므로 불평 할 것이다. 나는 git reset -hard을 사용했고 을 뽑았지만 어떻게 든 느껴지지 않습니다. 나는 스 태시도 보았지만, 나중에 사용하기 위해 변경 사항을 저장하는 것으로 보입니다.

git 명령 수가 너무 어색해 보입니다.

+0

당신이 끌어와 "는 불평"당신이 망할 놈의에서 얻을 메시지가 무엇인가 : 그 빛에

, 여기에 다른 옵션들? –

+1

변경 사항을 모두 버리고 싶다면 git reset -hard를 사용할 때 아무런 문제가 보이지 않습니다. 확실하지 않다면, 망할 놈의 은신처가 필요로하는 것입니다. 당신은 은닉 한 것을 사용할 필요가 없으며 쉽게 정리할 수 있습니다 : git stash clear. – drizzd

답변

0

당신은 (그리고 자식) 당신이 정확하게 그것을하고있다. 당신은 자식을 잘못 사용하고있는 것이 아닙니다. 이처럼 다른 장소에서 밀거나 당길 수있는 기능이 있습니다.

당신이을 불평하는 이유는 변경 세트 모델에 필요하기 때문입니다. 컴퓨터 A에서 해시 "abcdef"를 사용하여 커밋을했다고 가정합니다.저장소간에 변경 집합을 공유하려면 원하는대로 "abcdef"가 이어야하며 정확하게이 어디서나 동일해야합니다. 컴퓨터 B에서 로컬 변경 사항으로 해당 커밋을 가져 오면 해당 커밋을 특정 위치의 기록에 넣을 수 있지만 은 로컬 변경 사항이 적용되는이 될 수 없습니다. 그렇게하면 커밋 "3dea12"가 생성되며 이는 완전히 다릅니다.

힘내 기는 서브 버전처럼 변경 사항을 즉시 적용하려고 할 수 있습니다. 6 번 커밋했다면, 이제는 다른 머신에 적용된 각각의 (분할 할 수없는) 커밋에 대해 한 번씩 6 번 병합해야합니다. Subversion은 all-in-all diff의 변경 사항을 요약하여이 문제를 해결합니다.이 변경 사항은 로컬 변경 사항의 맨 위에 넣으려고합니다. 가끔은 작동하지만 일부 병합이 다소 어려워지며 이 아니기 때문에 git에서 제공하는 깔끔하고 변화가없는 변경 기록을 유지할 수 있습니다.

이 문제를 해결하기 위해, 여기에 기계 B에 당신의 풀 전략이다 :

$ git stash  # Set your uncommitted changes aside for a moment 
$ git pull  # Pull in the new changes 
        # <resolve conflicts, if they happen> 
$ git stash pop # Bring back your uncommitted changes, fixing ambiguous 
        #  merge pieces as necessary. 

기본적으로,이는 것입니다 전략 "git stash은 무서운 것입니다, 걱정하지 마십시오." :)

나는 을 병합해야한다는 것을 알아 두는 것이 중요하다고 생각한다.. 좋은 개발 사례, 변경 사항을 적게 유지하면 병합 빈도가 줄어들지 만 가끔 병합해야합니다.

덧붙여서 을 원합니다. 작업 복사본이 깨끗한 경우 (숨김 필요 없음) 한 기록을 다른 기록과 혼합합니다. 힘내라 병합해야 할 곳을 찾아 무엇을 해야할지 물어볼 것입니다. 그것은 꽤 분명한 과정입니다. 해당 지점을 로컬 변경 과 병합해야한다면도 매우 혼란 스러울 것입니다. 그것은 본질적으로 과거의 것들을 "미래"의 것들과 합병 할 것인데,이 경우에는 당신의 커밋되지 않은 일 (아마도 바뀔 것이다!).

$ git commit -m "..." # Commit your local changes, making them part of history. 
$ git pull    # Clean working copy! (maybe merging required) 
0

처음에는 자주 커밋하는 습관을 들여야합니다. 기본적으로, 당신이하는 모든 단계는 커밋을 초래할 수 있습니다. 이것들은 git에서는 비싸지 만, 일반적으로 잘 작동하는 세분성이 커밋 레벨에 있기 때문에 훨씬 더 쉽게 사용할 수 있습니다. 당신은 또한 이것을 실험과 테스트에 맡긴다. 코드 부분이 언제 중요해 집니까? 결코 알 수 없다.

자주 커밋하기 시작하면 주제 분기를 사용하는 습관이 생기기 시작해야한다. 예를 들어. SVN, 지점도 저렴합니다. 브랜치는 기본적으로 커밋의 포인터 인 브랜치의 HEAD이기 때문에 태그와 크게 다르지 않습니다. 브랜치를 사용하는 것은 git의 핵심이며 git의 사용 모델을 찾는 퀘스트는 기본적으로 사용자와 우리의 워크 플로우에 맞는 브랜칭 모델을 찾는다.

따라서 개발하는 모든 기능마다 별도의 분기를 사용해야합니다. 끝나면 브랜치를 mainline/master/whatever에 병합하고 브랜치를 삭제하면됩니다. 이 방법의 장점은 서로 독립적으로 기능을 개발할 수 있으며 Experience Bij을 조기에 필요로하지 않는다는 것입니다.

이제 모든 것을 커밋하고 깔끔한 가지에 물건을 넣으면 모든 지점을 서버로 밀어 넣을 수 있습니다. 로컬 저장소에서 커밋되지 않은 변경 사항이없고 항상 기존 커밋을 기반으로 작업 했으므로 분기가 빨리 전달되기 때문에 병합 충돌이 없어야합니다.

+0

귀하의 게시물 내용은 대부분 소리가 있지만 실제 질문과는 완전히 관련이 없습니다. –

+0

내 말은,이 모든 것들이 훌륭하지만, 여기서 실제로 문제를 다루지는 않는다는 것입니다. –

+1

@Paul : 음, 아니. OP는 사무실 간을 이동할 때 갈등이 (병합) 있다고 썼습니다.이 문제는 더 나은 워크 플로우를 사용하여 완전히 해결할 수 있습니다. 그의 제안 된 해결 방법은 'stash'또는 'reset'중 하나만 사용하면이 워크 플로우가 관찰되지 않았을 때 필요하지만 더 실수 할 때 필요합니다. 특히 토픽 브랜치를 사용할 때 stashing은 거의 완벽하게 피할 수 있습니다. 또한 히스토리를 다시 쓰는 것은 매우 위험합니다. 너무 조심스럽지 않으면 커밋되지 않은 변경 사항을 버리는 것입니다. 언젠가는 중요한 변화를 우연히 다시 세울 것이고 ... –

0

기본 워크 스테이션에서 개발을 관리 할 때와 내 랩톱에서 모바일로 이동할 때도 동일한 작업을 수행합니다. 가끔은 랩톱에서 작업 중이었던 작업이 커밋되지 않아 충돌이 발생하여 주 리포에서 꺼내려고합니다. git diff을 수행하여 내가 무엇을하고 있었는지 확인한 다음 stash 또는 reset 이러한 변경이 필요한지 결정해야합니다.

관련 문제