자식 숨김-> 숨김 변경 사항을 현재 변경 사항과 병합


187

지점을 변경하고 해당 지점에 필요한 다른 변경 사항을 숨겼다는 사실을 깨달았습니다. 내가 원하는 것은 숨김 변경 사항을 현재 변경 내용과 병합하는 방법입니다.

이 방법이 있습니까?

편의상, 나는 결국 현재의 변경 사항을 포기하고 커밋 한 다음 내 변경 사항을 커밋했지만 한 번의 실패로 변경하는 것을 선호했을 것입니다.



joshua의 대답 은 받아 들여 져야합니다. 이 stackoverflow 게시물은이 질문에 대한 첫 번째 Google 링크이며 인터넷에 올바른 답변을 제공하십시오!
Jérôme

답변:


272

나는 당신의 커밋되지 않은 변경 사항이 인덱스에 추가하는 경우 (예를 사용하여, "무대"는 것을 발견 git add ...한 후,) git stash apply(, 아마, 그리고 git stash pop실제로 적절한 병합을 할 것입니다). 충돌이 없으면 황금색입니다. 그렇지 않은 경우 평소와 git mergetool같이 또는 편집기를 사용하여 수동으로 해결하십시오 .

분명히, 이것은 내가 말하고있는 과정입니다.

mkdir test-repo && cd test-repo && git init
echo test > test.txt
git add test.txt && git commit -m "Initial version"

# here's the interesting part:

# make a local change and stash it:
echo test2 > test.txt
git stash

# make a different local change:
echo test3 > test.txt

# try to apply the previous changes:
git stash apply
# git complains "Cannot apply to a dirty working tree, please stage your changes"

# add "test3" changes to the index, then re-try the stash:
git add test.txt
git stash apply
# git says: "Auto-merging test.txt"
# git says: "CONFLICT (content): Merge conflict in test.txt"

... 아마도 당신이 찾고있는 것입니다.


tl; dr

git add먼저 실행하십시오 .


8
그런 해킹이지만 작동하지만이 작업을 수행하는 유일한 방법 인 것 같습니다. 나는 git stash apply --force무언가 가 있었으면 좋겠다 .
Matt Kantor

13
사실, 그것은 해킹이 아닙니다. 인덱스의 변경 사항으로 쉽게 되돌릴 수 있기 때문에 원하는 것을 개선합니다.
hoffmanc

2
와우,이 행동은 실제로 git 의도입니까?
edi9999

9
나는 git이 의도 한 것이 없다고 생각한다. 내 직감은 이제 자식이 우연히 그렇게한다는 것입니다.
Profpatsch

5
이것은 완벽한 솔루션입니다. 난 그냥 한 git add ., git stash apply다음, git reset커밋을하지 않고도 내 작업 변경 및 병합에 숨김을 적용 할 수 있습니다.
Stephen Smith

70

실행 git stash pop중이거나 git stash apply본질적으로 병합입니다. 숨김에서 변경된 파일이 작업 사본에서도 변경되지 않는 한 현재 변경 사항을 커밋하지 않아도됩니다.이 경우이 오류 메시지가 표시됩니다.

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

이 경우 한 단계에서 현재 변경 사항에 숨김을 적용 할 수 없습니다. 커밋 git rebase을 정말로 원하지 않으면 변경 사항을 커밋하고, 스 태쉬를 적용하고, 커밋하고,이 두 커밋을 스쿼시 할 수 있지만, 이는 더 가치가있는 문제 일 수 있습니다.


1
그 메시지가 나타났습니다-변경 사항이 충돌하지 않지만 stashes / apply를 사용하여 동일한 파일을 공유합니까?
Bemis

1
죄송합니다. 그것이 "병합 병합"의 의미입니다. 오류 메시지는 매우 최종적이라고 생각합니다. 작업 복사본에서 변경된 파일도 숨김으로 변경되면 숨김을 적용 할 수 없습니다. 가능한 해결 방법으로 답변을 업데이트했습니다.
Brandan

3
나는 이것이 모든 경우에 답이라고 생각하지는 않을 것이다. 개발하는 동안 무언가를 테스트하기를 원했기 때문에 특정 파일에서 일련의 변경 사항 중 일부만 숨겼을 수 있습니다. 그리고 WIP이므로 현재 시점의 파일 내용을 커밋하지 않을 수도 있습니다. 그것은 은닉 변화가 현재 브랜치에 병합 할 수없는 자식을 가진 진짜 문제이다
토마스 왓슨

