git - 커밋 - 소스 트리 체크 아웃




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

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

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

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

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

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

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


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

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

나는 이것이 올바른 방법이라고 생각한다.

git fetch --all

그런 다음 두 가지 옵션이 있습니다.

git reset --hard origin/master

또는 다른 지점에 계시다면 :

git reset --hard origin/<branch_name>

설명:

git fetch 는 무엇이든 병합하거나 리베이스하지 않고 원격에서 최신 버전을 다운로드합니다.

그러면 git reset 은 방금 가져온 것에 master 브랜치를 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 pull --rebase

위의 명령은 많은 시간을 절약 한 나의 힘내 삶에서 가장 유용한 명령이다.

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

"git pull --rebase"는 무엇을합니까? .


그냥 해

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

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


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

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

  • 원격 브랜치에없는 로컬 커밋도 삭제해야합니다. 이걸 달성하는 가장 쉬운 방법은 다음과 같습니다. git reset --hard origin/master (작업중인 모든 브랜치로 'master'를 대체하고 git fetch origin 먼저 실행하십시오)


나는 똑같은 문제가 있었는데 어떤 이유에서라도 git clean -f -d 는 그것을하지 않을 것이다. 이유는 다음과 같습니다. 웬일인지 .gitignore 항목을 통해 파일을 무시한 경우 나중에 가져 오기를 사용 하여이 파일을 덮어 씁니다.하지만 -x 를 추가하지 않으면 파일이 제거되지 않습니다. .


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

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

  1. 모든 파일 삭제. .git 디렉토리 만 남겨주세요.
  2. git reset --hard HEAD
  3. git pull
  4. git push

이제 작동합니다.


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

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"브랜치를 수정 한 후 다음과 같이 master에 다시 병합하십시오 :

git checkout master && git merge tmp

다음 시간 동안은 숨겨진 저장소를 살펴봄으로써 은밀한 방법으로 이것을 처리 할 수 ​​있습니다. 숨김이 처음 몇 번의 시도에서 문제를 일으키기 쉽기 때문에 중요하지 않은 프로젝트에 대한 첫 번째 실험을 수행하십시오 ...


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

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

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

git reset --hard HEAD~5

그러면 커밋 5 회를 수행 한 다음

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 fetch --all
git reset --hard origin/master

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

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

원점 / 마스터 지점으로 재설정하려는 경우 모든 리모트 및 브랜치를 가져올 필요가 없습니다.


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

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

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


우선, 표준 방식으로 시도해보십시오.

git reset HEAD --hard # Remove all not committed changes

위의 방법으로도 도움이되지 않고 추적되지 않은 파일 / 디렉토리에 신경 쓰지 않는다면 다음과 같은 간단한 단계를 수행하십시오.

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

이렇게하면 모든 자식 파일 (exitmpt .git/ dir, 모든 커밋이있는 곳)이 제거되고 다시 당겨집니다.

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

  1. .gitattributes file 맞춤 규칙

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

    그렇다면 git status 에서 검토하여 CRLF / LF 변경 사항을 커밋하거나 git config core.autcrlf false 를 시도하여 임시로 무시하십시오.

  2. 파일 시스템 비 호환성

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

    알다시피, 파일 시스템에는 두 가지 종류가 있습니다. 따라서 Unix 사용 권한을 기본적으로 지원하지 않는 시스템은 기본적으로 그런 종류의 사용 권한을 지원하지 않는 시스템에서 파일 사용 권한을 재설정 할 수 없으므로, 시도, 자식은 항상 일부 "변경"을 감지합니다.


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


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

git checkout <your-branch> -f

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

git clean -f

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

git clean -fd

이 시도:

git reset --hard HEAD
git pull

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


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

git reset origin/master

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


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

git rm [file]

그렇다면 나는 괜찮아.


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

git fetch --all

뒤에 :

git reset --hard origin/master .







git-fetch