자식 : 분기를 전환하고 커밋하지 않고 변경 사항을 무시하십시오.


318

git 브랜치에서 일하고 있었고 변경 사항을 커밋 할 준비가되었으므로 유용한 커밋 메시지로 커밋을했습니다. 그런 다음 유지해야 할 코드를 간결하게 변경했습니다. 나는 이제 가지를 바꾸고 싶지만 git은 나에게 준다.

오류 : "X"로 로컬 변경되었습니다. 분기를 전환 할 수 없습니다.

커밋하지 않고 지점을 변경할 수 있습니까? 그렇다면 어떻게 설정할 수 있습니까? 그렇지 않은 경우이 문제에서 어떻게 벗어날 수 있습니까? 커밋하지 않고 사소한 변경 사항을 무시하고 분기를 변경하고 싶습니다.


1
변경 사항이 커밋을 위해 준비되었지만 커밋되지 않은 경우에만 발생한다고 생각합니까? git checkout은 아직 git add 등을 사용하여 파일을 준비하지 않은 경우 분기를 변경하는 데 효과적입니다.
Jeremy Wall

1
안녕하세요 제레미, '무대'란 무슨 뜻입니까? 변경 분기 전에 사용자가 파일을 커밋하도록 강요하는 것은 훌륭한 워크 플로처럼 보이지 않습니다. 예를 들어, 마스터 리포지토리에 있고 지점에서 무언가를 빠르게 확인하려는 경우. 먼저 코드를 마스터에게 커밋해야합니다. 코드가 반으로 작성 되었더라도! 이 상황에서 실제로 지점을 체크 아웃 할 수 있어야한다고 말하고 있습니까?
Daniel Farrell

@boyfarrell 'Git stash'를 사용하여 커밋하지 않고 변경 사항을 임시로 저장할 수 있습니다.
Howiecamp 2016 년


1
이전 브랜치에서 변경 사항을 커밋하지 않고 브랜치로 전환하면 git은 변경 사항을 새 브랜치의 파일에 병합하려고 시도합니다. 충돌없이 병합을 수행하면 분기 분기가 성공하고 새 분기의 변경 사항을 볼 수 있습니다. 그러나 충돌이 발생하면 error: You have local changes to '<filename>'; cannot switch branches.지점이 변경되지 않습니다. 당신이 할 수있는 git checkout -m <branch-name>지점과 해결 충돌 자신을 갈등과 체크 아웃을 병합하거나 git checkout -f <branch-name>변경 사항을 무시 할 수 있습니다.
samad montazeri 2016 년

답변:


400

분기를 변경하려면 깨끗한 상태가 필요합니다. 지점 점검은 '더러운 파일'에 영향을 미치지 않는 경우에만 허용됩니다 ( 찰스 베일리 가 주석에 언급 한 바와 같이 ).

그렇지 않으면 다음 중 하나를 수행해야합니다.

  • 현재 변경 사항을 숨기 거나
  • reset --hard HEAD (그러한 사소한 변경 사항을 잃어 버리지 않는다면)
  • checkout -f 분기를 전환 할 때 색인 또는 작업 트리가 HEAD와 다른 경우에도 진행하십시오. 로컬 변경 사항을 버리는 데 사용됩니다.

또는 더 최근 :

색인 또는 작업 트리가 HEAD와 다른 경우에도 진행하십시오.
인덱스와 작업 트리가 모두 전환 대상과 일치하도록 복원됩니다.

이는 git switch -m <branch-name>현재 분기와 작업 트리 내용 및 새 분기 사이에 3 방향 병합을 트리거하는와 다릅니다 . 진행중인 작업을 풀지 않습니다.


34
"분기를 바꾸려면 깨끗한 상태가 필요합니다." 분기 변경이 '더러운 파일'에 영향을주는 경우에만 해당됩니다.
CB Bailey

10
숨김 방법의 경우 "git stash save", "git checkout otherbranch"를 입력 한 다음 마지막으로 "git stash pop"을 입력했습니다.
Venkat D.

1
현재이 오류 메시지가 표시되지 않고 "git status"를 수행하면 한 지점에서 변경 한 내용이 다른 지점에 표시됩니다. 뭔가 바뀌 었습니까?
Senthil A Kumar

2
감사. 체크 아웃 -f는 내가 필요한 것입니다. git reset --hard git clean -f git checkout mybranch -f
nologo

1
Git이 브랜치의 기본 정의를 위반하여 완전히 잘못한 것 중 하나는 다음과 같습니다. 자식 분기와 달리 저장소에서 완전히 다른 두 개의 작업 공간을 의미합니다.
nehem

125

변경 사항을 취소하려면

git checkout -- <file>
git checkout branch

변경 사항을 유지하려면

git stash save
git checkout branch
git stash pop