21
Joshua Warner의 답변은 올바른 것으로 표시되어야합니다. 숨김을 병합하려면 변경 사항을 준비하고, 숨김을 적용하고, 충돌을 처리 한 다음 원하는 경우 변경 사항을 스테이지 해제하십시오.
Vroo

4
"두 커밋을 원하지 않으면 git rebase를 사용하여 변경 사항을 커밋하고, 스 태쉬를 적용하고, 다시 커밋하고,이 두 커밋을 스쿼시 할 수 있습니다. 대신이의 당신은 할 수 : 변경 사항을 커밋 한 후 마리화나 등을 적용 git commit --amend.
gabe

27

내가 원하는 것은 숨김 변경 사항을 현재 변경 사항과 병합하는 방법입니다.

다른 옵션은 다음과 같습니다.

git stash show -p|git apply
git stash drop

git stash show -p마지막으로 저장된 숨김의 패치가 표시됩니다. git apply적용합니다. 병합이 완료되면를 사용하여 병합 된 숨김을 삭제할 수 있습니다 git stash drop.


1
이것에 감사드립니다 git stash pop. 병합이 깨끗하게 적용되는 경우에 왜 그렇게하지 않는지 모르겠습니다 .
Iguananaut

확장 버전 : git stash show -p --no-color | git apply --3way( --3way= 패치가 실패하면 3 방향 병합시 폴백).
DmitrySandalov

그러나 숨김 항목이 처음 만들어 졌을 때 숨김 컨텐츠와 커밋 사이git stash show -p 에 차이 만듭니다 . 따라서 이것은 작업 파일 변경 사항을 덮어 씁니다.
Paul F. Wood

덮어 쓰는 이유 충돌없이 할 수있는 경우에 생성 된 diff git stash show -p는에 의해 병합됩니다 git apply.
ks1322

1

내가 이것을하는 방법은 git add이것에 처음 git stash apply <stash code>이다. 가장 간단한 방법입니다.


4
이것이 어떻게 대답의 정확한 사본이 아닌가?
RomainValeri

0

@Brandan이 제안한 것처럼, 여기에 내가 돌아 다니기 위해해야했던 것이 있습니다.

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

이 과정을 따르십시오 :

git status  # local changes to `file`
git stash list  # further changes to `file` we want to merge
git commit -m "WIP" file
git stash pop
git commit -m "WIP2" file
git rebase -i HEAD^^  # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^
# mark the second commit to squash into the first using your EDITOR
git reset HEAD^

또한에 대한 완전히 통합 된 로컬 변경 사항 이 남아 있으므로 file추가 작업 / 정리를 수행하거나 단일 커밋을 수행 할 수 있습니다. 또는의 병합 된 내용 file이 올바르다는 것을 알고 있으면 피팅 메시지를 작성하고 건너 뛸 수 git reset HEAD^있습니다.


0

아마도 (difftool을 통해) ... 예 ... 지점에서 병합하는 것은 최악의 생각이 아닙니다!

> current_branch=$(git status | head -n1 | cut -d' ' -f3)
> stash_branch="$current_branch-stash-$(date +%yy%mm%dd-%Hh%M)"
> git stash branch $stash_branch
> git checkout $current_branch
> git difftool $stash_branch

0

당신은 쉽게 할 수 있습니다

  1. 현재 변경 사항을 커밋
  2. 숨겨 놓지 말고 갈등을 해결하십시오
  3. 숨김에서 변경 사항 커밋
  4. 커밋을위한 소프트 리셋 (마지막 올바른 커밋)

-1

또 다른 옵션은 커밋되지 않은 로컬 변경 사항에 대해 다른 "git stash"를 수행 한 다음 두 git stashe를 결합하는 것입니다. 불행히도 git은 두 개의 숨김을 쉽게 결합 할 수있는 방법이없는 것 같습니다. 따라서 하나의 옵션은 두 개의 .diff 파일을 작성하고 둘 다 적용하는 것입니다. 추가 커밋이 아니며 10 단계 프로세스가 필요하지 않습니다. |

방법 : https://stackoverflow.com/a/9658688/32453


하나의 diff를 적용하는 문제가 두 개의 diff를 적용하는 문제로 바뀝니다. 또한 허용되는 솔루션에는 커밋이 아니라 단계 만 포함되며 단일 명령 (git add)입니다. (나는 downvoter가 아닙니다.)
Eike

나에게는 적어도 더 간단하고 덜 부두적인 마술 같은 느낌이 든다.
rogerdpack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.