문제

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

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

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

내가 받고있는 오류는 다음과 같습니다.

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

Git이 강제로 덮어쓰도록 하려면 어떻게 해야 하나요?그 사람은 디자이너입니다. 일반적으로 저는 모든 충돌을 직접 해결하므로 서버에는 컴퓨터에서 업데이트해야 하는 최신 버전이 있습니다.

도움이 되었습니까?

해결책

중요 : 로컬 변경 사항이 있으면 손실됩니다. 있건 없건간에 --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 도움이되지 않습니다. 추적되지 않은 디렉토리가있는 경우 -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의 대답이 더 좋을지 모르지만, 그것이 가능한 한 우아하다고 생각하지 않습니다. 내가 이것을 발견 한 방식은 정의 된 전략과 함께 "페치"와 "병합"을 사용하는 것입니다. 이 과정을 강요하려는 파일 중 하나가 아닌 한 로컬 변경 사항이 보존되도록해야합니다.

먼저 당신의 변화를 약속하십시오

 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}

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

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 병합을 취소하는 방법.

이러한 모든 솔루션의 문제점은 모두 너무 복잡하거나 더 큰 문제는 웹 서버에서 추적되지 않은 모든 파일을 제거한다는 것입니다. 서버는 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 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 파일을 제거합니다 (Excempt .git/ 당신이 모든 커밋이있는 곳)) 다시 당기십시오.


git reset HEAD --hard 어떤 경우에는 실패 할 수 있습니까?

  1. 사용자 정의 규칙 .gitattributes file

    was eol=lf .gitattributes의 규칙으로 인해 일부 텍스트 파일에서 CRLF 라인 끝을 LF로 변환하여 GIT가 일부 파일 변경을 수정할 수 있습니다.

    이 경우 CRLF/LF 변경 사항을 커밋해야합니다 (검토하여 git status) 또는 시도 : git config core.autcrlf false 일시적으로 무시합니다.

  2. 파일 시스템은 적합성이 없습니다

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

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

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

나는 그것을 해결했다 :

  1. 모든 파일을 삭제합니다. 그냥 떠나십시오 .git 예배 규칙서.
  2. git reset --hard HEAD
  3. git pull
  4. git push

이제 작동합니다.

보너스:

이전 답변에서 Pull/Fetch/Merge에 대해 말하면서 흥미롭고 생산적인 트릭을 공유하고 싶습니다.

git pull --rebase

위의 명령은 내 Git Life에서 가장 유용한 명령으로 많은 시간을 절약했습니다.

새로 서버로 커밋하기 전에이 명령을 시도하면 최신 서버 변경 (Fetch + Merge와 함께)을 자동으로 동기화하고 GIT 로그의 상단에 커밋을 배치합니다. 수동 풀/병합에 대해 걱정할 필요가 없습니다.

세부 사항을 찾으십시오 "git pull -rebase"는 무엇을합니까?.

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

git reset --hard HEAD
git clean -f
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

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

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

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

나는 갈등의 두 가지 가능한 원인이 있다고 생각하며, 이는 별도로 해결되어야하며, 위의 답변 중 어느 것도 두 가지를 다루지 않는 한 아무 말도하지 않습니다.

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

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

여기서 대부분의 답변이 master 나뭇가지; 그러나 두 곳의 동일한 기능 지점에서 작업 할 때가 있으며, 후프를 통해 많은 점프를하지 않고 하나의 리베이스가 다른 하나에 반사되기를 원합니다.

조합을 기반으로합니다 RNA의 대답 그리고 비슷한 질문에 대한 Torek의 답변, 나는 이것을 생각해 냈습니다.

git fetch
git reset --hard @{u}

이것을 지점에서 실행하면 로컬 브랜치를 업스트림 버전으로 만 재설정합니다.

이것은 GIT 별칭에 잘게 넣을 수 있습니다 (git forcepull) 또한:

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

또는, 당신의 .gitconfig 파일:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

즐기다!

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

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

이것은 git의 파일로 로컬 파일을 무시합니다.

나는 같은 문제가 있었고 어떤 이유로 git clean -f -d 그렇게하지 않을 것입니다. 그 이유는 다음과 같습니다. 어떤 이유로, git에 의해 파일을 무시하는 경우 (.gitignore 항목을 통해) 나중에 이것을 덮어 쓰는 것에 대해 여전히 귀찮게합니다. 당기다, 그러나 a 깨끗한 추가하지 않으면 제거하지 않습니다 -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"를 찾아 보다 깔끔한 방식으로 이 문제를 처리할 수 있을 것입니다. 하지만 stash는 처음 몇 번의 시도에서 문제를 일으킬 가능성이 높으므로 중요하지 않은 프로젝트에서 먼저 실험을 수행하십시오.

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

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

그게 다야!

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

git rm [file]

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

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

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

이 명령을 실행 한 후 확인/당기는 것

git pull origin master

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

원래의 질문에도 불구하고, 최고 답변은 비슷한 문제가 있지만 로컬 파일을 잃고 싶지 않은 사람들에게 문제를 일으킬 수 있습니다. 예를 들어, Al-Punk 및 Crizcraig의 의견을 참조하십시오.

다음 버전은 로컬 변경 사항을 임시 지점으로 저장합니다 (tmp), 원래 지점을 확인합니다 (IS가 가정합니다. 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.

그냥 해

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

따라서 보관하고자하는 파일 또는 디렉토리 삭제와 같은 원치 않는 부작용을 피하십시오.

인덱스와 헤드를 재설정하십시오 origin/master,하지만 작업 트리를 재설정하지 마십시오.

git reset origin/master

나는 모든 답변을 읽었지만 이것을하는 단일 명령을 찾고있었습니다. 여기 내가 한 일이 있습니다. .gitconfig에 git 별칭을 추가했습니다

[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

요구 사항 :

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

해결책:

  1. 숨기는 장소 로컬 변경.
  2. 술책 a 깨끗한파일 그리고 디렉토리 묵살 .gitignore 그리고 하드 리셋 에게 기원.

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top