git pull이 모든 pull에서 모든 것을 덮어 쓰려면 어떻게해야합니까?


203

CENTRAL 베어 리포지토리에 세 개의 개발자 리포지토리가 있으며 일반적으로 가져옵니다.

또한 CENTRAL 베어 리포지토리에서 가져 오는 두 개의 다른 리포지토리가 있습니다. 하나는 라이브 서버이고 다른 하나는 테스트 / 스테이지 서버입니다. 각각은 자체 지점에서 가져옵니다.

시나리오는 다음과 같습니다 post-update.CENTRAL 저장소에 후크 스크립트가있어 테스트 및 라이브 저장소에 자동으로 액세스하고 각각에 pull 명령을 실행합니다. 이것은 새로운 커밋이있는 지점에 따라 테스트 서버와 라이브 서버를 모두 업데이트합니다. 이 모든 것이 잘 작동합니다.

문제는 이것입니다. 응급 상황에서 파일이 서버에서 직접 (ftp 등을 통해) 업데이트 될 수 있으며 병합 / 덮어 쓰기 충돌이 발생하기 때문에 CENTRAL 사후 업데이트 스크립트가 실패 할 수 있습니다. 이 시나리오를 피할 수있는 방법은 없으며 불가피합니다.

내가하고 싶은 것은 이것입니다 : 라이브 및 테스트 사이트 에서 풀을 가져 오면 항상 덮어 씁니다. 항상. 이 repos는 개발 용이 아니므로 풀 전용입니다.

모든 연구에서, 항상 로컬 파일을 강제로 덮어 쓰는 좋은 해결책을 찾을 수는 없습니다 . 이것이 가능합니까? 그렇다면 훌륭한 개발 시나리오가 될 것입니다.


1
아래의 '방금 가져온 내용으로 재설정'답변에 투표했지만 실제 문제에 대한 해결책은 대역 외 변경을 수행하지 않는 것입니다. 아무리 시급한 수정은 항상 버전 관리를 거쳐야합니다. 운영자를 제외한 누구도 실행중인 사이트 (예 : 개발자가 아닌)에 직접 액세스 할 수 없습니다. 버전 관리를 일관되게 사용하면 변경 한시기와 변경 한 사람 및 작업을위한 더 나은 도구를 기록 할 수 있습니다. 실질적인 이점이없는 이유는 무엇입니까?
Phil Miller

1
@Novelocrat 오른쪽, 나는 당신이 말하는 것을 이해합니다. 불행히도 누군가가 파일을 서버에 직접 업로드 할 수있는 여러 가지 시나리오가 있습니다. 이 경우 repos를 다시 동기화하기 위해 많은 명령을 실행해야합니다. 이전에는 FTP 스크립트를 사용하여 파일을 리포지토리에서 서버로 옮겼습니다. 위에서 제안한 방법은 단순히 FTP 단계를 제거하여 과거에 매우 잘 작동했습니다.
bmilesp

3
따라서 사람들이 서버에 직접 액세스하지 못하게하십시오. FTP 및 SSH 액세스를 잠 그거나 책임이없는 변경을 위해 해고 될 것이라고 알려주십시오. 이런 종류의 연습을 계속하면 장기적으로 당신과 당신의 팀을 해칠뿐입니다.
Phil Miller

답변:


510

정말이 작업을 수행 할 수있는 이상적인 방법은 사용하지 않는 것입니다 pull전혀, 대신 fetchreset:

git fetch origin master
git reset --hard FETCH_HEAD
git clean -df

( master당신이 따르고 싶은 지점을 변경합니다.)

pull어떤 방식으로 변경 사항을 병합하도록 설계되었지만 reset로컬 사본을 특정 커밋과 일치시키기 위해 설계되었습니다.

clean시스템 요구에 따라 약간 다른 옵션을 고려할 수 있습니다 .


3
@ user730569 reset --hard는 작업 디렉토리 (및 현재 브랜치)의 상태를 특정 커밋의 상태와 일치시키는 상태로 만드는 데 사용되는 명령입니다.
Amber

25
FETCH_HEADfetch가져온 참조를 나타 내기 위해 자동으로 생성되는 참조입니다. 가져 오기 할 때마다 병합되지 않고 곧바로 덮어 씁니다. clean은 (는) 추적하지 않는 파일을 제거하는 명령 git이며, -df플래그는 디렉토리 ( -d) 를 제거 하고 실제로 제거 ( -f) 를 지시합니다 .
Amber

4
키워드가없는 이유는 무엇입니까? 풀보다 훨씬 더 자주 필요합니다.
Wolfgang Fahl

14
사용 git clean -dn하기 전에 사용하여 git clean -df삭제 될 파일 / 폴더를 확인할 수 있습니다. git clean -df백업이있는 경우에만 되돌릴 수 있습니다
Ibrahim Lawal

1
@NickMiddleweek 나는 걱정스러운 git clean -df파일도 제거하지만 걱정하지는 않을 것이라고 걱정했다 . git clean --help"일반적으로 Git에 알려지지 않은 파일 만 제거되지만 -x 옵션을 지정하면 무시 된 파일도 제거됩니다. 예를 들어 모든 빌드 제품을 제거하는 데 유용 할 수 있습니다."
nickang


6

하나의 명령으로 수행하는 방법을 모르겠지만 다음과 같은 작업을 수행 할 수 있습니다.

git reset --hard
git pull

또는

git stash
git pull

하나의 명령으로 실행하려면 : git reset --hard && git pull. 또는 더 좋지는 않습니다 git reset --hard; git pull. &&첫 번째 명령이 성공한 경우을 사용 하면 두 번째 명령 만 실행됩니다. ;첫 번째 명령의 종료 코드에 관계없이 실행됩니다.
mazunki

5

분기의 사본을 가져 와서 원본에서 로컬 파일강제로 덮어 쓰려면 다음을 사용하십시오.

git reset --hard origin/current_branch

모든 현재 작업이 손실되고 원점과 동일합니다.


5
git reset --hard HEAD
git fetch --all
git reset --hard origin/your_branch

2

고리를 변경하여 모든 것을 깨끗하게 닦을 수 있습니다.

# Danger! Wipes local data!

# Remove all local changes to tracked files
git reset --hard HEAD

# Remove all untracked files and directories
git clean -dfx

git pull ...

2
x는 무엇을 하는가? 스위치를 설명하십시오
Steve K

2
x는 추적되지 않은 모든 파일을 제거해야한다고 생각합니다. 맨 페이지로 말하기가 어렵 기 때문에 SO가 있습니다.
JosephK

2
@JosephK : 맞지 않습니다. 기본 목적 git clean은 이미 "작업 트리에서 추적되지 않은 파일 제거"(페이지 상단)입니다. 일반적으로 여기에는 무시 된 파일은 포함되지 않지만 무시 된 파일도 포함 시키도록 -x지시 git clean합니다 (단, -e옵션으로 무시 된 파일에는 영향을 미치지 않습니다 ).
Dietrich Epp

2

마지막 풀 / 클론 이후 아직 로컬 변경 사항을 커밋하지 않은 경우 다음을 사용할 수 있습니다.

git checkout *
git pull

checkout마지막 로컬 커밋으로 로컬 변경 사항을 지우고 pull원격 리포지토리에 변경합니다.

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