10
Romerun 말한다 실제로 무엇을 (완전 수) : git stash save(때 가지가 작업에) 다음 git checkout branchX뭔가 할 git add/commit -m등을 git checkout branchY하고 git stash pop숨김 돌아 가야
Highmastdon

2
아마 그렇습니다. 정답을 이해하고 있다면 답이 말하고 싶은 것을하고 싶은 상황이 있습니다. 즉, 숨김 변경, Y에서 X로 전환 한 다음 변경 사항을 팝업하여 X에 적용합니다.
Ben Klein

1
참고 git stash save지금의 찬성되지 않습니다git stash push
아르젠토

이 별칭 은 분기를 변경할 때 변경 사항을 유지하는 경우를 단순화합니다.
Tom Hale

62

글쎄, 그것은해야한다

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
예, 스태 쉬는 브랜치에 국한되지 않고 전역 적입니다. 브랜치를 전환 한 후에 팝을하면 다른 브랜치와 같은 스 태쉬를 얻게됩니다
Aditya Mittal

6
주목해야한다 git stash로 설정됩니다git stash save
찰리 - Greenman

고맙습니다, 그것은 저에게 매우 도움이됩니다
Govind Kumar


16

원격 브랜치를 병합했거나 로컬 커밋이 있고 원격 HEAD로 돌아가려면 다음을 수행해야합니다.

git reset --hard origin/HEAD

HEAD 단독으로 로컬 커밋 / 병합 만 참조합니다. 다시 설정을 변경하고 "저장소가 X 커밋을 앞두고 있습니다." .


9

분기를 전환 할 때 Git도 변경 해야하는 파일을 변경했다면 허용하지 않습니다. 작업 변경 사항을 삭제하려면 다음을 사용하십시오.

git reset --hard HEAD

그런 다음 분기를 전환 할 수 있습니다.


9

재설정 및 숨김 후에도 추적되지 않은 파일이 있었기 때문에 이러한 답변 중 어느 것도 도움이되지 않았습니다. 나는해야했다 :

git reset --hard HEAD
git clean -d -f

4

변경 사항을 잃어버린 새 지점으로 전환 :

git checkout -b YOUR_NEW_BRANCH_NAME --force

기존 브랜치로 전환하면 변경 사항이 손실됩니다.

git checkout YOUR_BRANCH --force

4

쉬운 답변 :

지점을 강제로 체크 아웃하는 것입니다

git checkout -f <branch_name>

분기를 강제로 체크 아웃하면 git에게 현재 분기에서 변경 한 모든 내용을 삭제하고 원하는 분기를 체크 아웃하도록 지시합니다.

또는 커밋을 체크 아웃하는 경우

git checkout -f <commit-hash>


"커밋하지 않고 분기를 변경할 수 있다고 생각했습니다. 그렇다면 어떻게 설정할 수 있습니까? 그렇지 않은 경우이 문제에서 어떻게 벗어날 수 있습니까?"

이에 대한 대답은 아니오 입니다. 문자 그대로 모든 변경 사항을 추적하고 각 노드 (즉, 커밋)는 최신 변경 사항을 최신 상태로 유지해야한다는 Git의 철학입니다. 물론 새로운 커밋을 만들었습니다.


변경 사항을 유지하기로 결정 했습니까?

그런 다음

git stash

원하는 브랜치에서 변경 사항을 해제하려면

git stash apply

변경 사항이 적용되지만 숨김 대기열에도 유지됩니다. 숨김 스택에 보관하지 않으려면 다음을 사용하여 팝하십시오.

git stash pop

그것은 apply다음과 같습니다drop


2

터미널을 닫고 프로젝트가있는 폴더를 삭제 한 다음 프로젝트를 다시 복제하고 구성하십시오.


2
git은 프로젝트를 삭제하고 다시 복제하도록 강요하지 않았습니다! 원산지에서 최신 버전을 얻으려면 그냥 reset --hard!
Ahmed Nour Jamal

2

변경 사항을 유지하고 단일 행 명령으로 분기를 변경하려는 경우

git stash && git checkout <branch_name> && git stash pop

1

커밋되지 않은 변경 사항을 새 지점으로 이동

이에 대한 .gitconfig별칭을 만들었습니다 .

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

로 변경하려면 다음을 new-branch-name사용하십시오.

git spcosp new-branch-name

커밋되지 않은 파일 및 인덱스 변경 사항은 유지됩니다.


1

git checkout -f your_branch_name

git checkout -f your_branch_name

변경 사항을 되 돌리는 데 문제가있는 경우 :

git checkout .

추적되지 않은 디렉토리 및 파일을 제거하려는 경우 :

git clean -fd

0

git stash가 작동하지 않을 때 변경 사항을 커밋하지 않고 다른 지점으로 전환합니다. 아래 명령을 사용할 수 있습니다 :

자식 체크 아웃 -f branch-name

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