"git pull"을 강제로 로컬 파일을 덮어쓰려면 어떻게 해야 합니까?
컬파을강덮면어떻합해니까야게로에서 어떻게 ?git pull로컬 리포지토리에 서버와 동일한 파일 이름의 파일이 있습니다.
오류: 추적되지 않은 작업 트리 파일 '예:txt'는 병합에 의해 덮어씁니다.
⚠ 경고:
추적된 파일에 대한 커밋되지 않은 로컬 변경 내용은 모두 손실됩니다.
Git에 의해 추적되지 않는 로컬 파일은 영향을 받지 않습니다.
합니다.origin/<branch>최신 정보:
git fetch --all
현분를백예다니합업):master):
git branch backup-master
하십시오.origin/master파일을 확인합니다.
git reset --hard origin/master
설명:
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
이렇게 하면 커밋되지 않은 모든 변경 사항이 제거되고 다음을 당깁니다.
git reset --hard HEAD
git pull
경고:git clean추적되지 않은 모든 파일/디렉토리를 삭제하고 취소할 수 없습니다.
은 그냥 가은그냥.clean -f도움이 되지 않습니다.추적 해제된 DIRECTIES가 있는 경우 -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
...
나는 고슴도치처럼 답이 형편없다고 생각합니다.하지만 헤지호그의 대답이 더 나을 수도 있지만, 저는 그것이 그렇게 우아하다고 생각하지 않습니다.은 제가발방다같음습다니과법은견한같▁using다습▁the를 사용하는 것입니다.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이 옵션의 값입니다.사용하기로 선택했습니다.their은 " 변사다항옵은션경른다"입니다.)ours충돌이 있는 경우 변경 사항)을 클릭합니다.
수행하는 대신:
git fetch --all
git reset --hard origin/master
다음을 수행하는 것이 좋습니다.
git fetch origin master
git reset --hard origin/master
오리진/마스터 분기로 재설정하려면 모든 원격 및 분기를 가져올 필요가 없습니다.
가장 좋은 방법은 먼저 다음을 수행하는 것 같습니다.
git clean
추적되지 않은 모든 파일을 삭제한 다음 일반적인 작업을 계속하려면 다음과 같이 하십시오.git pull...
경고. 이렇게 하면 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}
이 명령어는 로컬 변경사항을 삭제하는 데 도움이 될 수 있습니다.
git checkout <your-branch> -f
그런 다음 정리를 수행합니다(작업 트리에서 추적되지 않은 파일 제거).
git clean -f
추적되지 않은 파일 외에 추적되지 않은 디렉터리를 제거하려는 경우:
git clean -fd
대신하와 git pull사용해 보십시오.
git fetch --all
다음 순서:
git reset --hard origin/master.
제게 유일하게 효과가 있었던 것은:
git reset --hard HEAD~5
이렇게 하면 커밋 5개를 되돌린 다음
git pull
Git merge를 실행 취소하는 방법을 찾아봄으로써 그것을 발견했습니다.
이 모든 솔루션의 문제는 이 솔루션이 너무 복잡하거나 더 큰 문제는 추적되지 않은 모든 파일을 웹 서버에서 제거한다는 것입니다. 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 e.g. 'merge origin/master')
git pull
첫 번째 명령은 최신 데이터를 가져옵니다.
두 번째 명령은 리포지토리에 추가 중인 파일이 있는지 확인하고 충돌을 일으킬 수 있는 추적되지 않은 파일을 로컬 리포지토리에서 삭제합니다.
세 번째 명령은 로컬로 수정된 모든 파일을 체크아웃합니다.
마지막으로, 최신 버전으로 업데이트하기 위해 풀을 사용하지만, 이번에는 아무런 충돌 없이, 보고서에 있는 추적되지 않은 파일이 더 이상 존재하지 않으며 로컬로 수정된 모든 파일이 이미 저장소와 동일하기 때문입니다.
우선, 표준 방법을 사용해 보십시오.
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/ all committs)를 한후 당깁니다.", "dir", "dir", "dir", "dr", "dr", "dr", "dr "commits", "dr", "dr", "dr", "d
ㅠㅠgit reset HEAD --hard경우에 따라 실패할 수 있습니까?
의 사용자 지정
.gitattributes file하고 있다
eol=lf.으로 인해 텍스트 에서 CRLF 줄 변경 사항을 할 수 .git 특성의 규칙을 사용하면 Git가 일부 텍스트 파일에서 CRLF 줄 끝을 LF로 변환하여 일부 파일 변경 내용을 수정할 수 있습니다.변경 사항을 /LF"에서 하여) .
git status) 또는 시도:git config core.autcrlf false그들을 일시적으로 무시하는 것.파일 시스템 호환 안 됨
권한 속성을 지원하지 않는 파일 시스템을 사용하는 경우.를 들어 두 개의 Mac("를들두", "의개저가있" 하나는 Linux/Mac에 있습니다.
ext3/hfs+및 FAT32 기반 시스템에 시스템아시다시피, 두 가지 다른 종류의 파일 시스템이 있습니다. 따라서 유닉스 권한을 지원하지 않는 시스템은 기본적으로 그런 종류의 권한을 지원하지 않는 시스템의 파일 권한을 재설정할 수 없습니다. 그래서 어떻게 하든.
--hard항상 "변화"를 감지하려고 합니다.
보너스:
앞의 답변에서 풀/페치/합병에 대해 이야기할 때, 저는 흥미롭고 생산적인 트릭을 공유하고자 합니다.
git pull --rebase
위의 명령어는 많은 시간을 절약한 나의 Git 생활에서 가장 유용한 명령어입니다.
서버에 새로 커밋하기 전에 이 명령을 사용해 보십시오. 그러면 최신 서버 변경 사항(fetch + merge)이 자동으로 동기화되고 Git 로그의 맨 위에 커밋이 배치됩니다.수동 풀/머징에 대해 걱정할 필요가 없습니다.
자세한 내용은 "git pull --rebase"에서 확인하십시오.
저도 같은 문제가 있었습니다.아무도 나에게 이 해결책을 주지 않았지만, 그것은 나에게 효과가 있었습니다.
해결 방법은 다음을 해결했습니다.
- 모든 파일을 삭제합니다.▁the만 .
.git디렉토리입니다. git reset --hard HEADgit pullgit push
이제 효과가 있습니다.
지점 이름을 항상 붙여넣지 않거나 스크립트 내에서 자동화하려는 경우 일반적인 솔루션은 다음과 같습니다.
git fetch
git reset --keep origin/$(git rev-parse --abbrev-ref HEAD)
로컬 변경 내용도 재설정하려는 경우:
git fetch
git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)
다음 명령을 사용하여 bash 별칭을 추가할 수도 있습니다.
alias gplf='git fetch && echo "HEAD was at $(git rev-parse --short HEAD)" && git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)'
저도 비슷한 문제가 있었습니다.나는 이것을 해야만 했습니다.
git reset --hard HEAD
git clean -f
git pull
저는 다른 답변들을 요약했습니다.은 수다있니습을 할 수 있습니다.git pull오류 없음:
git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull
경고:이 스크립트는 매우 강력하므로 변경 내용이 손실될 수 있습니다.
저의 비슷한 경험을 바탕으로 위의 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
여기서 대부분의 대답은 다음과 같은 것에 집중되어 있는 것 같습니다.masterbranch;두 장소에서 때branch; ▁to▁in에▁branch▁in;▁▁when▁however,▁there▁a▁on▁andbr▁i▁different▁i▁the▁reb를다합원반니▁feature기▁through곳▁times▁are▁reflected되영에다른▁places이값기▁same▁twoops▁a본곳▁one▁without의▁other▁be▁the한▁ho▁want'
RNA의 대답과 비슷한 질문에 대한 토렉의 대답을 바탕으로, 저는 훌륭하게 작동하는 이것을 생각해냈습니다.
git fetch
git reset --hard @{u}
분기에서 이를 실행하면 로컬 분기만 업스트림 버전으로 재설정됩니다.
이것은 git alias에 잘 넣을 수 있습니다.git forcepull)도 마찬가지입니다.
git config alias.forcepull "!git fetch ; git reset --hard @{u}"
아니면, 당신의.gitconfig파일 이름:
[alias]
forcepull = "!git fetch ; git reset --hard @{u}"
맛있게 드세요!
나는 같은 문제를 가지고 있었고, 어떤 이유로, 심지어.git clean -f -d하지 않을 것입니다.이유는 다음과 같습니다. 어떤 이유에서인지 파일이 Git에 의해 무시되면(아마도 .gitignore 항목을 통해) 나중에 풀로 이 파일을 덮어쓰는 것에 대해 여전히 신경이 쓰이지만, 새로 고치지 않으면 제거되지 않습니다.-x.
저는 두 가지 가능한 갈등 원인이 있다고 생각하는데, 이는 별도로 해결되어야 하며, 위의 답변 중 어느 것도 두 가지 모두를 다루지 않습니다.
되지 않은 은 수동하거나 다른 삭제해야 .
git clean -f -d원격 분기에 없는 로컬 커밋도 삭제해야 합니다.다음과 같습니다. IMO 사용는가쉬방같다습다니과음은법운장하를▁im다.
git reset --hard origin/master하고 'master'를git fetch origin으으으으으으으으으으으으으으으으)
더 쉬운 방법은 다음과 같습니다.
git checkout --theirs /path/to/file.extension
git pull origin master
이렇게 하면 로컬 파일이 git에 있는 파일로 재정의됩니다.
왜 아무도 그 일에 대해 말하지 않았는지 모르겠어요.FETCH_HEAD 아직은.
git fetch origin master && git reset --hard FETCH_HEAD
이를 별칭에 넣으려면 다음 명령을 사용합니다.
git config --global alias.fpull '!git fetch origin master && git reset --hard FETCH_HEAD'
나는 이상한 상황이 있는데 둘 다git clean또는git reset에서 충돌하는 파일을 . 충돌하는 파일을 제거해야 합니다.git index추적되지 않은 모든 파일에서 다음 스크립트를 사용합니다.
git rm [file]
그러면 저는 아주 잘 당길 수 있습니다.
저는 훨씬 쉽고 덜 고통스러운 방법을 알고 있습니다.
$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp
바로 그거야!
제가 직접 해결한 방법은 해결했습니다.
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
다음 번에는 "gitstash branch"를 검색하여 보다 깨끗한 방법으로 이 문제를 처리할 수 있습니다. 단, stash는 처음 몇 번의 시도에서 문제를 일으킬 수 있습니다. 따라서 중요하지 않은 프로젝트에 대한 첫 번째 실험을 수행하십시오.
요구 사항:
- 로컬 변경사항을 추적하여 아무도 변경사항을 잃어버리지 않도록 합니다.
- 로컬 리포지토리를 원격 원본 리포지토리와 일치시키십시오.
솔루션:
- 로컬 변경 내용을 저장합니다.
.gitignore를 무시하고 origin으로 하드 재설정한 파일 및 디렉터리를 정리하여 가져옵니다.
git stash --include-untracked git fetch --all git clean -fdx git reset --hard origin/master
그냥 해요
git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname
따라서 보관할 파일이나 디렉터리를 삭제하는 등 원하지 않는 모든 부작용을 방지할 수 있습니다.
원래 질문에도 불구하고 상위 답변은 유사한 문제를 가지고 있지만 로컬 파일을 손실하지 않으려는 사용자에게 문제를 일으킬 수 있습니다.예를 들어, 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.
인덱스와 헤드를 다음으로 재설정합니다.origin/master그러나 작업 트리를 재설정하지 마십시오.
git reset origin/master
언급URL : https://stackoverflow.com/questions/1125968/how-do-i-force-git-pull-to-overwrite-local-files
'programing' 카테고리의 다른 글
| 현대 C++11 / C++14 / C++17 및 미래 C++20의 문자열에 열거 (0) | 2023.05.09 |
|---|---|
| 새 문서를 삽입할 수 있는 경우 업데이트하는 방법은 무엇입니까? (0) | 2023.05.09 |
| 열거 결합 (0) | 2023.05.09 |
| Swift의 다중 형식 제약 조건 (0) | 2023.05.09 |
| C# 빈 문자열 배열 선언 (0) | 2023.05.09 |