다음 추적되지 않은 작업 트리 파일은 병합으로 덮어 쓰지만 걱정하지 않습니다.


344

내 지점에는 .gitignore에 파일이 있습니다.

다른 지점에서는 해당 파일이 없습니다.

다른 지점을 내 머지에 병합하고 싶습니다. 해당 파일이 더 이상 무시되지 않는지 상관하지 않습니다.

불행히도 나는 이것을 얻는다 :

다음 추적되지 않은 작업 트리 파일을 병합하여 덮어 씁니다.

파일을 직접 찾거나 이동하거나 삭제하지 않고 파일을 덮어 쓰기 위해 pull 명령을 어떻게 수정합니까?





1
: 이것은 단지 병합에서 당신을 차단하고 파일을 제거하므로 가장 좋은 대답이다 stackoverflow.com/a/52255219/551045
REDX

답변:


538

문제는 파일을 로컬로 추적하지 않지만 동일한 파일을 원격으로 추적하므로 버전을 제어하지 않는 로컬 파일을 시스템에서 "풀"하기 위해 시스템을 강제로 덮어 쓰는 것입니다.

달리기

git add * 
git stash
git pull

이렇게하면 모든 파일을 추적하고 해당 파일에 대한 모든 로컬 변경 사항을 제거한 다음 서버에서 파일을 가져옵니다.


59
git add -A .; git stash나를 위해 일했다. git add *변형은 무시 경로에 대해 불평했다.
imsky

11
git add., git stash, git pull을 시도했습니다. 효과가 있었지만 여전히 이유를 알지 못합니까?
ARK

1
나에게는 추적 된 원격 파일이 있었고 추적되지 않은 로컬 리포지토리에 동일한 이름의 파일이있었습니다. 따라서 로컬 파일을 추가하고 변경 사항을 숨기면 원격 파일이 로컬 파일을 겹쳐 써야합니다.
userFog

2
관심있는 사람이 있다면 어떻게 작동하는지 이해하는 좋은 링크가 있습니다. git-scm.com/book/ko/v1/Git-Tools-Stashing
James M. Lay

2
//, 이것은 실제로이 오류의 목적으로 너무 멀지는 않습니다.
Nathan Basanese

137

로컬에서 추적되지 않은 파일을 지우는 명령을 시도 할 수 있습니다

Git 2.11 이상 버전 :

git clean  -d  -f .

이전 버전의 Git :

git clean  -d  -f ""

어디 -d다음으로 대체 할 수있다 :

  • -x 무시 된 파일과 Git에 알려지지 않은 파일도 제거됩니다.

  • -d 추적되지 않은 파일 외에 추적되지 않은 디렉토리를 제거하십시오.

  • -f 강제로 실행해야합니다.

도움이 될만한 링크 는 다음과 같습니다 .


