it-gundan.com

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

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

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

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

이것이 내가 얻는 오류이다.

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

Git이 그들을 덮어 쓰게하려면 어떻게해야합니까? 그 사람은 디자이너입니다. 보통 모든 충돌을 손으로 해결하므로 서버는 컴퓨터에서 업데이트해야하는 최신 버전을 가지고 있습니다.

6088
Jakub Troszok

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

이 시도:

git reset --hard HEAD
git pull

그것은 당신이 원하는 것을해야합니다.

808
Travis Reeder

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

헤지 호그처럼 나는 대답이 끔찍하다고 생각한다. 그러나 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"는 해당 옵션의 값입니다. 충돌이있는 경우 "자신의"변경 대신 "변경"을 사용하려고 선택합니다.

347
Richard Kersey

대신에 :

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

나는 다음과 같이 조언 할 것이다.

git fetch Origin master
git reset --hard Origin/master

Origin/master 브랜치로 리셋 할 경우 모든 리모컨과 브랜치를 가져올 필요가 없습니다.

251
Johanneke

가장 좋은 방법은 먼저 다음과 같이하는 것입니다.

git clean

추적 할 수없는 파일을 모두 삭제 한 다음 일반적인 git pull ...로 계속 진행하십시오.

125
Jakub Troszok

경고 : 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}
102
Hedgehog

이 명령은 로컬 변경 사항을 버리는 데 유용 할 수 있습니다.

git checkout <your-branch> -f

그런 다음 정리 (작업 트리에서 untracked 파일을 제거함)를 수행하십시오.

git clean -f

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

git clean -fd
88
Vishal

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

git fetch --all

뒤에 :

git reset --hard Origin/master.

82
Lloyd Moore

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

git reset --hard HEAD~5

이렇게하면 커밋 5 번을 수행 한 다음

git pull

병합 병합을 취소하는 방법 을 (를) 찾는 것으로 나타났습니다.

55
Chris BIllante

이 모든 솔루션의 문제점은 모두 너무 복잡하거나 심지어 더 큰 문제는 웹 서버에서 추적되지 않은 파일을 모두 제거한다는 것입니다. 웹 서버에는 항상 필요한 구성 파일이 있기 때문에 원하지 않는 파일입니다. 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에있는 추적되지 않은 파일이 더 이상 존재하지 않으며 로컬로 수정 된 모든 파일이 저장소와 이미 동일하므로.

51
Strahinja Kustudic

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

나는 그것을 다음과 같이 해결했다.

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

이제 작동합니다.

39
John John Pichler

우선, 표준 방식을 시도하십시오 :

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가 실패 할 수있는 이유는 무엇입니까?

  1. .gitattributes file의 맞춤 규칙

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

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

  2. 파일 시스템 비 호환성

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

    알다시피, 파일 시스템에는 두 가지 종류가 있습니다. 따라서 Unix 사용 권한을 기본적으로 지원하지 않는 시스템에서는 기본적으로 해당 사용 권한을 지원하지 않는 시스템에서 파일 사용 권한을 재설정 할 수 없으므로 아무리 --hard를 시도해도, git은 항상 "변경"을 감지합니다.

34
kenorb

보너스:

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

git pull --rebase

위의 명령은 많은 시간을 절약 할 수있는 가장 유용한 명령입니다.

새로 커밋을 서버에 푸시하기 전에이 명령을 실행하면 서버의 최신 변경 사항 (패치 + 병합)이 자동으로 동기화되고 커밋이 맨 위에 표시됩니다. 수동 끌어 오기/병합에 대해 걱정할 필요가 없습니다.

"git pull --rebase"의 기능은 무엇입니까?.

33
Sazzad Hissain Khan

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

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

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

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

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

27
Robert Moon

내 자신의 비슷한 경험을 바탕으로, 위의 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
26
Rolf Kaiser

나는 갈등의 두 가지 가능한 원인이 있다고 생각합니다. 분열은 따로 해결되어야하며, 위의 답변 중 어느 것도 둘 다 다루지 않는다고 말할 수 있습니다.

  • 추적 할 수없는 로컬 파일은 수동으로 (더 안전하게) 또는 다른 대답에서 제안 된대로 git clean -f -d로 삭제해야합니다

  • 원격 브랜치에없는 로컬 커밋도 삭제해야합니다. 이걸 달성하는 가장 쉬운 방법은 IMO입니다 : git reset --hard Origin/master ( 'master'를 당신이 작업하고있는 모든 브랜치로 대체하고, 먼저 git fetch Origin를 실행하십시오)

