질문자 :Jakub Troszok
git pull
에서 로컬 파일을 강제로 덮어쓰려면 어떻게 합니까?
시나리오는 다음과 같습니다.
- 팀원이 우리가 작업 중인 웹사이트의 템플릿을 수정하고 있습니다.
- 그들은 이미지 디렉토리에 일부 이미지를 추가하고 있습니다 (그러나 소스 제어하에 추가하는 것을 잊었습니다)
- 그들은 나중에 메일로 이미지를 나에게 보내고 있습니다.
- 소스 제어 아래에 이미지를 추가하고 다른 변경 사항과 함께 GitHub에 푸시합니다.
- Git은 파일을 덮어쓰지 않기 때문에 GitHub에서 업데이트를 가져올 수 없습니다.
이것은 내가 얻는 오류입니다.
오류: 추적되지 않은 작업 트리 파일 'public/images/icon.gif'가 병합에 의해 덮어쓰여집니다.
Git이 강제로 덮어쓰도록 하려면 어떻게 해야 합니까? 그 사람은 디자이너입니다. 일반적으로 모든 충돌을 손으로 해결하므로 서버에는 컴퓨터에서 업데이트해야 하는 최신 버전이 있습니다.
답변자 : RNA
⚠ 중요: 로컬 변경 사항이 있으면 손실됩니다. --hard
옵션이 있든 없든 푸시되지 않은 모든 로컬 커밋은 손실됩니다. [*]
Git에서 추적하지 않는 파일(예: 업로드된 사용자 콘텐츠)이 있는 경우 이러한 파일은 영향을 받지 않습니다.
먼저 가져오기를 실행하여 모든 origin/<branch>
를 최신으로 업데이트합니다.
git fetch --all
현재 분기 백업:
git branch backup-master
그런 다음 두 가지 옵션이 있습니다.
git reset --hard origin/master
또는 다른 지점에 있는 경우:
git reset --hard origin/<branch_name>
설명:
git fetch
아무것도 병합하거나 리베이스하지 않고 원격에서 최신 파일을 다운로드합니다.
그런 다음 git reset
은 마스터 분기를 방금 가져온 것으로 재설정합니다. --hard
옵션은 작업 트리의 모든 파일을 origin/master
현재 로컬 커밋 유지
[*] : 재설정하기 전에 master
에서 분기를 만들어 현재 로컬 커밋을 유지할 수 있다는 점은 주목할 가치가 있습니다.
git checkout master git branch new-branch-to-save-current-commits git fetch --all git reset --hard origin/master
그 후에 모든 오래된 커밋은 new-branch-to-save-current-commits
됩니다.
커밋되지 않은 변경 사항
그러나 커밋되지 않은 변경 사항(단계적일지라도)은 손실됩니다. 필요한 모든 것을 숨기고 커밋하십시오. 이를 위해 다음을 실행할 수 있습니다.
git stash
그런 다음 커밋되지 않은 변경 사항을 다시 적용하려면 다음을 수행합니다.
git stash pop
답변자 : Travis Reeder
이 시도:
git reset --hard HEAD git pull
그것은 당신이 원하는 것을해야합니다.
답변자 : David Avsajanishvili
경고: git clean
은 추적되지 않은 모든 파일/디렉토리를 삭제하며 취소할 수 없습니다.
때로는 clean -f
가 도움이 되지 않습니다. 추적되지 않은 DIRECTORIES가 있는 경우 -d 옵션도 필요합니다.
# WARNING: this can't be undone! git reset --hard HEAD git clean -f -d git pull
경고: git clean
은 추적되지 않은 모든 파일/디렉토리를 삭제하며 취소할 수 없습니다.
-n
( --dry-run
) 플래그를 먼저 사용하는 것을 고려하십시오. 이것은 실제로 아무것도 삭제하지 않고 삭제될 항목을 표시합니다.
git clean -n -f -d
출력 예:
Would remove untracked-file-1.txt Would remove untracked-file-2.txt Would remove untracked/folder ...
답변자 : Richard Kersey
고슴도치처럼 나는 대답이 끔찍하다고 생각합니다. 그러나 Hedgehog의 대답이 더 나을 수도 있지만, 나는 그것이 가능한 한 우아하다고 생각하지 않습니다. 이 작업을 수행하는 방법은 정의된 전략과 함께 fetch
및 merge
강제로 덮어쓰려는 파일 중 하나가 아닌 한 로컬 변경 사항이 보존되도록 해야 합니다.
먼저 변경 사항을 커밋하십시오.
git add * git commit -a -m "local file server commit message"
그런 다음 변경 사항을 가져오고 충돌이 있으면 덮어씁니다.
git fetch origin master git merge -s recursive -X theirs origin/master
-X
옵션 이름이며, theirs
해당 옵션의 값입니다. 충돌이 있는 경우 변경 사항(다른 옵션은 ours
변경 사항)을 사용 their
답변자 : Johanneke
대신:
git fetch --all git reset --hard origin/master
다음을 수행하는 것이 좋습니다.
git fetch origin master git reset --hard origin/master
오리진/마스터 브랜치로 재설정하려는 경우 모든 원격 및 브랜치를 가져올 필요가 없습니까?
답변자 : Jakub Troszok
가장 좋은 방법은 먼저 다음을 수행하는 것입니다.
git clean
추적되지 않은 모든 파일을 삭제한 다음 일반적인 git pull
을 계속하려면 ...
답변자 : Hedgehog
경고, 이렇게 하면 gitignore 파일에 디렉토리/* 항목이 있는 경우 파일이 영구적으로 삭제됩니다.
일부 답변은 끔찍한 것 같습니다. David Avsajanishvili의 제안에 따라 @Lauri에게 무슨 일이 일어났는지 끔찍합니다.
오히려 (git > v1.7.6):
git stash --include-untracked git pull
나중에 숨김 기록을 정리할 수 있습니다.
수동으로 하나씩:
$ git stash list stash@{0}: WIP on <branch>: ... stash@{1}: WIP on <branch>: ... $ git stash drop stash@{0} $ git stash drop stash@{1}
잔인하게 한번에:
$ git stash clear
물론 당신이 은닉 한 것으로 돌아가고 싶다면 :
$ git stash list ... $ git stash apply stash@{5}
답변자 : Vishal
이 명령은 로컬 변경 사항을 삭제하는 데 도움이 될 수 있습니다.
git checkout <your-branch> -f
그런 다음 정리를 수행합니다(작업 트리에서 추적되지 않은 파일 제거).
git clean -f
추적되지 않은 파일과 함께 추적되지 않은 디렉토리를 제거하려면:
git clean -fd
답변자 : Lloyd Moore
git pull
과 병합하는 대신 다음을 시도하십시오.
git fetch --all
다음에:
git reset --hard origin/master
.
답변자 : Chris BIllante
나를 위해 일한 유일한 것은 다음과 같습니다.
git reset --hard HEAD~5
이렇게 하면 5개의 커밋을 다시 수행한 다음
git pull
Git 병합을 실행 취소하는 방법을 검색 하여 찾았습니다.
답변자 : Strahinja Kustudic
이러한 모든 솔루션의 문제는 모두 너무 복잡하거나 더 큰 문제는 웹 서버에서 추적되지 않은 모든 파일을 제거한다는 것입니다. 서버에 항상 필요한 구성 파일이 있기 때문에 원하지 않습니다. Git 저장소에는 없습니다.
다음은 우리가 사용하는 가장 깨끗한 솔루션입니다.
# Fetch the newest code git fetch # Delete all files which are being added, so there # are no conflicts with untracked files for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'` do rm -f -- "$file" done # Checkout all files which were locally modified for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'` do git checkout -- "$file" done # Finally pull all the changes # (you could merge as well eg 'merge origin/master') git pull
첫 번째 명령은 최신 데이터를 가져옵니다.
두 번째 명령은 저장소에 추가 중인 파일이 있는지 확인하고 충돌을 일으킬 수 있는 추적되지 않은 파일을 로컬 저장소에서 삭제합니다.
세 번째 명령은 로컬로 수정된 모든 파일을 체크아웃합니다.
마지막으로 우리는 최신 버전으로 업데이트하기 위해 풀을 수행하지만, 저장소에 있는 추적되지 않은 파일이 더 이상 존재하지 않고 로컬에서 수정된 모든 파일이 이미 저장소에서와 동일하기 때문에 충돌이 없습니다.
답변자 : kenorb
우선 표준 방법을 시도하십시오.
git reset HEAD --hard # To remove all not committed changes! git clean -fd # To remove all untracked (non-git) files and folders!
경고 : 위의 명령은 커밋하지 않은 경우에만 데이터/파일이 손실될 수 있습니다! 확실하지 않은 경우 전체 저장소 폴더를 먼저 백업하십시오.
그런 다음 다시 당깁니다.
위의 방법이 도움이 되지 않고 추적되지 않은 파일/디렉토리에 관심이 없다면(만약에 대비하여 먼저 백업을 만드십시오) 다음의 간단한 단계를 시도하십시오.
cd your_git_repo # where 'your_git_repo' is your git repository folder rm -rfv * # WARNING: only run inside your git repository! git pull # pull the sources again
이것은 모든 git 파일( .git/
dir 제외)을 제거하고 다시 가져옵니다.
git reset HEAD --hard
가 경우에 따라 실패할 수 있는 이유는 무엇입니까?
.gitattributes file
사용자 지정 규칙
.gitattributes에 eol=lf
규칙이 있으면 git이 일부 텍스트 파일에서 CRLF 줄 끝을 LF로 변환하여 일부 파일 변경 사항을 수정할 수 있습니다.
이 경우 이러한 CRLF/LF 변경 사항을 커밋하거나( git status
에서 검토하여) 일시적으로 무시하려면 git config core.autcrlf false
파일 시스템 비호환성
권한 속성을 지원하지 않는 파일 시스템을 사용할 때. 예를 들어 Linux/Mac( ext3
/ hfs+
)에 하나와 FAT32/NTFS 기반 파일 시스템에 하나, 두 개의 저장소가 있습니다.
당신이 발견으로, 파일 시스템의 두 가지 종류가있다 그래서 아무리 권한의 종류를 시스템에 다시 파일 사용 권한을 지원하지 않습니다 수없는 기본적으로 유닉스 권한을 지원하지 않는 한 그렇게 --hard
를 시도하십시오. 자식은 항상 일부 "변경 사항"을 감지합니다.
답변자 : John John Pichler
나는 같은 문제가 있었다. 아무도 나에게 이 솔루션을 주지 않았지만 그것은 나를 위해 일했습니다.
나는 그것을 해결했다 :
- 모든 파일을 삭제합니다.
.git
디렉토리만 남겨둡니다. -
git reset --hard HEAD
-
git pull
-
git push
이제 작동합니다.
답변자 : Sazzad Hissain Khan
보너스:
이전 답변에서 pull/fetch/merge에 대해 이야기하면서 흥미롭고 생산적인 트릭을 공유하고 싶습니다.
git pull --rebase
위 명령어는 제 Git 생활에서 가장 많은 시간을 절약해 준 가장 유용한 명령어입니다.
새로 커밋을 서버에 푸시하기 전에 이 명령을 시도하면 최신 서버 변경 사항을 자동으로 동기화하고(페치 + 병합으로) 커밋을 Git 로그의 맨 위에 배치합니다. 수동 pull/merge에 대해 걱정할 필요가 없습니다.
"git pull --rebase"의 기능은 무엇입니까? 에서 자세한 내용을 찾으십시오. .
답변자 : Ryan
나는 비슷한 문제가 있었다. 나는 이것을해야했다 :
git reset --hard HEAD git clean -f git pull
답변자 : Robert Moon
다른 답변을 요약했습니다. 오류 없이 git pull
을 실행할 수 있습니다.
git fetch --all git reset --hard origin/master git reset --hard HEAD git clean -f -d git pull
경고 : 이 스크립트는 매우 강력하므로 변경 사항을 잃을 수 있습니다.
답변자 : Rolf Kaiser
내 자신의 유사한 경험을 바탕으로 위의 Strahinja Kustudic이 제공하는 솔루션이 단연 최고입니다. 다른 사람들이 지적했듯이 단순히 하드 리셋을 수행하면 구성 파일과 같이 제거하고 싶지 않은 많은 것을 포함할 수 있는 추적되지 않은 모든 파일이 제거됩니다. 더 안전한 것은 추가될 파일만 제거하는 것이며, 그와 관련하여 업데이트하려고 하는 로컬로 수정된 파일도 체크아웃할 수 있습니다.
이를 염두에 두고 Kustudic의 스크립트를 업데이트했습니다. 오타도 수정했습니다(원본에는 ' 누락).
#/bin/sh # Fetch the newest code git fetch # Delete all files which are being added, # so there are no conflicts with untracked files for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'` do echo "Deleting untracked file $file..." rm -vf "$file" done # Checkout all files which have been locally modified for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'` do echo "Checking out modified file $file..." git checkout $file done # Finally merge all the changes (you could use merge here as well) git pull
답변자 : tiho
나는 두 가지 가능한 충돌 원인이 있다고 생각하며 별도로 해결해야하며 위의 답변 중 어느 것도 두 가지 모두를 다루지 않는다고 말할 수 있습니다.
답변자 : JacobEvelyn
여기에 있는 대부분의 답변은 master
브랜치에 초점을 맞춘 것 같습니다. 그러나 두 개의 다른 위치에서 동일한 기능 분기에 대해 작업 중이고 많은 후프를 건너뛰지 않고 하나의 리베이스가 다른 하나에 반영되기를 원할 때가 있습니다.
비슷한 질문에 대한 RNA의 답변 과 torek의 답변 조합을 기반으로 훌륭하게 작동하는 이것을 생각해 냈습니다.
git fetch git reset --hard @{u}
분기에서 이것을 실행하면 로컬 분기만 업스트림 버전으로 재설정됩니다.
git forcepull
)에도 멋지게 넣을 수 있습니다.
git config alias.forcepull "!git fetch ; git reset --hard @{u}"
또는 .gitconfig
파일에서:
[alias] forcepull = "!git fetch ; git reset --hard @{u}"
즐기다!
답변자 : Tierlieb
나는 같은 문제가 있었고 어떤 이유로 git clean -f -d
조차도 그것을하지 않을 것입니다. 이유는 다음과 같습니다. 어떤 이유로 Git에서 파일을 무시하는 경우(.gitignore 항목을 통해 가정), 나중에 pull 로 이것을 덮어쓰는 것이 여전히 귀찮지만 -x
를 추가하지 않는 한 clean 은 파일을 제거하지 않습니다. .
답변자 : maximus 69
더 쉬운 방법은 다음과 같습니다.
git checkout --theirs /path/to/file.extension git pull origin master
이것은 로컬 파일을 git의 파일로 재정의합니다.
답변자 : ddmytrenko
훨씬 쉽고 덜 고통스러운 방법을 알고 있습니다.
$ git branch -m [branch_to_force_pull] tmp $ git fetch $ git checkout [branch_to_force_pull] $ git branch -D tmp
그게 다야!
답변자 : Simon B.
나는 이것을 다음과 같이 스스로 해결했습니다.
git checkout -b tmp # "tmp" or pick a better name for your local changes branch git add -A git commit -m 'tmp' git pull git checkout master # Or whatever branch you were on originally git pull git diff tmp
여기서 마지막 명령은 로컬 변경 사항의 목록을 제공합니다. 허용될 때까지 "tmp" 분기를 계속 수정한 다음 다음을 사용하여 마스터에 다시 병합합니다.
git checkout master && git merge tmp
다음 번에는 "git stash branch"를 검색하여 이 문제를 더 깔끔하게 처리할 수 있을 것입니다. 하지만 stash는 처음 몇 번의 시도에서 문제를 일으킬 수 있으므로 중요하지 않은 프로젝트에서 먼저 실험을 해보세요...
답변자 : Chen Zhang
git clean
이나 git reset
작동하지 않는 이상한 상황이 있습니다. 추적되지 않은 모든 파일에 대해 다음 스크립트를 사용하여 git index
에서 충돌하는 파일을 제거해야 합니다.
git rm [file]
그러면 잘 끌 수 있습니다.
답변자 : user2696128
그냥 해
git fetch origin branchname git checkout -f origin/branchname // This will overwrite ONLY new included files git checkout branchname git merge origin/branchname
따라서 유지하려는 파일이나 디렉토리 삭제 등과 같은 원치 않는 모든 부작용을 피할 수 있습니다.
답변자 : Snowcrash
원래 질문에도 불구하고 상위 답변은 비슷한 문제가 있지만 로컬 파일을 잃고 싶지 않은 사람들에게 문제를 일으킬 수 있습니다. 예를 들어 Al-Punk와 crizCraig의 설명을 참조하십시오.
다음 버전은 로컬 변경 사항을 임시 분기( tmp
)에 커밋하고 원본 분기( master
라고 가정함)를 확인하고 업데이트를 병합합니다. stash
를 사용하여 이 작업을 수행할 수 있지만 일반적으로 단순히 분기/병합 접근 방식을 사용하는 것이 더 쉽다는 것을 알았습니다.
git checkout -b tmp git add *; git commit -am "my temporary files" git checkout master git fetch origin master git merge -s recursive -X theirs origin master
여기서 우리는 다른 저장소 가 origin master
라고 가정합니다.
답변자 : user811773
인덱스와 헤드를 origin/master
재설정하지만 작업 트리는 재설정하지 마십시오.
git reset origin/master
답변자 : Vishesh Chandra
이 네 가지 명령이 저에게 효과적입니다.
git reset --hard HEAD git checkout origin/master git branch -D master git checkout -b master
이 명령을 실행한 후 확인/풀하려면
git pull origin master
나는 많이 시도했지만 마침내 이러한 명령으로 성공했습니다.
답변자 : vezenkov
요구 사항:
- 로컬 변경 사항을 추적하여 여기에서 아무도 변경 사항을 잃지 않도록 합니다.
- 로컬 저장소를 원격 원본 저장소와 일치시키십시오.
해결책:
- 로컬 변경 사항을 숨깁니다.
.gitignore를 무시하고 원본으로 하드 리셋 을 하지 않고 깨끗한 파일 과 디렉토리로 가져 옵니다.
git stash --include-untracked git fetch --all git clean -fdx git reset --hard origin/master
답변자 : Venkat Kotra
모든 답변을 읽었지만 이를 수행하는 단일 명령을 찾고 있었습니다. 여기 내가 한 일이 있습니다. .gitconfig에 git 별칭 추가
[alias] fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"
다음과 같이 명령을 실행하십시오.
git fp origin master
에 해당
git fetch origin master git reset --hard origin/master
출처 : Here
출처 : http:www.stackoverflow.com/questions/1125968/git-how-do-i-force-git-pull-to-overwrite-local-files">