로컬 변경 사항을 버리지 않고 git switch branch


181

자, 언젠가 우리는 많은 수정을하게되었고, 우리가 그것들을 커밋 할 때 우리는 잘못된 브랜치에서 일하고 있음을 알 수 있습니다.

로컬 변경 사항을 버리지 않고 git이 분기를 전환하도록하려면 어떻게해야합니까 ?

나는 대답을 기다리는 동안 순진한 방식으로 이것에 대해 갈 것입니다. 그러나 이것이 전에 나에게 일어난 적이 없다고 말하면 거짓말하고있는 올바른 절차가 있는지 알고 싶습니다 ...

  • 백업 변경 저장소
  • git reset --hard
  • git checkout right-branch
  • 변경 사항 복원
  • git commit -m "changes"

답변:


342

당신이 얼마나 멀리 떨어져 있는지 그리고 당신이 원하는 지점에 따라 다양한 방법이 있습니다.

고전적인 실수를 봅시다 :

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

그래서 지금 당신은 당신이 아직 최선을 다하고하지 않은 이러한 변경이 원하는 master에로 develop.

  1. 당신이있는 경우 가없는develop아직 방법은 간단하다 :

    $ git checkout -b develop
    

    이것은 develop당신이 지금 어디에서 시작 하여 새로운 지점을 만듭니다 . 이제 커밋 할 수 있고 새로운 것들이 모두 켜져 develop있습니다.

  2. 당신 이 할develop. Git이 아무것도하지 않고 전환 할 수 있는지 확인하십시오.

    $ git checkout develop
    

    이것은 성공하거나 불평 할 것입니다. 성공하면 훌륭합니다! 커밋하십시오. 그렇지 않은 경우 ( error: Your local changes to the following files would be overwritten ...) 여전히 많은 옵션이 있습니다.

    가장 쉬운 방법 일 것입니다 git stash(클릭하는 것에 대해 다른 모든 응답자가 post말한 것처럼 ). git stash save또는 git stash push, 1 또는 /에 git stash대한 간단한 일반 을 실행하십시오 .savepush

    $ git stash
    

    이것은 이상한 non-branch-y 메소드를 사용하여 코드를 커밋합니다 (예, 실제로 커밋합니다). 커밋은 어떤 브랜치 "on"이 아니라 이제 리포지토리에 안전하게 저장되므로 이제 브랜치를 전환 한 다음 스 태쉬를 "적용"할 수 있습니다.

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    모든 것이 잘되고 결과가 마음에 git stash drop들면 숨겨야합니다. 이것은 이상한 non-branch-y commit에 대한 참조를 삭제합니다. (그들은 여전히 ​​저장소에 있으며 때로는 비상 사태에서 검색 할 수 있지만 대부분의 경우 해당 시점에 사라 졌다는 것을 고려해야합니다.)

apply단계는 Git의 강력한 기본 병합 기계를 사용하여 분기 병합을 수행 할 때 사용하는 것과 같은 종류의 숨김 변경 사항을 병합합니다. 이는 실수로 작업중인 지점이 작업하려는 지점과 충분히 다른 경우 "병합 병합"을 얻을 수 있음을 의미합니다. 따라서 Git 자체가 병합 충돌을 감지하지 않더라도 숨김이 깨끗하게 적용되었다고 가정하기 전에 결과를주의 깊게 검사 하는 것이 좋습니다 .

많은 사람들 git stash pop이의 약자를 사용 합니다 git stash apply && git stash drop. 괜찮아도 응용 프로그램이 엉망이 되어이 경로를 진행하지 않기로 결정하면 쉽게 숨길 수 없다는 것을 의미합니다. 그래서 만족할 경우에만 별도의 apply, 결과를 검사하는 것이 좋습니다 drop. (물론 이것은 또 다른 커피 브레이크를 취하고하고 있던 일을 잊고, 돌아와서 잘못된 일을 할 수있는 또 다른 요점을 소개 하므로 완벽한 치료법은 아닙니다.)


1save 에서이 git stash save새로운 은닉을 만들기위한 기존의 동사입니다. Git 버전 2.13은 새로운 동사를 도입하여 일을보다 일관성있게 pop만들고 작성 명령에 더 많은 옵션을 추가했습니다. Git 버전 2.16은 이전 동사를 공식적으로 더 이상 사용하지 않습니다 (여전히 편집 할 때 최신 릴리스 인 Git 2.23에서 작동하지만).


3
현재 브랜치를 커밋하지 않고 다른 브랜치로 전환하고 (예 : 변경이 완료되지 않은) 나중에 다시 전환하려면 어떻게해야합니까?
stt106

@ stt106을 : 당신은 여전히 커밋해야하지만 통해 당신은 이것과 다른 답변처럼, 그것을 할 수 git stash있도록 커밋-에 대한 그 git stash, 당신이 얻을 특이한에 숨겨 놓은 항목 당 커밋에 배열-있습니다 어떤 지점입니다. 매우 짧은 기간의 특별한 경우를 제외하고는 일반적으로 정상적인 커밋을 선호합니다. 해당 지점에서 다시 작업 할 때 나중에 git reset --soft또는 git reset --mixed나중에 git commit --amend따로 보관할 수 있습니다 . (현대 Git에서는 git worktree add더 나은 솔루션 일 수도 있습니다.)
torek

"이것은 성공하거나 불평 할 것이다." 결제시 성공 또는 오류의 원인은 무엇입니까?
nanocv


<a> 지점에있는 위의 단계로 전환 할 때 모든 로컬 변경 사항이 손실되고 변경 작업을 수행하고 <b> 지점으로 이동하여 모든 변경 사항을 푸시하려고합니다. 내가 git stash를하고 다른 지점으로 이동하면 <b> 지점의 모든 파일을 가져오고 로컬 변경 사항이 손실됩니다
Mukul Munjal

38

자식 숨김 사용

git stash

변경 사항을 스택으로 푸시합니다. 다시 사용하고 싶을 때

 git stash apply

개별 항목을 꺼낼 수도 있습니다. 은신처를 완전히 날려 버리려면 :

 git stash clear

7
마지막 명령은 아마 git stash drop; git stash clear이 명령 세트와 관련이없는 스 태쉬를 포함하여 전체 스 태쉬 스택을 제거합니다.
Leland

15
  • git stash 커밋되지 않은 변경 사항을 저장
  • git stash list 저장된 커밋되지 않은 스 태쉬를 나열
  • git stash apply stash@{x} 여기서 x는 0,1,2 ..가 될 수있는 스 태쉬 수 없습니다.

4

다음 중 하나를 수행 할 수 있습니다.

  • 사용 git stash또는 변경을 보류하는,

  • 다른 브랜치를 만들고 변경 사항을 커밋 한 다음 해당 브랜치를 작업 디렉토리에 병합하십시오.

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