git pull
에 로컬 파일을 강제로 덮어 쓰려면 어떻게합니까?
시나리오는 다음과 같습니다.
이것이 내가 얻는 오류이다.
오류 : 통합되지 않은 작업 트리 파일 'public/images/icon.gif'가 병합으로 덮어 씁니다.
Git이 그들을 덮어 쓰게하려면 어떻게해야합니까? 그 사람은 디자이너입니다. 보통 모든 충돌을 손으로 해결하므로 서버는 컴퓨터에서 업데이트해야하는 최신 버전을 가지고 있습니다.
--hard
옵션을 사용하거나 사용하지 않으면 푸시되지 않은 모든 로컬 커밋이 손실됩니다.[*]Git (예 : 업로드 된 사용자 콘텐츠)에서 not tracked 파일을 가지고 있다면이 파일은 영향을받지 않습니다.
나는 이것이 올바른 방법이라고 생각한다.
git fetch --all
그런 다음 두 가지 옵션이 있습니다.
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
이 시도:
git reset --hard HEAD
git pull
그것은 당신이 원하는 것을해야합니다.
경고 : 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
...
헤지 호그처럼 나는 대답이 끔찍하다고 생각한다. 그러나 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"는 해당 옵션의 값입니다. 충돌이있는 경우 "자신의"변경 대신 "변경"을 사용하려고 선택합니다.
대신에 :
git fetch --all
git reset --hard Origin/master
나는 다음과 같이 조언 할 것이다.
git fetch Origin master
git reset --hard Origin/master
Origin/master 브랜치로 리셋 할 경우 모든 리모컨과 브랜치를 가져올 필요가 없습니다.
가장 좋은 방법은 먼저 다음과 같이하는 것입니다.
git clean
추적 할 수없는 파일을 모두 삭제 한 다음 일반적인 git pull
...로 계속 진행하십시오.
경고 : Gitignore 파일에/* 항목이 있으면 파일을 영구히 삭제합니다.
어떤 대답은 끔찍한 것 같습니다. 데이비드 Avsajanishvili 제안을 다음과 같이 @ 로리에 무슨 일이 있었는지 감각에 끔찍한.
오히려 (git> v1.7.6) :
git stash --include-untracked
git pull
나중에 은닉 기록을 정리할 수 있습니다.
수동으로, 하나씩 :
$ git stash list
[email protected]{0}: WIP on <branch>: ...
[email protected]{1}: WIP on <branch>: ...
$ git stash drop [email protected]{0}
$ git stash drop [email protected]{1}
잔인하게도, 한 번에 한 번 :
$ git stash clear
물론 당신이 은닉 한 물건으로 돌아가고 싶다면 :
$ git stash list
...
$ git stash apply [email protected]{5}
이 명령은 로컬 변경 사항을 버리는 데 유용 할 수 있습니다.
git checkout <your-branch> -f
그런 다음 정리 (작업 트리에서 untracked 파일을 제거함)를 수행하십시오.
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 저장소가 아니라 서버.
우리가 사용하고있는 가장 깨끗한 해결책은 다음과 같습니다.
# 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
첫 번째 명령은 최신 데이터를 가져옵니다.
두 번째 명령은 저장소에 추가되는 파일이 있는지 확인하고 충돌이 발생할 수있는 추적되지 않은 파일을 로컬 저장소에서 삭제합니다.
세 번째 명령은 로컬로 수정 된 모든 파일을 체크 아웃합니다.
마지막으로 우리는 최신 버전으로 업데이트하기 위해 노력하지만 이번에는 아무런 충돌없이 repo에있는 추적되지 않은 파일이 더 이상 존재하지 않으며 로컬로 수정 된 모든 파일이 저장소와 이미 동일하므로.
나는 똑같은 문제가 있었다. 아무도 나에게이 해결책을주지 못했지만 그것은 나를 위해 일했습니다.
나는 그것을 다음과 같이 해결했다.
.git
디렉토리 만 남겨 두십시오.git reset --hard HEAD
git pull
git Push
이제 작동합니다.
우선, 표준 방식을 시도하십시오 :
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
이것은 모든 자식 파일 (excempt .git/
dir, 모든 커밋이있는 곳)을 제거하고 다시 가져옵니다.
어떤 경우 git reset HEAD --hard
가 실패 할 수있는 이유는 무엇입니까?
.gitattributes file
의 맞춤 규칙
.gitattributes에서 eol=lf
규칙을 사용하면 일부 텍스트 파일에서 CRLF 행의 끝을 LF (으)로 변환하여 일부 파일 변경 사항을 수정할 수 있습니다.
이 경우 CRLF/LF 변경 사항을 (git status
에서 검토하여) 커미트하거나 git config core.autcrlf false
를 시도하여 일시적으로 무시하십시오.
파일 시스템 비 호환성
권한 속성을 지원하지 않는 파일 시스템을 사용하는 경우 예를 들어 Linux/Mac (ext3
/hfs+
)과 FAT32/NTFS 기반 파일 시스템에 두 개의 리포지토리가 있습니다.
알다시피, 파일 시스템에는 두 가지 종류가 있습니다. 따라서 Unix 사용 권한을 기본적으로 지원하지 않는 시스템에서는 기본적으로 해당 사용 권한을 지원하지 않는 시스템에서 파일 사용 권한을 재설정 할 수 없으므로 아무리 --hard
를 시도해도, git은 항상 "변경"을 감지합니다.
이전 답변에서 끌어 오기/가져 오기/병합에 관해 이야기하면서 흥미롭고 생산적인 트릭을 공유하고 싶습니다.
git pull --rebase
위의 명령은 많은 시간을 절약 할 수있는 가장 유용한 명령입니다.
새로 커밋을 서버에 푸시하기 전에이 명령을 실행하면 서버의 최신 변경 사항 (패치 + 병합)이 자동으로 동기화되고 커밋이 맨 위에 표시됩니다. 수동 끌어 오기/병합에 대해 걱정할 필요가 없습니다.
나는 비슷한 문제가 있었다. 나는 이것을해야했다 :
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이 제공하는 솔루션이 최고입니다. 다른 사람들이 지적했듯이 단순히 하드 리셋을하면 설정 파일과 같이 제거하고 싶지 않은 많은 것들이 포함될 수있는 untracked 파일이 all 제거됩니다. 더 안전한 것은 추가 할 파일 만 제거하는 것입니다.이 경우 업데이트 할 로컬 수정 파일도 모두 체크 아웃해야 할 것입니다.
그 점을 염두에두고, 저는 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
나는 갈등의 두 가지 가능한 원인이 있다고 생각합니다. 분열은 따로 해결되어야하며, 위의 답변 중 어느 것도 둘 다 다루지 않는다고 말할 수 있습니다.
추적 할 수없는 로컬 파일은 수동으로 (더 안전하게) 또는 다른 대답에서 제안 된대로 git clean -f -d
로 삭제해야합니다
원격 브랜치에없는 로컬 커밋도 삭제해야합니다. 이걸 달성하는 가장 쉬운 방법은 IMO입니다 : git reset --hard Origin/master
( 'master'를 당신이 작업하고있는 모든 브랜치로 대체하고, 먼저 git fetch Origin
를 실행하십시오)
쉬운 방법은 다음과 같습니다.
git checkout --theirs /path/to/file.extension
git pull Origin master
이렇게하면 로컬 파일이 git의 파일로 대체됩니다.
여기에있는 대부분의 답변은 master
가지에 중점을 둔 것처럼 보입니다. 그러나 두 개의 다른 장소에서 동일한 지형지 물에서 작업 할 때가 있습니다. 하나의 리베이스가 다른 하나의 리베이스에 반영 되길 원합니다.
RNA의 답 및 비슷한 질문에 대한 답 의 조합을 바탕으로, 나는 훌륭하게 작동하는 이것을 내놓았습니다.
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}"
즐겨!
나는 같은 문제가 있었고 어떤 이유로 git clean -f -d
조차도 그렇게하지 않았다. 이유는 다음과 같습니다. 어떤 이유로 Git에서 파일을 무시하면 (.gitignore 항목을 통해 가정합니다.) 나중에 pull , 그러나 clean 로 덮어 쓰는 것에 대해 여전히 귀찮습니다. -x
를 추가하지 않으면 제거하십시오.
나는 방금 다음과 같이 자신을 해결했다.
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"를 검색하여 더 깨끗한 방법으로 처리 할 수 있습니다.
나는 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 reset --hard HEAD
git checkout Origin/master
git branch -D master
git checkout -b master
이 명령을 실행 한 후 확인/끌어 오기
git pull 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
요구 사항 :
해결책:
Fetchcleanfiles 및 directories 무시 . gitignore 및 하드 리셋에서 원본으로.
git stash --include-untracked
git fetch --all
git clean -fdx
git reset --hard Origin/master
나는 모든 대답을 읽었지만 이것을하기 위해 하나의 명령을 찾고있었습니다. 여기 내가 한 일이있다. .gitconfig에 자식 별칭을 추가했습니다.
[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
git reset --hard
을 사용하지 마십시오. 그것은 완전히 바람직하지 않을 수있는 변경을 제거 할 것입니다. 대신 :
git pull
git reset Origin/master
git checkout <file1> <file2> ...
물론 병합하지 않기 때문에 git fetch
대신 git pull
을 사용할 수 있지만 일반적으로 여기를 계속 당기는 것이 좋습니다.
여기서 일어나는 일은 git pull
원본/마스터 참조를 업데이트하는 것입니다. git reset
는 파일을 업데이트하지 않고 로컬 분기 참조가 Origin/master와 동일하도록 업데이트하므로 체크 아웃 상태는 변경되지 않습니다. git checkout
는 필요에 따라 파일을 로컬 분기 색인 상태로 되돌립니다. 라이브와 업스트림 마스터에 정확히 동일한 파일이 추가 된 경우 인덱스는 이미 재설정 된 파일과 일치하므로 일반적으로 git checkout
을 수행 할 필요가 없습니다.
업스트림 브랜치에 자동으로 적용하려는 커밋이 포함되어있는 경우 프로세스의 미묘한 변형을 따라갈 수 있습니다.
git pull
git merge <commit before problem commit>
git reset <problem commit>
git checkout <file1> <file2> ...
git pull
이 명령을 사용하여 로컬 파일을 제거하고 pull/merge를 수행하지 못하게했습니다. 하지만 조심해! git merge …
를 먼저 실행하여 정말로 제거하고 싶은 파일 만 있는지 확인하십시오.
git merge Origin/master 2>&1 >/dev/null | grep ^[[:space:]] | sed s/^[[:space:]]//g | xargs -L1 rm
git merge
에는 모든 파일이 나열됩니다. 그것들은 약간의 공백 문자로 시작됩니다.2>&1 >/dev/null
는 오류 출력을 표준 출력으로 리디렉션하므로 grep
에 의해 선택됩니다.grep ^[[:space:]]
는 파일 이름이있는 행만 필터링합니다.sed s/^[[:space:]]//g
는 처음부터 공백을 제거합니다.xargs -L1 rm
는 각 파일에서 rm
을 호출하여 삭제합니다.주의해서 처리 : git merge
가 출력하는 모든 것은 rm
이 공백으로 시작하는 모든 행에 대해 호출됩니다.
나는 Angular2-Webpack-Starter에서 Material2 브랜치를 사용하려고 시도하고 있었고 시간이있었습니다. 이것이 내가 해당 지점을 다운로드하여 사용할 수있는 유일한 방법이었습니다.
git clone --depth 1 https://github.com/angularclass/angular2-webpack-starter.git
cd angular2-webpack-starter/
git checkout -b material2
프로젝트 폴더를 열고 숨김이 아닌 모든 파일과 폴더를 삭제하십시오. 모든 숨겨진 것들을 남겨주세요.
git add .
git commit -m "pokemon go"
git reset --hard
git pull Origin material2
(에디터가 뜨면 ': wq'를 치고, Enter)
이제 준비되었습니다.
Windows에서이 단일 명령을 수행하십시오.
git fetch --all & git reset --hard Origin/master
프로젝트 기본 폴더에있는 파일로 해당 파일을 무시할 수 있습니다.
.gitignore
public/images/*
그런 다음 변경 사항을 가져온 다음 gitignore 파일에서 해당 행을 제거하십시오.
git fetch --all && git reset --hard Origin/master && git pull
1 : 이전 커밋으로 재설정
git reset --hard HEAD
2 : 지워지지 않은 파일 삭제
git clean -f
3 : 커밋을 당깁니다.
git pull
출처 :
당신은 시도 할 수 있습니다
git pull --force
모든 로컬 파일을 덮어 쓰려면
git fetch --all
마스터 브랜치에 있다면
git reset --hard Origin/master
else
git reset --hard Origin/master<branch_name>
일반적인 방식으로 원격 추적 지점으로 재설정하려면 다음을 사용하십시오.
git fetch
git reset --keep Origin/$(git rev-parse --abbrev-ref HEAD)
로컬 변경 사항도 재설정하려면 다음을 수행하십시오.
git fetch
git reset --hard Origin/$(git rev-parse --abbrev-ref HEAD)