마스터 브랜치로 변경할 때 오류 : 체크 아웃시 로컬 변경 사항을 덮어 씁니다.


128

이 질문은 유사하다 이 하나 , 그러나 더 구체적인.

두 개의 분기 ( stagingbeta) 가있는 프로젝트가 있습니다.

에서 개발 staging하고 master분기를 사용하여 버그를 수정합니다. 따라서 스테이징 작업 중 오류가 표시되면 master분기로 변경합니다 .

git checkout master

그리고 물건을하십시오 :

git add fileToAdd
git commit -m "bug fixed"

그런 다음 두 분기와 병합합니다.

git checkout staging
git merge master
git checkout beta
git merge beta

작업 트리에 다른 파일이 있는지는 중요하지 않습니다.

하지만 이제 분기 로 변경하려고 master하면 오류가 발생합니다 .

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

스테이징 영역에서 파일을 제거해야한다고 생각했습니다.

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

하지만 같은 오류가 발생합니다. 내가 할 경우 git status내가 얻을No changes to commit


4
시도해 보셨습니까 reset --hard? 정말로 변경 사항을 취소하려는 경우. 그렇지 않으면 숨김을 사용하십시오.
keltar

@keltar-아니요. 변경 사항을 버리고 싶지 않습니다. 그냥 나중에 커밋에 대한 작업 나무에 그들을 유지
마놀로

1
커밋되지 않은 변경 사항을 유지하면서 분기를 전환 할 수 있다고 생각하지 않지만 실제로는 내 분야가 아니라 쉽게 틀릴 수 있습니다. 시도 git add your-file하고 커밋하십시오.
keltar

@keltar-나는 이런 식으로 전에 일했습니다. 지금은 변경 사항을 적용하고 싶지 않습니다 staging.
Manolo

이전에 시도했을 때 충돌하는 파일이 변경되지 않았을 수 있습니다. 변경 사항이 있습니다. 나중에 복원하려면 어딘가에 저장해야합니다. 커밋 없이는 가능하지 않을 것입니다. 그러나 정말로 원하지 않는 경우-숨김을 사용하는 것이 정확히 존재하는 이유입니다.
keltar

답변:


128

파일을 수정하고 전환하려는 분기에도이 파일에 대한 변경 사항이있을 때 오류가 나타납니다 (최근 병합 지점에서).

내가보기에 당신의 옵션은-커밋 한 다음 추가 변경 사항으로이 커밋을 수정하는 것입니다 ( pushed 가 아닌 한 git에서 커밋을 수정할 수 있습니다 ). 또는-숨김 사용 :

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash save변경 사항을 포함하는 숨김을 생성하지만 커밋이나 분기와 관련이 없습니다. git stash pop최신 숨김 항목을 현재 분기에 적용하여 저장된 변경 사항을 복원하고 숨김에서 제거합니다.


3
감사합니다. 이 작업이 내 작업 트리 (추가 된 파일이 아님)를 변경하지 않겠습니까? 내 변경 사항을 잃고 싶지 않습니다 :-/
Manolo

죄송합니다 . add실제로 save.. 업데이트 되었을 때 잘못 입력 되었습니다. 다른 파일에 대해서요? git stash save파일 이름 매개 변수없이 원하는 경우 수정 된 모든 파일을 저장합니다 (최신 커밋 상태로 되돌림). 그리고 디렉토리 트리의 추가 사본을 갖는 것은 결코 아프지 않지만 항상 그것에 대해 편집증 적입니다.
keltar 2014 년

master지점 에 추가하려는 파일을 제외한 모든 수정 된 파일을 저장합니다 . 또한 옵션은 pop다른 지점의 변경 사항입니까?
Manolo

무슨 말인지 잘 모르겠습니다. 예, 다른 브랜치에 숨김을 적용 할 수 있지만 파일 내용을 병합하는 것이 아니라 단순히 대체합니다.
keltar

1
@Honey는 분기와 관련이 없으며 문제는 커밋되지 않은 변경입니다. 체크 아웃은 정의에 따라 파일을의 상태로 재설정해야 master하지만 이렇게하면 현재 내용이 손실되며이 내용이 커밋되지 않았으므로 나중에이 상태로 돌아갈 수 없으므로 오류가 발생합니다. 나중에 손실 된 변경 사항에 대해 화를 내지 않을 것입니다.
keltar

151