23
-i대화식 모드를 추가하겠습니다 . 뿐만 아니라 원치 않는 디렉토리를 삭제하는 등 나는 또한 단지 프로젝트 :-( 내 사용자 설정을 삭제
dumbledad

6
의견을 통해 상처를 입을 수 있는 것과 비슷한 대답 으로 스캔하는 것이 -x좋습니다.
dumbledad

10
그러나 이것은 매우 위험하며 실행 취소 할 수없는 작업입니다! 파일이 많이 손실 될 수 있습니다! 조심해!!
Mohamed Kawsara

16
이것은 Slim Framework의 모든 공급 업체 디렉토리를 삭제했습니다 . 이 명령으로 매우 조심하십시오
RousseauAlexandre

2
답에서 'x'를 제거해야합니다. 매우 위험합니다!
earl3s

107

나를 위해 일한 유일한 명령은 다음과 같습니다.

git fetch --all
git reset --hard origin/{{your branch name}}

5
하위 모듈을 제거하고 원래 리포지토리에서 라이브러리로 읽은 경우이 답변이 필요합니다. 나는 대답이 필요했고 이것이 효과가 있었다.
Routhinator

하위 모듈이 없었고 다른 답변에서 제안한대로 git clean 및 git stash를 시도했지만 이것 만 도움이되었습니다.
kslstn

다양한 하위 모듈을 지우고 나면 이것이 나에게도 효과가있는 유일한 것입니다. 특히, 파일에서 대소 문자 구분 문제가 발생했습니다. 전의. composer의 공급 업체 폴더에 XML.php to Xml.php.
KazaJhodo

1
그것은 나를 위해 일했다. 무슨 일인지 설명해 주시겠습니까? 나는 그것을 얻지 못한다.
Dimitris Karamanis

1
이로 인해 로컬 커밋이 두 개 삭제되었습니다. 사용하기 전에주의하십시오!
David Cian

27

이를 대체 git merge하면 추적되지 않은 파일을 덮어 씁니다.

아래 주석은 '관심 파일'에 'FOI'를 사용합니다.

  • 기부자 지점에 존재하고
  • 수신 지점에 존재하지 않는 경우
  • 작업 디렉토리에 존재하고 추적되지 않기 때문에 병합을 차단하고 있습니다.
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

이를 대체 git pull하면 추적되지 않은 파일을 덮어 씁니다.

pull = fetch + merge따라서 위 git fetchgit checkout -f, git checkout, git merge트릭을 따릅니다 .

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

상해

git merge -f존재하지 않지만 존재합니다 git checkout -f.

git checkout -f+ git checkout를 사용 하여 관심있는 파일을 제거하고 (위 참조) 병합이 정상적으로 진행될 수 있습니다.

1 단계. 이 단계는 추적되지 않은 FOI를 추적 된 버전의 도너 브랜치로 강제로 바꿉니다 (또한 도너 브랜치를 체크 아웃하고 나머지 작업 디렉토리를 업데이트합니다).

git checkout -f donor-branch

2 단계. 이 단계에서는 FOI가 현재 (공여) 지점에서 추적되고 receiving-branch스위치가 없기 때문에 FOI를 제거합니다 .

git checkout receiving-branch

3 단계. 이제 FOI가 없으므로 기증자 분기에서 병합해도 추적되지 않은 파일을 덮어 쓰지 않으므로 오류가 발생하지 않습니다.

git merge donor-branch

3
이것은 7 번째 또는 8 번째 답변이 되기에는 너무 깨끗합니다!
Majed DH

1
감사합니다, @MajedDH, 당신은 내 하루를 만들었습니다! <3
Esteis

1
이것은 바로 내가 찾던 불안정이었습니다! 감사합니다
AFM-Horizon

@ AFM-Horizon, 도와 주셔서 감사합니다!
Esteis

20

추적되지 않은 모든 파일을 제거하십시오.

git clean  -d  -fx .

8
프로젝트에서 사용 된 파일을 삭제하는 것은 실제 해결책이되어서는 안됩니다
Erdinç Çorbacı

4
yikes, IDE 파일도 정리 :(
kisna


15

그 명령을 시도해 볼 수 있습니다

git clean -df

5
추적되지 않은 디렉토리를 삭제하는 방법은 무엇입니까?
zhekaus

그것이 무엇을 설명 할 수 있습니까?
Safak Ozkan

12

업데이트-더 나은 버전

이 도구 ( https://github.com/mklepaczewski/git-clean-before-merge )는 다음을 수행합니다.

  • 해당 파일과 동일한 추적되지 않은 파일을 삭제합니다 git pull.
  • 수정 된 버전이 동일한 파일과 동일한 수정 된 파일로 변경 사항을 되돌리려면 git pull,
  • git pull버전 과 다른 수정 / 추적되지 않은 파일보고
  • 이 도구에는 --pretend파일을 수정하지 않는 옵션이 있습니다.

구 버전

이 답변이 다른 답변과 어떻게 다릅니 까?

여기에 제시된 방법은 병합으로 덮어 쓸 파일 만 제거합니다. 디렉토리에 추적되지 않은 (아마도 무시 된) 파일이 있으면이 방법으로 해당 파일을 제거하지 않습니다.

해결책

이 스 니펫은 덮어 쓰지 않은 모든 추적되지 않은 파일을 추출 git pull하여 삭제합니다.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

그리고 그냥하십시오 :

git pull

이것은 git porcelain 명령이 아니므로 항상 수행 할 작업을 다시 확인하십시오.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

설명-하나의 라이너가 무섭기 때문에 :

다음은 그 기능에 대한 분석입니다.

  1. git pull 2>&1- git pull출력을 캡처 하고 모두 stdout으로 리디렉션하여 쉽게 캡처 할 수 있습니다 grep.
  2. grep -E '^\s-의도는 덮어 쓰지 않은 추적되지 않은 파일 목록을 캡처하는 것 git pull입니다. 파일 이름 앞에 공백 문자가 많이 있으므로 파일 이름을 활용합니다.
  3. cut -f2- -2에서 캡처 한 각 줄의 시작 부분에서 공백을 제거하십시오.
  4. xargs -I {} rm -rf "{}"- xargs모든 파일을 반복하고 이름을 "{}"에 저장 한 후 각 파일을 호출 rm합니다. -rf추적되지 않은 디렉토리를 강제로 삭제하고 제거 하는 데 사용 합니다.

1-3 단계를 자기 명령으로 바꾸는 것이 좋지만, 이에 상응하는 것은 없습니다.


고맙습니다. 작업 디렉토리에 추적되지 않은 파일이 삭제되거나 커밋되지 않는 경우가 많습니다. 제 경우에는 다음으로 대체 git pull해야했습니다git checkout <branch_name>
mihow

6

-f플래그 사용을 고려하는 경우 먼저 플래그를 드라 이런으로 실행할 수 있습니다. 다음에 어떤 종류의 흥미로운 상황이 될지 미리 알 수 있습니다 .-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.

6

수락 된 답변 외에도 파일을 지정하여 더 이상 필요하지 않은 경우 파일을 제거 할 수 있습니다.

git clean -f '/path/to/file/'

git clean이 제거 할 파일을 보려면 먼저 -n 플래그를 사용하여 실행해야합니다. 이 파일들은 삭제됩니다. 제 경우에는 어쨌든 신경 쓰지 않았으므로 더 나은 해결책이었습니다.


5

이를 수행하는 한 가지 방법은 로컬 변경 사항을 숨기고 원격 저장소에서 가져 오는 것입니다. 이런 방식으로 파일이 숨김으로 이동하므로 로컬 파일을 잃지 않습니다.

git add -A
git stash
git pull

이 명령을 사용하여 로컬 숨김 파일을 확인할 수 있습니다. git stash list


4

모르는 사람들을 위해, git은 파일과 폴더의 대문자 / 소문자 이름 차이를 무시합니다. 이름을 다른 경우와 동일한 이름으로 바꾸면 악몽으로 판명됩니다.

폴더 이름을 "Petstore"에서 "petstore"(대문자)로 바꿀 때이 문제가 발생했습니다. .git / config 파일을 편집하여 대소 문자를 무시하지 않고 변경을 수행하고 커밋을 취소하고 변경 사항을 저장하여 다른 지점으로 이동했습니다. 이 변경 사항을 다른 지점에 적용 할 수 없습니다.

내가 찾은 수정은 .git / config 파일을 일시적으로 편집하여 대소 문자를 다시 무시하는 것이 었습니다. 이것은 git stash apply성공했다. 그런 다음 ignoreCase를 다시로 변경했습니다 false. 그런 다음 git이 이상하다고 주장 한 petstore 폴더의 새 파일을 제외한 모든 파일을 삭제했습니다. 변경 사항을 커밋 한 다음 git reset --hard HEAD추적되지 않은 새 파일을 제거하기 위해 실행 했습니다. 내 커밋이 예상대로 정확하게 나타납니다. 폴더의 파일 이름이 바뀌 었습니다.

이것이 나의 악몽을 피하는 데 도움이되기를 바랍니다.


나를 위해 작동하지 않았다. 폴더의 모든 파일을 삭제했습니다. 그런 git pull -f다음 git checkout .. 악몽이야
m.rufca

정말? 몇 주 전에 나에게 잘 작동했습니다. gitconfig 파일을 편집하여 대소 문자를 무시하고 시작 / 중지하려고 했습니까?
A. Davidson

감사합니다. 폴더 경로에서 케이싱을 수정 한 후 마스터에서 병합해야했습니다. git ignore case를 사용하여 병합 할 수 있었고 그 후에 대소 문자 구분을 다시 활성화했습니다.
Rubenisme

3

청소 / 리셋 / 하드 체크 아웃 / 리베이스가 저에게 효과적이지 않았습니다.

git 불평 한 파일을 방금 제거했습니다 *

rm /path/to/files/that/git/complained/about

*이 파일을 별도의 폴더에있는 새로운 저장소를 확인 하여이 파일을 제거 할 수 있는지 확인했습니다 (파일이 없습니다)


1

내 경우에는이 문제가 발생했습니다. 리모콘에서 이름을 바꾼 로컬 파일이 있습니다.

git pull힘내 려고 할 때 새로운 파일 이름은 추적되지 않았다. 파일 이름은 아직 로컬에 없지만 원격에 있습니다.

로컬로 인스턴스가 없었기 때문에 이전 파일 이름을 사용할 git pull때까지 할 수 없었 git rm습니다 (처음에는 이름을 바꾸는 어리석은 생각 때문에 분명하지 않았습니다).


0

.gitignore에 작성된 파일이 있으면 파일을 제거하고 git pull을 다시 실행하십시오. 그것은 나를 도왔다.


0

문제는 추적되지 않은 파일을 병합하는 수신 변경 사항이있을 때 git이 불평하는 것입니다. 이 명령이 도움이되었습니다.

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