“git pull”을 사용하여 로컬 파일을 덮어 쓰려면 어떻게합니까? русском : Как принудительно перезаписать локальные файлы

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

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

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

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

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

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



답변

중요 사항 : 로컬 변경 사항이 있으면 손실됩니다. --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


답변

이 시도:

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”는 옵션 이름이고 “-그들의”는 해당 옵션의 값입니다. 충돌이있는 경우 “자신의”변경 사항 대신 “자신의”변경 사항을 사용하도록 선택했습니다.


답변

대신에 :

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}