커밋되지 않은 로컬 변경 사항을 다른 Git 브랜치에 어떻게 병합합니까?


621

힘내에서 다음을 어떻게 할 수 있습니까?

현재 지점은 branch1이며 로컬로 변경했습니다. 그러나 이제는 실제로 이러한 변경 사항을 branch2에 적용하려고한다는 것을 알고 있습니다. 이러한 변경 사항을 branch1에서 커밋하지 않고 branch2에서 로컬 변경 사항이되도록 적용 / 병합하는 방법이 있습니까?


2
여기 에 훌륭한 Git Tutorial이 있습니다 . 스택 오버플로에 대한 모든 자식 질문의 중심입니다.
Decio Lira

답변:


897

파일이 아직 커밋되지 않았기 때문에 branch1:

git stash
git checkout branch2
git stash pop

또는

git stash
git checkout branch2
git stash list       # to check the various stash made in different branch
git stash apply x    # to select the right one

주석으로 하여 benjohn (참조 git stash매뉴얼 페이지 )

현재 추적되지 않은 (새로 추가 된) 파일을 숨기려면 인수를 추가하십시오 -u.

git stash -u

2
아니에요. 에서 마리화나 사용에 더 많은 예제 unethicalblogger.com/posts/2008/11/... .
VonC

2
동일한 문제에 대한 솔루션을 찾고 있지만 TFS와 동일한 솔루션을 사용하는 경우 변경 사항을 보류 한 다음 TFS Power Tools를 사용하여 / migrate 스위치를 사용하여 올바른 분기에 선반을 해제합니다.
xr280xr

1
이것은 나를 위해 일했습니다. 그러나 '스 태쉬 팝'이 작동하도록 로컬 브랜치를 만들어야했습니다. 밖으로 체크 아웃 stackoverflow.com/questions/1783405/git-checkout-remote-branch은 비슷한 당신에게 무슨 일이 일어나고합니다.
mimoralea

21
또한 현재의 비 추적 (새로 추가) 파일을 숨기고하려면 인수를 추가, -u그래서 : git stash -u.
Benjohn

2
@Benjohn 좋은 지적입니다. 더 많은 가시성을 제공하기 위해 귀하의 의견을 답변에 포함 시켰습니다.
VonC

84

스 태싱, 임시 커밋 및 리베이스는 모두 과도 할 수 있습니다. 변경된 파일을 색인에 아직 추가하지 않은 경우 다른 분기를 체크 아웃 할 수 있습니다.

git checkout branch2

편집하는 파일이 branch1과 branch2간에 다르지 않는 한 작동합니다. 작업 변경 사항이 보존 된 상태에서 branch2로 이동합니다. 서로 다른 경우에는 로컬 변경 사항 -m을 체크 아웃 옵션으로 분기를 전환하여 도입 된 변경 사항과 병합하도록 지정할 수 있습니다 .

git checkout -m branch2

색인에 변경 사항을 추가 한 경우 먼저 재설정하여 이러한 변경 사항을 실행 취소해야합니다. 이렇게하면 작업 복사본이 보존되고 단계적 변경 사항 만 제거됩니다.

git reset

3
나는 숨겨둔 "간단한"것을 어떻게 든 이해한다고 생각했지만 다른 지점의 작업 디렉토리를 고려하는 것이 좋습니다. +1
VonC

6
평범한 전통적인 체크 아웃이 문제에 더 적절 해 보였습니다. 체크 아웃은 가볍고 변경 해야하는 파일을 업데이트합니다. 아마도 숨김 접근 방식을 이해하는 것이 더 쉬울 수도 있고,이 사용 사례에서 체크 아웃이 '안전'하다는 것이 확실하지 않을 수도 있습니다.
CB 베일리

경우 checkout -m어떤 상황 (어쩌면 병합 충돌을 야기)의 "안전"아니다, (예를 들어, 당신이 숨겨 놓은 팝업을 unpop 수 있습니다) 어떤 이점을 제공 숨길 것인가?
Craig McQueen

1
@craigMcQueen 튀어 나온 숨김을 표시 해제 할 수는 없지만 숨겨 놓으면 숨김에 대해 불만이 표시됩니다. 충돌을 수정 한 다음 커밋 할 수 있지만이 경우 원래 숨김은 여전히 ​​스택에 있습니다! :)
Shaun F

