2012-05-02 3 views
89

업스트림 변경 사항이 있어도 특정 파일을 손질하지 않고 안전하게 업데이트 (pull) 할 수 있습니까?git pull에서 로컬 변경 유지

myrepo/설정/config.php를

(조차하지 않는 방법은 내가 풀을 이눔 때, 다른 모든 업데이트되며,이 파일이 원격에서 변경되는 경우에도,의, 거기에 있지만,이 파일이 변경되지 않습니다 합병)?

추신. 나는 단지 git 기반 배포 스크립트 만 작성하기 때문에 내가 원하는 것을 할 필요가있다. 구성 파일을 템플릿으로 변경할 수 없습니다.

그래서 로컬로 변경된 내용을 잃지 않는 업데이트 스크립트를 작성해야합니다. 당신이 가장 풀러에 의해 정의하도록되어 당신의 repo에서 파일을 가지고 있다면, config.php.template와 같은 것을에 파일의 이름을 변경 한 후

git assume-remote-unchanged file1 
git assume-remote-unchanged file2 

git pull

+0

와 자식 풀을 시도 할 수 있습니다 config.php''에 대한 변경이 최선을 다하고 있습니다 : 그래서 이렇게? –

+1

가능한 복제본 [git merge를 수행 할 때 특정 커밋을 제외 할 수 있습니까?] (http://stackoverflow.com/questions/332528/is-it-possible-to-exclude-specific-commits-when-doing- a-git-merge) – Daenyth

+0

커밋되지 않았습니다. –

답변

164

Git 숨김을 기반으로하는 간단한 해결책이 있습니다. 변경 한 모든 항목을 숨기고 모든 새로운 항목을 가져오고 숨겨진 항목을 적용하십시오.

git stash 
git pull 
git stash pop 

대담한 팝에서는 충돌이있을 수 있습니다. 사실 config.php에 대한 충돌이 있다고 설명하는 경우 그러나 당신이 숨은 장소에 넣은 것을 당신이 원하는대로 알고 있기 때문에 갈등을 해결하는 것은 쉽습니다.

git checkout --theirs -- config.php 
+3

그 git checkout - theirs 명령은 매우 혼란 스럽습니다. 그것은 내가 원했던 일을하고 또 다른 일은 정말로 나빴습니다. 좋은 문서가 있습니까? – Milimetric

+2

예, 때로는 'theirs'와 'ours'가 혼란 스러울 수 있습니다. 'git merge'에서 'ours'는 현재 작업 디렉토리에 있습니다. 그러나'git rebase' (또는'git rebase -onto')의 의미는 바뀔 수 있습니다. – GoZoner

+0

@GoZoner이 또한 가져 오기에도 효과가 있다고 생각합니다. 'git stash' 이후 다른 지점을 체크 아웃 한 다음'git fetch origin : '입니다. 이전 분기를 체크 아웃 한 다음'git stash pop'을 체크 아웃하십시오. 시도했지만 작동했지만 병합 충돌이 없었습니다. – AnkurTank

13

: I는 다음과 같이 간단하게 뭔가를 기대했다 .gitignoreconfig.php을 추가하십시오.

+4

check [this answer] (http://stackoverflow.com/a/3970442/236871) 또한 병합하는 동안 항상 .gitattributes를 사용하여 변경 사항을 유지할 수 있습니다. – KurzedMetal

+0

그것은 내가 필요로했던 것보다 더 비슷합니다. 템플릿 일은 우아한 솔루션이지만 배포 스크립트를 작성하기 때문에이 스크립트를 사용할 수 없습니다. –

4

업데이트 : 이것은 묻는 질문에 대한 답변이지만, 실제로는 KurzedMetal's answer이 원하는 것입니다.

그 가정 : master

  • origin

    1. 당신은 분기 master
    2. 에있어 상류 지점 당신은 당신은 .... 커밋되지 않은 변경

    이 없습니다 할 수있다 :

    # Do a pull as usual, but don't commit the result: 
    git pull --no-commit 
    
    # Overwrite config/config.php with the version that was there before the merge 
    # and also stage that version: 
    git checkout HEAD config/config.php 
    
    # Create the commit: 
    git commit -F .git/MERGE_MSG 
    

    빈번하게 수행해야하는 경우 별칭을 만들 수 있습니다. config/config.php에 커밋되지 않은 변경 사항이있는 경우이 변경 사항이 사라집니다.

  • 3

    우리는 또한 REBASE

    git pull --rebase origin dev 
    
    관련 문제