로컬 변경 사항을 유지하는 git pull


132

업스트림 변경 사항이 있어도 특정 파일을 그대로 유지하면서 git 프로젝트를 안전하게 업데이트 (풀)하는 방법은 무엇입니까?

myrepo / config / config.php

이 파일이 원격에서 변경 되더라도 git pull을 사용할 때 다른 모든 것이 업데이트되지만이 파일은 변경되지 않고 병합되지 않는 방법이 있습니까?

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

따라서 로컬로 변경된 내용을 잃지 않는 업데이트 스크립트를 작성하는 방법이 필요합니다. 나는 다음과 같은 간단한 것을 원했습니다.

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

그때 git pull


변경 사항이 config.php커밋 되었습니까?
Mark Longair


커밋되지 않았습니다. 차라리 그럴 필요는 없습니다
Johnny Everson

@JhonnyEverson : 동일한 전체 문제 클래스입니다 (구성 파일이 있고 특정 설정을 커밋하고 싶지 않지만 구성 파일 구조를 추적해야합니다.)
Daenyth

답변:


248

Git 숨김을 기반으로하는 간단한 솔루션이 있습니다. 변경 한 내용을 모두 숨기고 모든 새로운 내용을 가져와 숨김을 적용하십시오.

git stash
git pull
git stash pop

숨김 팝에서 충돌이있을 수 있습니다. 당신이 묘사하는 경우에 실제로 충돌이 생길 것입니다 config.php. 그러나, 당신이 은닉에 넣은 것이 당신이 원하는 것임을 알기 때문에 갈등을 해결하는 것은 쉽습니다. 이렇게하십시오 :

git checkout --theirs -- config.php

5
git checkout --thess 명령은 매우 혼란 스럽습니다. 그것은 내가 원했던 것과 다른 시간에 정말 나쁜 일을했습니다. 그것에 대한 좋은 문서가 있습니까?
Milimetric

3
그렇습니다. 때때로 '그들'과 '우리'는 혼란 스러울 수 있습니다. A의 git merge'우리'작업 디렉토리에 현재 것입니다. 그러나 git rebase(또는 git rebase -onto)의 경우 의미가 바뀔 수 있습니다.
GoZoner

1
git stash , git pull , git stash apply 당신과 함께 마리화나를 삭제할 수 있습니다 : git stash drop당신이 성공적으로 변경 내용을 병합하면
BeingSuman

11
자식의 장점은 무엇을할지 이해해야한다는 것입니다. 자식의 또 다른 점은 똑똑한 사람들조차도 자식이 무엇을하는지 이해하기가 매우 어렵다는 것입니다.
Brad Thomas

1
실제로 숨겨야 할 것이 있는지 확인해야합니다. 그렇지 않으면 이전의 변경 사항을 숨길 수 있습니다 git stash.
Jörn Reimerdes

15

저장소에 대부분의 풀러가 사용자 정의 해야하는 파일이 있으면 파일의 이름을 바꾸고에 config.php.template추가 config.php하십시오 .gitignore.


5
이 답변 도 확인하십시오 .gitattributes. 병합하는 동안 항상 변경 사항을 유지 하는 데 사용할 수 있습니다 .
KurzedMetal

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

6

업데이트 : 이것은 문자 그대로 질문에 대답하지만 KurzedMetal의 대답 은 실제로 당신이 원하는 것이라고 생각 합니다.

가정 :

  1. 당신은 지점에있어 master
  2. 상류 지점 인 masterorigin
  3. 커밋되지 않은 변경 사항이 없습니다.

.... 할 수있는 일 :

# 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됩니다.



1

질문에 대답하려면 : 체크 아웃의 특정 파일을 제외하려면 스파 스 체크 아웃을 사용할 수 있습니다

1) .git/info/sparse-checkout에서 보관할 대상을 정의하십시오. 여기서 우리는 모두 (*)를 원하지만 (느낌표에주의하십시오) config.php :

 /*
 !/config.php

2) 자식에게 스파 스 체크 아웃을 고려하고 싶다고 말하십시오.

 git config core.sparseCheckout true

3)이 파일을 로컬에 이미 가지고 있다면, git이 스파 스 체크 아웃에서 수행하는 작업을 수행하십시오 ( "skip-worktree"플래그를 설정하여이 파일을 제외시켜야 함).

git update-index --skip-worktree config.php

4) config.php 파일이있는 저장소를 사용하십시오-저장소의 변경 사항이 무엇이든간에.


구성 값은 소스 제어에 있지 않아야합니다.

  • 잠재적 인 보안 위반입니다
  • 배포시 이와 같은 문제가 발생합니다.

이것은 당신이 그것들을 배제하고 (첫 커밋 전에 .gitignore에 넣어야 함) 앱을 체크 아웃하는 각 인스턴스에 적절한 파일을 생성해야합니다 ( "템플릿"파일을 복사하고 수정하여)

git이 파일을 담당하면 .gitignore는 아무런 영향을 미치지 않습니다.

파일이 소스 제어하에 있으면 두 가지 선택 만 할 수 있습니다.-파일을 제거하기 위해 모든 히스토리를 리베이스 ( git filter-branch-)-파일을 제거하는 커밋을 작성하십시오. 그것은 잃어버린 전투와 싸우는 것과 같지만 때로는 그와 함께 살아야합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.