병합 충돌이 발생하면 파일이 .orig? 로 백업되지 않습니까?
jocull

13

앞에서 언급 한 숨김 방법에 대한보다 짧은 대안은 다음과 같습니다.

변경 사항을 임시로 임시로 이동하십시오.

  1. git stash

새 브랜치를 작성하고 새 분기로 전환 한 다음 한 단계만으로 스 태쉬를 팝하십시오.

  1. git stash branch new_branch_name

그럼 그냥 add하고 commit새로운 브랜치로 변경됩니다.


10

경고 : 자식 초보자에게는 해당되지 않습니다.

이것은 거의 새로운 git 명령을 작성하려고 시도한 워크 플로우에서 충분히 나타납니다. 일반적인 git stash흐름은가는 방법 이지만 조금 어색합니다. 나는 보통 이후 새로운 먼저 커밋 수 있도록 , 모든 정보가 내 마음에 신선한 나는 변화에서 찾고있는 경우 그것은 단지 시작에 더 나은 git commit내가 작업하는 동안 발견 것을 마스터에 속하는 (일반적으로 버그 수정을 발견 한 것은 -ing 기능 지점) 즉시.

이와 같은 상황에 처한 경우 항상 현재 작업중인 디렉토리 와 함께 다른 작업 디렉토리 를 가지면 도움이 master됩니다.

그래서 이것을 달성하는 방법은 다음과 같습니다.

  1. git commit 좋은 커밋 메시지와 함께 즉시 변경 사항.
  2. git reset HEAD~1 현재 브랜치에서 커밋을 취소합니다.
  3. (선택 사항) 기능에 대한 작업을 계속합니다.

때로는 나중에 (비동기 적으로) 또는 다른 터미널 창에서 즉시 :

  1. cd my-project-master 동일한 WD를 공유하는 또 다른 WD입니다 .git
  2. git reflog 방금 만든 버그 수정을 찾을 수 있습니다.
  3. git cherry-pick SHA1 커밋의.

선택적으로 (아직 비동기식) 기능 분기를 리베이스 (또는 병합)하여 일반적으로 PR을 제출하려고하고 기능 분기 및 WD를 이미 정리할 때 버그 수정을 얻을 수 있습니다.

  1. cd my-project 내가 작업중인 주요 WD입니다.
  2. git rebase master 버그 수정.

이렇게하면 중단없이 기능에 대한 작업을 계속할 수 있으며 git stash전에 아무것도하지 않거나 WD를 정리 해야 할 필요가 없으며 git checkout(그리고 기능 분기를 다시 확인해야 함) 여전히 모든 버그 수정이 master대신 수행됩니다. 기능 지점에 숨겨져 있습니다.

IMO git stashgit checkout일부 큰 특징 작업의 중간에있을 때 진정한 PIA이다.


내 대답에 대한 흥미롭고 유효한 대안. +1
VonC

수은에서오고 있습니까? my-project-master같은 공유 .git그것 같은 소리 차종을. 왜 git checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard, 나중에 (비동기)에있는 동안 master, git cherry-pick <SHA1 of the commit(s) in bugfixABC? (또는 심지어 git rebase --onto master feature bugfixABC현재있는 지점에서 SHA1을 찾지 않아도됩니다 . 즉, git reset위에있는 직후에 할 수 있습니다 feature.)
Gauthier

그러나 OP는 변경 사항을 커밋 할 준비가되지 않은 것처럼 들립니다 checkout -m. 이 경우 더 좋습니다.
Gauthier

2

커밋 된 변경에 관한 것이면 git-rebase를 살펴 봐야하지만 VonC의 의견에서 지적했듯이 로컬 변경에 대해 이야기 할 때 git-stash가 확실히 좋은 방법입니다.


이 솔루션을 이해하지 못합니다 : branch1에서 branch2의 커밋 히스토리를 다시 작성합니다 ... branch2에서 branch1의 커밋되지 않은 로컬 변경 사항 만 가져 오려고 할 때 branch2의 branch1에서 커밋 된 변경 사항을 모두 가져 오는 이유는 무엇입니까? ...
VonC

@VonC :이 경우 리베이스는 브랜치 사이의 마지막 병합 이후 branch1로 커밋 된 모든 변경 사항을 가져옵니다. 처음에는이 질문의 "약정되지 않은"매개 변수를 얻지 못했습니다. rebase는 좋은 대답이 아닙니다.
claf

