“git pull”을 사용하여 로컬 파일을 덮어 쓰려면 어떻게합니까?


7182

로컬 파일을 강제로 덮어 쓰려면 어떻게해야 git pull합니까?

시나리오는 다음과 같습니다.

  • 팀원이 작업중인 웹 사이트의 템플릿을 수정하고 있습니다.
  • 그들은 이미지 디렉토리에 이미지를 추가하고 있습니다 (그러나 소스 제어하에 이미지를 추가하는 것을 잊어 버립니다)
  • 그들은 나중에 나에게 우편으로 이미지를 보내고 있습니다.
  • 소스 컨트롤 아래에 이미지를 추가하고 다른 변경 사항과 함께 이미지를 GitHub에 푸시합니다.
  • Git이 파일을 덮어 쓰고 싶지 않기 때문에 GitHub에서 업데이트를 가져올 수 없습니다.

이것은 내가 얻는 오류입니다.

오류 : 추적되지 않은 작업 트리 파일 'public / images / icon.gif'를 병합으로 덮어 씁니다.

힘내 강제로 그들을 덮어 쓰려면 어떻게해야합니까? 사람은 디자이너입니다-일반적으로 모든 충돌을 수동으로 해결하므로 서버는 컴퓨터에서 업데이트 해야하는 최신 버전을 가지고 있습니다.


17
파일을 잃을지도 모른다고 생각하는 사람을 읽은 사람, 나는이 위치에 있었고 Sublime Text의 버퍼가 나를 구했다는 것을 알았습니다. 내가 무언가를 작업하고 있다면 이와 비슷한 문제를 해결하거나 실수로 모든 것을 삭제합니다. 이 질문에 대한 대답은 파일 (의 좋은 기회가 거기에있는) 다음 파일이 여전히 실행 취소 역사의이 숭고한 그냥이 중 하나입니다, 또는 것 숭고한에서 열려 있었다
토니 리

61
git reset --hard origin/branch_to_overwrite
앤드류 앳킨슨

1
기본적으로 초기 체크 아웃 후 개발에서 끌어 당김 만 수행합니다 -b. 당신의 일을하고 나서 다시 밀어 넣으십시오.
ldgorman