같은 문제가 발생하여 해결했습니다.

git checkout -f branch

그리고 그 사양은 다소 명확합니다.

-f, --force

분기 전환시 인덱스 또는 작업 트리가 HEAD와 다른 경우에도 진행하십시오. 이것은 로컬 변경 사항 을 버리는 데 사용 됩니다.

색인에서 경로를 체크 아웃 할 때 병합 해제 된 항목에 대해 실패하지 마십시오. 대신 병합되지 않은 항목은 무시됩니다.


7
내 자식이 끼었을 때 (로컬 변경 사항은 없지만 여전히 오류)이 솔루션이 도움이되었습니다!
lukyer

6
고마워요, 당신은 그것을 통해 주먹을 얻지 못하도록 내 화면을 구했습니다.
Owl

3
내 변경 그런 식으로 손실
제이 섹 Dziurdzikowski을

1
예, 이렇게하면 변경 사항을 잃게됩니다.이 경우에는 큰주의가 필요합니다.
Alexander Mills

나는 그것을 반대쪽으로 원한다. master가 내 브랜치 뒤에 있고 master와 최신 상태이지만 여전히 브랜치를 전환 할 수 없습니다. git 버그 여야합니다.
jgmjgm

12

로컬 변경 사항을 커밋하지 않으려면 브랜치를 강제로 체크 아웃 할 수 있습니다.

git checkout -f branch_name

1
sudo단지 파일 사용 권한을 깰 수있을 필요하지 않습니다. 1 년 전에 @kiki_yu가 게시 한 것과 동일한 git 명령 이지만 더 나쁩니다.
kenorb

2
내 변경 그런 식으로 손실
제이 섹 Dziurdzikowski을

2
@JacekDziurdzikowski 그래서 당신은 변경 사항을 두 번 잃었습니다 (kiki_yu의 답변에 대한 주석 참조), 둘 다 로컬 변경 사항을 버리는 것이 목적 이라고 매우 명시 적으로 언급 한 솔루션을 적용하여 . 내 비꼬는 탐지기가 고장 났나요 아니면 ... 당신이 진심인가요?
RomainValeri

@RomainValeri 흠, 나는 그것이 git (이 게시물을 읽으면 초보자가되어야 함)을 시작하는 다른 사람들에게 그들이 만든 변경 사항에 작별 인사를 할 준비가되어 있다고 경고하는 내 방식이었습니다. 한 지점에서 변경된 시간은 다시 체크 아웃 할 때까지 해당 지점에 남아 있어야한다고 생각했습니다. 너무 그렇게 생각 이민자에 힌트 : 사용 자식 숨겨 놓은 :)
제이 섹 Dziurdzikowski

이유없이 중복 된 답변입니다. 첫 번째 답변에는 더 많은 정보가 있습니다.
MAChitgarha

9

같은 문제가 발생하여 해결했습니다.

git checkout -f 브랜치

글쎄, -f스위치 조심해 . -f스위치 를 사용하면 커밋되지 않은 변경 사항이 손실됩니다 . 를 사용하는 것이 도움이되는 사용 사례가있을 수 있지만 -f대부분의 경우 stash변경 한 다음 switch분기를 원할 수 있습니다 . stashing절차는 위에서 설명한다.


0

현재 브랜치에서 커밋하고 다른 브랜치로 체크 아웃 한 다음 마지막으로 해당 커밋을 선택합니다 (병합 대신).


이것에 대해 더 많은 설명을하면 더 도움이 될 수 있습니다.
MAChitgarha

-1

다른 지점을 확인하려고 할 때이 메시지가 표시되는 경우 :

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

즉, 체크 아웃 한 브랜치에 커밋해야하는 일부 변경 사항이 있거나 위의 대부분의 포인트에 따라 지우거나 숨겨야합니다. 20 번 중 19 번은 변경 사항을 커밋 할 가능성이 훨씬 더 높습니다.

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

이제 완료 했으므로 다른 브랜치를 확인하고 앞뒤로 쉽게 전환 할 수 있습니다.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

git push origin $ {branch} 명령을 실행할 때 올바른 브랜치에 있고 올바른 브랜치로 푸시하고 있는지 확인하세요. 참고 : 프로젝트를 Intellij에 직접 연결 한 경우 기본 창의 오른쪽 하단에서 분기를 변경 한 것을 확인할 수 있습니다.

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