체크인을 위해 변경된 파일을 다른 지점으로 이동


422

이것은 종종 나에게 발생합니다. 코드를 작성하고 변경 사항을 확인한 다음 해당 변경 사항을 확인하기 위해 적절한 지점에 있지 않다는 것을 알고 있습니다. 그러나 변경 사항을 되 돌리지 않으면 다른 지점으로 전환 할 수 없습니다. 체크인 할 다른 지점으로 변경 사항을 이동하는 방법이 있습니까?

답변:


751

git stash 당신의 친구입니다.

아직 커밋하지 않은 경우 실행하십시오 git stash. 변경 사항이 모두 저장됩니다.

변경하려는 지점으로 전환하고 실행 git stash pop합니다.

자식 숨김에 대한 많은 용도가 있습니다. 이것은 확실히 더 유용한 이유 중 하나입니다.

예를 들면 :

# work on some code
git stash
git checkout correct-branch
git stash pop

122
커밋되지 않은 변경 사항을 숨길 필요가 없으며 지점을 체크 아웃 할 때 함께 이동합니다. Stash는 임시 항목을 장기적으로 저장하는 데 유용합니다 (나중에 완료하고 나중에 커밋하려는 항목이지만 지금 다른 작업을 수행해야 함).
Tekkub

2
나는 이것을 얻는다. 그래서 나는 숨기고 가지를 바꾼 다음 팝해야합니다 C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
IsmailS

3
@Tekkub "임시 물건의 장기 저장"이라는 말이 매우 어색하다고 말하면, 숨김을 사용하는 또 다른 요점은 스택에서 푸시하므로 다른 방법으로 작업하고 싶지 않은 경우 유용합니다. . 그렇습니다. 그러나 더 깨끗하고 통제력이 있다고 느낄 수 있습니다.
Atherion

브라보 베이비! 커밋 한 경우해야 할 일을 추가해야합니다
Ishan Srivastava

2
@Tekkub 전환하려는 분기가 최신 분기 인 경우에만 해당됩니다. 예를 들어 실수로 prod 브랜치에서 작업 중이고 스테이지 브랜치로 전환해야하지만 그 동안 평균 숨김 상태에서 스테이지가 변경된 경우 스위치를 만드는 유일한 방법입니다.
danielson317

248

아직 변경 사항을 커밋하지 않은 경우git checkout 새로운 지점으로 이동 한 후 일반적으로 커밋 - 파일의 변경은 특정 지점에 연결되지 않습니다 당신이 커밋 될 때까지.

당신이 경우 이미 변경 사항을 최선을 다하고 있습니다 :

  1. 유형 git log이동하려는 커밋의 SHA를 하고 기억하십시오.
  2. 커밋을 이동하려는 지점을 확인하십시오.
  3. git cherry-pick SHA위에서 SHA를 대체하여 입력 하십시오.
  4. 원래 지점으로 다시 전환하십시오.
  5. git reset HEAD~1잘못된 분기 커밋 전에 다시 설정하는 데 사용하십시오 .

cherry-pick 주어진 커밋을 가져 와서 현재 체크 아웃 된 헤드에 적용하여 커밋을 새 브랜치에 복사 할 수 있습니다.


9
여기서 체리 따기를 필요조차 없습니다. git reset HEAD~N --soft다음 git checkout -b모든 이동 지금은 새로운 지점에 커밋되지 않은 코드를.
Aaron

19
파일 변경 사항은 커밋 할 때까지 특정 분기에 연결되지 않습니다. <-이것. 이것은 나를 위해 미스터리를 해결했습니다. 감사.
Tschallacka

8
분기를 전환하려고 할 때 다음 오류가 발생합니다. "다음 파일에 대한 로컬 변경 사항을 체크 아웃으로 덮어 씁니다." 따라서 다른 지점으로 이동하여 정상적으로 커밋 할 수없는 것 같습니다.
Mischa

3
@Mischa 다른 역사를 가진 두 가지 사이를 전환하면 작동하지 않습니다
watashiSHUN

1
@Aaron (커밋 후 시나리오의 경우)가 훨씬 좋습니다! 별도로 답변하십시오.
Jacktose

16

슬프게도 이것은 나에게도 정기적으로 발생하며 git stash이전에 실수를 알고 다른 방법으로 git commit사용 git cherry-pick하면 두 명령 모두 다른 답변에서 잘 설명됩니다.

다음에 대한 설명을 추가하고 싶습니다 git checkout targetBranch. 이 명령은 targetBranch의 현재 분기와 동일한 히스토리가있는 경우 작업 디렉토리 및 단계적 스냅 샷 만 보존합니다.

변경 사항을 아직 커밋하지 않은 경우 git checkout을 사용하여 새 분기 로 이동 한 다음 정상적으로 커밋하십시오.

황색의 진술이 거짓되지 않습니다 @ 당신이로 이동할 때, newBranch , git checkout -b newBranch새로운 포인터가 생성되고 동일한 현재 브랜치로 커밋에 그것을 가리키고 있습니다.
사실, 현재 지점과 같은 내역을 공유하는 다른 지점 (동일한 커밋 지점)이있는 경우 다음과 같이하여 "변경 사항을 이동"할 수 있습니다.git checkout targetBranch

그러나 일반적으로 다른 브랜치는 다른 히스토리를 의미하며, Git은 더러운 작업 디렉토리 또는 스테이징 영역으로 이러한 브랜치 사이를 전환 할 수 없습니다. 이 경우 git checkout -f targetBranch변경 사항 정리 (clean and throwaway) 또는 git stage+ git checkout targetBranch( 변경 사항 정리 및 저장 )를 수행 git checkout targetBranch할 수 있습니다. 단순히 실행 하면 오류가 발생합니다.

오류 : 다음 파일에 대한 로컬 변경 사항이 체크 아웃으로 겹쳐 써집니다. ... 분기를 전환하기 전에 변경 사항을 커밋하거나 숨기십시오. 중단


5

소프트 자식 재설정 최선을 다하고 변경 사항이 인덱스에 다시 넣어 것입니다. 다음으로 커밋하려는 지점을 체크 아웃하십시오. 그런 다음 새로운 커밋 메시지로 git commit 합니다.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

에서 자식 문서 :

git reset [<mode>] [<commit>]이 양식은에 따라 현재 분기 헤드를 재설정하고 색인 (트리의 재설정)과 작업 트리를 업데이트합니다. 생략하면 기본값은 --mixed입니다. 다음 중 하나 여야합니다.

--soft인덱스 파일이나 작업 트리를 전혀 만지지 마십시오 (그러나 모든 모드와 마찬가지로 헤드를로 재설정하십시오). 이것은 git status에 의해 변경된 모든 파일을 "Commit to commit"으로 남겨둔다.

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