@claferri : pfew ... 나는 두통이 생기기 시작했다;) 나는 당신의 답을 공언했을 것이지만, 내가 스스로 발표 한 이후로 "명확한 이해의 상충"이 있었다. 귀하의 업데이트 된 게시물을 통해 지금은 전혀 공감할 필요가 없습니다. 감사합니다 :)
VonC

@VonC : 다음에 내 대답이 이것만큼 잘못되면 투표를 중단하십시오.)
claf

1

지금까지 제공된 답변은 병합 충돌을 해결하는 많은 불필요한 작업이 필요하거나 종종 잘못된 가정을 너무 많이하기 때문에 이상적이지 않습니다. 이것이 완벽하게 수행하는 방법입니다. 내 사이트로 연결되는 링크입니다.

자식의 다른 지점에 커밋하는 방법

의 모든 변경 사항을 커밋하지 않고 커밋 my_branch하려는 커밋되지 않은 변경 master사항이 있습니다 my_branch.

git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop

설명

master어쨌든 결국에는 지점 을 병합 해야합니다. 이제는 충돌을 해결하기 가장 좋은시기입니다.

-u옵션 (일명 --include-untracked에서) git stash -u나중에 수행 할 때 비 추적 파일을 잃고에서 방지 당신이 git clean -f -dmaster.

git checkout master당신이하지 않는 것이 중요하다 git stash pop나중에이 숨겨 놓은 필요하므로. 에서 만든 숨겨 놓은 팝업 경우 my_branch다음을 수행 git stash에서 master, 당신은 당신이 나중에에 그 은닉을 적용 불필요한 병합 충돌을 일으킬 것입니다 my_branch.

git reset의 결과로 모든 단계를 해제 git stash apply합니다. 예를 들어, 숨김 파일에서 수정되었지만 존재하지 않는 파일 master은 "삭제 된 파일"충돌로 준비됩니다.

git checkout .그리고 git clean -f -d최선을 다하고되지 버린 모든 : 추적 파일에 대한 모든 변경 및 모든 비 추적 파일과 디렉토리. 그것들은 이미 숨김 상태에 저장되어 있으며로 남아 master있으면로 전환 할 때 불필요한 병합 충돌이 발생할 수 있습니다 my_branch.

마지막 git stash pop은 원본을 기반으로 my_branch하므로 병합 충돌이 발생하지 않습니다. 그러나 stash에 마스터하려는 커밋되지 않은 파일이 포함되어 있으면 git은 "스 태쉬에서 추적되지 않은 파일을 복원 할 수 없습니다"라고 불평합니다. 이 충돌을 해결하려면 작업 트리, 다음에서 해당 파일을 삭제 git stash pop, git add .하고 git reset.


2
귀하의 답변은 웹 사이트에 연결되어있어 삭제되지 않았습니다 . 다른 계정의 다른 답변 과 동일하므로 삭제되었습니다 . 다른 계정 과 귀하의 프로필이 동일한 것으로 나타났습니다 . 두 개의 계정을 사용하고 있습니까? 두 계정을 병합 할 수 있습니다. 또한 상황을 설명하기 위해 mod에 플래그를 지정하면 원래 답변을 upvote와 함께 삭제하지 않고 얻을 수 있습니다.

1
당신은 그들이 합병하는 경우이를 별도로 보관 할 수는 없지만 되는 만큼 당신이 부정 투표 저지를 사용하지 않는 한, 여러 계정을 가질 수 (또는 일반적으로 상호 작용 서로를 가지고). 상황을 모드로 설명하십시오. 또한 삭제는 정직한 실수였습니다. 다른 사람이 두 개의 다른 계정을 사용하고 있다고 어떻게 말할 수 있습니까?

3
게시물 에 플래그를 지정 하고 기타 옵션을 사용하여 모드의주의를 끌면 삭제 된 답변을 편집 할 때주의를 기울이지 않습니다. 나는 이미주의를 기울 이도록 게시물에 플래그를 지정했지만 꽤 바쁘므로 인내심을 가지면 결국 당신에게 다가 갈 것입니다.

1
특히 다른 계정에서 중복 콘텐츠를 게시하지 마십시오. 두 개의 질문이 동일한 경우 투표로 투표하거나 중복으로 종료하십시오.
Bill the Lizard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.