23
tiho

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

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

이렇게하면 로컬 파일이 git의 파일로 대체됩니다.

20
maximus 69

여기에있는 대부분의 답변은 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}"

즐겨!

20
JacobEvelyn

나는 같은 문제가 있었고 어떤 이유로 git clean -f -d조차도 그렇게하지 않았다. 이유는 다음과 같습니다. 어떤 이유로 Git에서 파일을 무시하면 (.gitignore 항목을 통해 가정합니다.) 나중에 pull , 그러나 clean 로 덮어 쓰는 것에 대해 여전히 귀찮습니다. -x를 추가하지 않으면 제거하십시오.

19
Tierlieb

나는 방금 다음과 같이 자신을 해결했다.

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"를 검색하여 더 깨끗한 방법으로 처리 할 수 ​​있습니다.

18
Simon B.

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

git rm [file]

그렇다면 나는 괜찮아.

17
Chen Zhang

나는 훨씬 쉽고 덜 고통스러운 방법을 안다.

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

그게 다야!

16
ddmytrenko

이 네 가지 명령이 나를 위해 일합니다.

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

이 명령을 실행 한 후 확인/끌어 오기

git pull Origin master

나는 많은 노력을했지만 마침내이 명령으로 성공을 거두었습니다.

13
vishesh chandra

그냥 해

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

따라서 보관하고 싶은 파일이나 디렉토리 삭제와 같은 원치 않는 부작용을 피할 수 있습니다.

12
user2696128

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

12
Snowcrash

인덱스와 머리글을 Origin/master로 재설정하지만 작업 트리를 재설정하지 마십시오.

git reset Origin/master
11
user811773

요구 사항 :

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

해결책:

  1. 스 태쉬 로컬 변경 사항.
  2. Fetchcleanfilesdirectories 무시 . gitignore하드 리셋에서 원본으로.

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard Origin/master
    
9
vezenkov

나는 모든 대답을 읽었지만 이것을하기 위해 하나의 명령을 찾고있었습니다. 여기 내가 한 일이있다. .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
9
Venkat Kotra

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
8
Jim Driscoll

변경 내용을 되돌리기위한 최상의 방법입니다.

  • git commitreflog (아래 참조)에 저장되도록 단계별 변경 사항을 커밋합니다.
  • git fetch 최신 업스트림 변경 사항 가져 오기
  • git reset --hard Origin/master 원본 마스터 분기로 하드 재설정

reflog브랜치와 로컬 레파지토리에서 업데이트되는 다른 레퍼런스를 기록. 또는 단순히 reflog변경 내역입니다.

따라서 항상 커밋하는 것이 좋습니다. reflog에는 커밋이 추가되어 삭제 된 코드를 검색 할 수 있습니다.

7
Jordan Georgiev

이 명령을 사용하여 로컬 파일을 제거하고 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이 공백으로 시작하는 모든 행에 대해 호출됩니다.

5
Glutexo

나는 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)

이제 준비되었습니다.

5
Helzgate

Windows에서이 단일 명령을 수행하십시오.

git fetch --all & git reset --hard Origin/master
3
Luca C.

프로젝트 기본 폴더에있는 파일로 해당 파일을 무시할 수 있습니다.

.gitignore

public/images/*

그런 다음 변경 사항을 가져온 다음 gitignore 파일에서 해당 행을 제거하십시오.

3
Daniel Gaytán

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

0
Suge

1 : 이전 커밋으로 재설정

git reset --hard HEAD

2 : 지워지지 않은 파일 삭제

git clean -f

3 : 커밋을 당깁니다.

git pull

출처 :

0
abhijithvijayan

당신은 시도 할 수 있습니다

git pull --force

모든 로컬 파일을 덮어 쓰려면

0
Ultan Kearns
git fetch --all

마스터 브랜치에 있다면

git reset --hard Origin/master

else

git reset --hard Origin/master<branch_name>
0
SUJITKUMAR SINGH

일반적인 방식으로 원격 추적 지점으로 재설정하려면 다음을 사용하십시오.

git fetch
git reset --keep Origin/$(git rev-parse --abbrev-ref HEAD)

로컬 변경 사항도 재설정하려면 다음을 수행하십시오.

git fetch
git reset --hard Origin/$(git rev-parse --abbrev-ref HEAD)
0
warch