1
짧은 대답 : 분기를 삭제하고 다시 만드십시오. 1. 브랜치 삭제 : git branch <branch> -D2. 충돌 전에 커밋으로 재설정 : git reset <commit> --hard3. 브랜치 다시 생성 : git branch <branch>4. 서버에 추적 설정 : git --set-upstream-to=origin/<branch> <branch> 5. Pull: git pull`
Nino Filiu

1
모든 CRLF를 LF 엔딩으로 변경하려면 (깨끗하게 시작)git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
Chloe

답변:


10031

중요 사항 : 로컬 변경 사항이 있으면 손실됩니다. --hard옵션이 있든 없든 , 푸시되지 않은 로컬 커밋은 손실됩니다. [*]

Git에 의해 추적 되지 않는 파일 (예 : 업로드 된 사용자 컨텐츠)이있는 경우 해당 파일은 영향을받지 않습니다.


이것이 올바른 방법이라고 생각합니다.

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

14
조심해! 로컬 커밋되지 않은 커밋이 있으면 분기에서 제거합니다! 이 솔루션은 추적되지 않은 파일을 리포지토리에 그대로 유지하지만 다른 모든 파일은 덮어 씁니다.
Matthijs P

479
인기있는 질문이므로 여기에 맨 위의 의견을 분명히하고 싶습니다. 이 답변에 설명 된대로 명령을 실행했지만 모든 로컬 파일을 제거하지 않았습니다. 원격으로 추적 된 파일 만 덮어 쓰기되었으며 여기에 있었던 모든 로컬 파일은 그대로 유지됩니다.
Red

14
원격 지사 이름이 "master"와 다른 git reset --hard origin/branch-name
리포지토리에서 가져 오는

97
이 질문과 답변에 대한 git pull -f
찬성 의견

7
하드 리셋 전에 푸시되지 않은 커밋은를 사용하여 복구 할 수 있습니다 git reflog. 를 사용하여 로컬 사본을 정리할 때까지 git gc모든 항목이 손실됩니다
Koen.

933

이 시도:

git reset --hard HEAD
git pull

원하는 것을해야합니다.


16
이 작업을 수행했으며 더 이상 저장소에없는 일부 로컬 파일이 디스크에 남아 있습니다.
Piotr Owsiak

26
나는 이것이 옳다고 생각하지 않습니다. 위의 질문에서 요청한 덮어 쓰기가 아닌 병합을 수행합니다. "git을 덮어 쓰려면 어떻게해야합니까?" 나는 대답을 얻지 못하고, 현재 그것을 찾고 있습니다 .... 현재 "git checkout BranchWithCodeToKeep"을 유지하려는 코드로 지점으로 전환 한 다음 "git branch -D BranchToOverwrite"를 수행 한 다음 마지막으로 "git checkout -b BranchToOverwrite". 이제 병합을 수행하지 않고도 BranchToTowrite 분기에 BranchWithCodeToKeep의 정확한 코드가 생깁니다.
felbus

252
대신 '자식 풀'을 사용하여 병합의 '--hard 원산지 / 마스터를 다시 힘내'--all 다음에 인출 자식 시도
로이드 무어

5
@, @lloydmoore 솔루션이 나를 위해 일했습니다. 단지 의견이 아니라 답변이 될 수 있습니다.
Max Williams

2
현재 변경 사항을 마지막 분기 커밋으로 다시 재설정합니다. 그런 다음 git pull은 최신 분기의 변경 사항을 병합합니다. 이것은 내가 원하는 것을 정확하게 했어요 .. 감사합니다!
Codeversed

459

경고 : 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
...

33
굉장 ... 내 도트 파일 저장소에 대해 이것을 실행 ... 내 홈 디렉토리에. 내가 정말로 중요한 것을 가지고 있지 않은 것이 좋았습니다 ...
Lauri

7
시나리오 설명은 그가 실제로 내용을 버리고 싶지 않다는 것을 분명히합니다. 오히려 그가 원하는 것은 파일을 덮어 쓸 때 자식 baulking을 중지하는 것입니다. @Lauri, 이것은 당신에게 일어나지 않아야합니다. 불행히도 사람들은 시나리오 설명의 본질을 잘못 읽은 것 같습니다-내 제안을 참조하십시오.
Hedgehog

19
마지막으로 . git clean -f -d는 make clean이 모든 것을 정리하지 못하면 편리합니다.
earthmeLon

7
@crizCraig 추가되지 않은 경우.gitignore
출혈 손가락

5
@earthmeLon, 당신이 원할 수도 있습니다 git clean -dfx. -x무시는 .gitignore. 일반적으로 빌드 제품은 .gitignore에 있습니다.
Paul Draper

384

고슴도치처럼 나는 대답이 끔찍하다고 생각합니다. 그러나 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"는 옵션 이름이고 "-그들의"는 해당 옵션의 값입니다. 충돌이있는 경우 "자신의"변경 사항 대신 "자신의"변경 사항을 사용하도록 선택했습니다.


56
이것이 지금까지 본 최고의 답변입니다. 나는 그것을 시도하지는 않았지만 다른 답변과 달리 추적되지 않은 모든 파일을 압축하려고 시도하지는 않으며 명백한 이유로 매우 위험합니다.
huyz 2018 년

5
Ditto-매우 큰 병합 (GitHub 풀 요청)을 수행 할 때 저에게 효과적이었습니다. 좋은 대답입니다! 필자의 경우 마지막 두 명령은 다음과 같습니다. 1) get fetch other-repo; 2)git merge -s recursive -X theirs other-repo/master
quux00

2
로컬 파일이 아닌 리포지토리 파일과의 충돌을 덮어 씁니다. 맞습니까?
Nathan F.

2
가장 좋은 답변입니다. 가장 높은 대답은 분리 된 머리에 내 경우에 나를 떠났다. 나는 로컬 마스터 지점으로 다시 전환하고 실행git merge -X theirs origin/master
petergus

2
이 (우수한) 답변의 문제점은 때로는 모든 로컬 파일을 추가한다는 것입니다. 생략 된 특정 파일을 추가 할 수도 있습니다. 그러나 가장 좋은 점은 그가해야 할 일을 할 수있게하는 것입니다. 로컬을 추가하십시오. 이미지가 같기 때문에 -X 전략이 필요하지 않을 것입니다. 사실, 나는 그들의 예외가 항상 올바른 선택인지 검토 한 후 이상이 있는지 알아 내고 거기에 추가하기 위해 처음에는 그것을 떠나는 것이 좋습니다. 그러나 저는 편집증입니다.
Bob Kerns 2016 년

279

대신에 :

git fetch --all
git reset --hard origin/master

다음을 수행하는 것이 좋습니다.

git fetch origin master
git reset --hard origin/master

원산지 / 마스터 지점으로 재설정하려는 경우 모든 리모컨과 지점을 가져올 필요가 없습니까?


3
귀하의 답변은 담당자에게 필요한 것입니다. 물어봐야합니다. 추적되지 않은 모든 파일도 제거됩니까?
Nicolas De Jay

5
네, 대부분의 담당자가 여기에서옵니다 :) 또한 추적되지 않은 모든 파일을 제거합니다. 내가 잊어 버렸고 단지 이틀 전에 고통스럽게 생각 나게 한 것…
Johanneke

1
이 다른 답변에 대한 의견을보십시오 : stackoverflow.com/a/8888015/2151700
Johanneke

추적되지 않은 파일은 제거되지 않았습니다. 실제로 내가 기대하는 것입니다. 다른 사람들이 아닌 일부 사람들에게는 그럴만한 이유가 있습니까?
arichards

추적되지 않은 파일은 git reset의 영향을받지 않습니다. 당신도 그들을 제거하려면 git add .먼저 전에git reset --hard
Johanneke

131

가장 좋은 방법은 먼저하는 것 같습니다.

git clean

추적되지 않은 모든 파일을 삭제하고 평소와 같이 계속하려면 git pull...


4
같은 문제를 해결하기 위해 "git clean"을 사용해 보았지만 해결되지 않았습니다. git status는 "지점과 '원산지 / 마스터'가 각각 분기되어 # 2와 9가 각각 다른 커밋을 가지고 있습니다" git pull은 위와 비슷한 것을 말합니다.
slacy

43
git clean은 다소 둔감 한 도구이며 보관하고 싶은 많은 것들을 버릴 수 있습니다. 풀이 성공할 때까지 git이 불평하는 파일을 제거하거나 이름을 바꾸는 것이 좋습니다.
Neil Mayhew

2
나는 이것이 일반적으로 효과가 있다고 생각하지 않습니다. 강제 git pull을 통해 기본적으로 git clone remote를 수행하는 방법이 없습니까?
mathtick

10
@mathick :git fetch origin && git reset --hard origin/master
Arrowmaster

3
여기 git clean에 가장 좋은 대답이 있습니까? 파일을 제거하는 것이 OP가 원하는 것은 아닙니다. 그들은 '로컬 파일 덮어 쓰기'를 삭제하지 말라고 요청했습니다.
JohnAllen

111

경고, 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}

2
아니요 그렇게 생각하지 않습니다. 스 태싱은 커밋되지 않은 파일을 방해하지 않습니다. 위의 내용은 git이 추적하지 않는 파일을 이동 (스테이시)합니다. 이렇게하면 원격으로 추가 된 파일이 아직 컴퓨터로 풀리지 않았지만 사용자가 만든 (!) 파일이 풀리지 않습니다. 커밋되지 않은 작업을 파괴하지 않고 모두. 그게 말이 되길 바래?
Hedgehog

3
1.7.6이없는 경우 전체 리포지토리 --include-untracked를 일시적으로 git add호출 한 다음 즉시 숨겨서 간단히 모방 할 수 있습니다 .
nategood

3
나는 고슴도치에 동의합니다. 여기에서 인기있는 답변을하면 실수로 잃고 싶지 않은 많은 것들을 실수로 죽였다는 것을 알게 될 것입니다.
Guardius

1
병합 / 풀을 덮어 쓰려는 파일 외에도 추적되지 않은 다른 파일이 있었 으므로이 솔루션이 가장 효과적이었습니다. git stash apply병합이 이미 생성 한 파일 ( "이미 존재하며 체크 아웃 없음")을 제외하고 모든 추적되지 않은 파일을 다시 가져 왔습니다. 완벽하게 작동했습니다.
BigBlueHat

2
이것은 가장 깨끗한 답변이며 받아 들여 져야합니다. 타이핑을 저장하려면 짧은 형식을 사용할 수 있습니다 git stash -u.
ccpizza

93

이 명령은 로컬 변경 사항을 버리는 데 도움이 될 수 있습니다.

git checkout <your-branch> -f

그런 다음 정리를 수행하십시오 (작업 트리에서 추적되지 않은 파일을 제거합니다).

git clean -f

추적되지 않은 파일 외에 추적되지 않은 디렉토리를 제거하려면 다음을 수행하십시오.

git clean -fd

시나리오 설명은 그가 실제로 내용을 버리고 싶지 않다는 것을 분명히합니다. 오히려 그가 원하는 것은 파일을 덮어 쓸 때 자식 baulking을 중지하는 것입니다. 내 제안을 참조하십시오.
Hedgehog

3
그 대답은 정확하게 설명에 맞지 않을 수도 있지만 캐리지 리턴 (autocrlf false 인 이벤트)으로 git twiddling의 좌절에서 나를 구해 냈습니다. git reset --hard HEAD가 "no"수정 된 파일을 남기지 않는 경우,이 "-f"플래그는 매우 유용합니다. 무리 감사.
Kellindil

88

와 병합하는 대신 다음을 git pull시도하십시오.

git fetch --all

뒤에 :

git reset --hard origin/master.


61

나를 위해 일한 유일한 것은 :

git reset --hard HEAD~5

이것은 당신에게 5 개의 커밋을 되돌려주고

git pull

나는 Git 병합을 취소하는 방법을 찾는 것을 발견했다 .


이것은 내 지점을 원래
리포지토리로 밀고

안녕하세요, 실제로 이것은 work around효과적인 방법입니다. 몇 번의 커밋에서 충돌이 발생할 수 있으므로 5 번 커밋을 되 돌리면 원격 코드와 충돌하지 않습니다.
Hoang Le

54

이러한 모든 솔루션의 문제점은 모두 너무 복잡하거나 더 큰 문제는 웹 서버에서 추적되지 않은 모든 파일을 제거한다는 것입니다.이 파일은 항상 필요한 구성 파일이 필요하므로 원하지 않습니다 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 pull"대신 "git merge origin / master"를 마지막 줄로 사용하면 (git pull) 대신 git repo에서 변경 사항을 이미 풀었으므로 더 빠릅니다.
Josh

1
물론 git merge origin/master더 빠르고 아마도 더 안전 할 것입니다. 이 스크립트의 파일을 제거하는 동안 누군가가 새로운 변경 사항을 푸시하면 (발생하지는 않지만 가능할 수 있음) 전체 풀이 실패 할 수 있습니다. 내가 pull거기에 넣은 유일한 이유 는 누군가가 마스터 브랜치에서 작업하지 않을 수도 있지만 다른 브랜치에서 스크립트를 보편적으로 사용하기를 원했기 때문입니다.
Strahinja Kustudic

옵션 파일과 같은 파일을 로컬로 만든 경우 파일을에 넣으십시오 .gitignore.
Sebi

52

우선 표준 방법을 시도하십시오.

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 reset HEAD --hard어떤 경우에는 왜 실패 할 수 있습니까?

  1. 의 맞춤 규칙 .gitattributes file

    eol=lf.gitattributes 에 규칙이 있으면 git이 일부 텍스트 파일에서 CRLF 줄 끝을 LF로 변환하여 일부 파일 변경 사항을 수정할 수 있습니다.

    이 경우 이러한 CRLF / LF 변경 사항을 커밋 git status하거나 (에서 검토하여 ) git config core.autcrlf false일시적으로 무시하십시오.

  2. 파일 시스템 비 호환

    권한 속성을 지원하지 않는 파일 시스템을 사용하는 경우 예를 들어 Linux / Mac ( ext3/ hfs+)과 FAT32 / NTFS 기반 파일 시스템에 각각 하나씩 두 개의 저장소 가 있습니다.

    아시다시피 두 종류의 파일 시스템이 있으므로 Unix 권한을 지원하지 않는 시스템은 기본적으로 해당 권한을 지원하지 않는 시스템에서 파일 권한을 재설정 할 수 없으므로 --hard시도 방법에 관계없이 git 항상 "변경"을 감지합니다.


47

나는 같은 문제가 있었다. 아무도 나 에게이 해결책을주지 않았지만 그것은 나를 위해 일했다.

나는 그것을 해결했다 :

  1. 모든 파일을 삭제하십시오. .git디렉토리 만 남겨 두십시오 .
  2. git reset --hard HEAD
  3. git pull
  4. git push

이제 작동합니다.


1
여기도 마찬가지입니다. 때로는 매우 어려운 솔루션 만 작동합니다. 재설정 및 정리만으로는 충분하지 않은 경우가 종종 있습니다.
jdehaan

41

보너스:

이전 답변에서 끌어 오기 / 가져 오기 / 병합에 대해 흥미롭고 생산적인 트릭을 공유하고 싶습니다.

git pull --rebase

이 명령은 Git 생활에서 가장 유용한 명령으로 많은 시간을 절약했습니다.

새로 커밋을 서버로 푸시하기 전에이 명령을 시도하면 최신 서버 변경 사항 (페치 + 병합)을 자동으로 동기화하고 커밋을 Git 로그의 맨 위에 배치합니다. 수동 당김 / 병합에 대해 걱정할 필요가 없습니다.

에서 세부 사항 찾기 "자식 풀 --rebase를"무엇을? .


3
한마디로 : git pull -r.
kenorb 2009 년

29

나는 비슷한 문제가 있었다. 나는 이것을해야했다.

git reset --hard HEAD
git clean -f
git pull

6
git clean주의해서 사용
nategood

29

다른 답변을 요약했습니다. git pull오류없이 실행할 수 있습니다 .

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

경고 :이 스크립트는 매우 강력하여 변경 사항을 잃을 수 있습니다.


2
수정 된 파일 (이전에 체크인 한 파일)을 덮어 쓰고 추적되지 않은 파일 (체크인되지 않은 파일)을 제거합니다. 정확히 내가 찾던 것, 감사합니다!
styfle

3
세 번째 줄 git reset --hard HEAD이 중복 될 수 있습니다. 내 로컬 맨 페이지 (2.6.3) reset는 두 번째 줄에서 git reset --hard origin/master "모든 형식의 기본값은 HEAD입니다"라고 말합니다.
arichards

2
@arichards 귀하의 용의자가 옳다고 생각하지만 두 번째 줄이 (어떤 이유로 든) 작동하지 않으면 세 번째 줄이 재설정하는 것이 좋습니다. 이 솔루션은 최적화 할 필요가 없습니다. 방금 다른 답변을 요약했습니다. 그게 다야. 당신의 의견에 감사드립니다. :)
Robert Moon

28

내 자신의 비슷한 경험을 기반으로 위의 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

"git pull"대신 "git merge origin / master"를 마지막 줄로 사용하면 (git pull) 대신 git repo에서 변경 사항을 이미 풀었으므로 더 빠릅니다.
Josh

수정 된 파일을 체크 아웃해야하므로 100 % 작동합니다. 오래 전에 스크립트를 업데이트했지만 여기에서도 업데이트하는 것을 잊었습니다. 나는 또한 당신과 조금 다르게 사용합니다. M뿐만 아니라 모든 유형의 수정이있는 파일을 체크 아웃하므로 항상 작동합니다.
Strahinja Kustudic

24

나는 두 가지 가능한 갈등의 원인이 있다고 생각합니다.이 원인은 별도로 해결해야하며 위의 대답 중 어느 것도 두 가지를 다룰 수 없다고 말할 수 있습니다.

  • 추적되지 않은 로컬 파일은 수동으로 (safer) 또는 다른 답변에서 제안한대로 삭제해야합니다. git clean -f -d

  • 원격 브랜치에없는 로컬 커밋도 삭제해야합니다. IMO는 이것을 달성하는 가장 쉬운 방법은 다음과 같습니다 : git reset --hard origin/master(작업중 인 지점에 따라 '마스터'를 대체하고 git fetch origin첫 번째를 실행하십시오 )


22

더 쉬운 방법은 다음과 같습니다.

git checkout --theirs /path/to/file.extension
git pull origin master

이것은 로컬 파일을 git의 파일로 덮어 씁니다.


21

여기서 대부분의 답변은 master지점에 초점을 맞춘 것 같습니다 . 그러나 두 개의 다른 위치에서 동일한 기능 지점에서 작업하고 후프를 많이 뛰어 넘지 않고 다른 하나에 리베이스가 반영되기를 원할 때가 있습니다.

RNA의 대답비슷한 질문에 대한 torek의 대답 조합을 바탕으로 , 나는 훌륭하게 작동하는 이것을 생각해 냈습니다.

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}"

즐겨!


이 답변은 현재 어떤 지점에 관계없이 작동하기 때문에 좋습니다!
leafmeal

19

나는 같은 문제를 겪었고 어떤 이유로 든 git clean -f -d그것을하지 않을 수도 있습니다. 이유는 다음과 같습니다. 어떤 이유로 파일이 Git에 의해 무시되면 (.gitignore 항목을 통해) 나중에 pull으로 파일을 덮어 쓰지 않아도 되지만 추가하지 않으면 깨끗이 제거하지 않습니다 -x.


19

나는 훨씬 쉽고 덜 고통스러운 방법을 알고 있습니다.

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

그게 다야!


18

방금이 문제를 직접 해결했습니다.

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는 처음 몇 번의 시도에서 문제를 일으킬 수 있으므로 중요하지 않은 프로젝트를 먼저 실험하십시오 ...


17

나는 git clean그렇지 도 않은 이상한 상황이 git reset있습니다. git index추적되지 않은 모든 파일에서 다음 스크립트를 사용하여 충돌하는 파일을 제거해야 합니다.

git rm [file]

그런 다음 잘 잡아 당길 수 있습니다.


16

git fetch --all && git reset --hard origin/master && git pull


14

원래의 질문에도 불구하고, 최상위 답변은 비슷한 문제가 있지만 로컬 파일을 잃고 싶지 않은 사람들에게 문제를 일으킬 수 있습니다. 예를 들어 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.


13

이 네 가지 명령이 저에게 효과적입니다.

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

이 명령을 실행 한 후 확인 / 풀링하려면

git pull origin master

나는 많은 것을 시도했지만 마침내이 명령으로 성공했습니다.


2
"git branch -D master"분기를 삭제하십시오. 그러니 조심하세요 "git checkout origin / master -b <new branch name>"을 사용하여 새 이름으로 새 분기를 만들고 3,4 줄이 필요합니다. "git clean -f"도 사용하는 것이 좋습니다.
Chand Priyankara

13

그냥 해

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

따라서 유지하려는 파일이나 디렉토리 삭제와 같은 원치 않는 부작용을 피하십시오.


12

색인과 헤드를로 origin/master재설정하지만 작업 트리를 재설정하지 마십시오.

git reset origin/master

나는 개인적으로 이것이 가장 유용하다는 것을 알았습니다. 그런 다음 작업 트리를 유지하여 다시 체크인 할 수 있습니다. 내 문제의 경우 추가 된 것과 동일한 파일이 삭제되어 끼어 들었습니다. 이상하다.
Jason Sebring 2016 년

12

요구 사항 :

  1. 로컬 변경 사항을 추적하면 아무도 잃어 버리지 않습니다.
  2. 로컬 저장소를 원격 오리진 저장소와 일치 시키십시오.

해결책:

  1. 숨기 지역 변경.
  2. 가져 오기깨끗한파일디렉토리를 무시 .gitignore하드 리셋기원 .

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.