[git] Git에서 숨김 팝 중단

나는 숨어 있었고 병합 충돌이 발생했습니다. 중복으로 나열된 질문과 달리, 내가 유지하려는 디렉토리에 커밋되지 않은 변경 사항이 이미 있습니다. 병합 충돌을 사라지게하고 싶지 않고 팝 이전의 상태로 디렉토리를 다시 가져오고 싶습니다.

나는 시도 git merge --abort했지만 git은 병합이 진행 중이 아니라고 주장했다. 원래 디렉토리에서 변경 한 내용을 없애지 않고 팝을 중단하는 쉬운 방법이 있습니까?



답변

좋아, 나는 “git stash unapply”를 해결했다고 생각한다. 에 git apply --reverse의해 병합이 수행 된 경우 역 병합 작업이 필요하기 때문에 보다 복잡 합니다 git stash apply.

리버스 병합에서는 모든 현재 변경 사항을 인덱스로 푸시해야합니다.

  • git add -u

그런 다음에 merge-recursive의해 수행 된 것을 뒤집습니다 git stash apply.

  • git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1

이제 비스 태쉬 변경 사항 만 남게됩니다. 그들은 색인에있을 것입니다. 원하는 git reset경우 변경 사항을 스테이지 해제 하는 데 사용할 수 있습니다 .

원래의 git stash apply실패를 감안할 때 취소하려는 일부 작업이 완료되지 않았기 때문에 리버스도 실패 할 수 있다고 가정합니다.

다음은 작업 사본 (을 통해 git status)이 다시 정리 되는 방법을 보여주는 예입니다 .

 $ git status
# On branch trunk
nothing to commit (working directory clean)
 $ git stash apply
Auto-merging foo.c
# On branch trunk
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo.c
#
no changes added to commit (use "git add" and/or "git commit -a")
 $ git add -u
 $ git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Auto-merging foo.c
 $ git status
# On branch trunk
nothing to commit (working directory clean)


답변

내 유스 케이스 : 잘못된 브랜치에 팝업을 시도하고 충돌이 발생했습니다. 필요한 것은 팝을 취소하지만 스 태시 목록에 유지하여 올바른 브랜치에서 팝 아웃하는 것입니다. 나는 이걸했다:

git reset HEAD --hard
git checkout my_correct_branch
git stash pop

쉬운.


답변

편집 : git help stash팝 섹션 의 문서에서 :

상태를 적용하면 충돌로 실패 할 수 있습니다. 이 경우 숨김 목록에서 제거되지 않습니다. 수동으로 충돌을 해결하고 git stash drop을 수동으로 호출하십시오.

–index 옵션을 사용하면 작업 트리의 변경 사항뿐만 아니라 인덱스의 변경 사항도 복원하려고합니다. 그러나 충돌이있는 경우 (색인에 저장되어 원래 변경 사항을 더 이상 적용 할 수없는 경우) 실패 할 수 있습니다.

모든 저장소를 새 디렉토리에 하드 카피하여 사본을 작성하십시오.

git stash show 관심이 있다면 출력을 어딘가에 저장하십시오.

그런 다음 git stash drop충돌하는 숨김을 삭제하려면 다음을 수행하십시오.git reset HEAD

리포지토리를 이전 상태로 유지해야합니다 (아직도 여전히 문제를 재현 할 수 없었습니다)

===

문제를 재현하려고하지만 사용시 얻을 수있는 git stash pop것은 다음과 같습니다.

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

깨끗한 디렉토리에서 :

git init
echo hello world > a
git add a & git commit -m "a"
echo hallo welt >> a
echo hello world > b
git add b & git commit -m "b"
echo hallo welt >> b
git stash
echo hola mundo >> a
git stash pop

자식이 변경 사항을 병합하려고 시도하지 않고 실패합니다. 도움을주기 위해 수행 할 수있는 재현 단계가 있습니까?


답변

나는 항상 사용했다

git reset --merge

나는 그것이 실패한 것을 기억할 수 없다.


답변

다른 변경 사항에 대해 걱정할 필요가없고 마지막 커밋으로 돌아가고 싶다면 다음을 수행하십시오.

git reset .
git checkout .
git clean -f


답변

좋아, 나는 당신이 필요한 곳으로 돌아갈 수있는 워크 플로우를 찾았다 고 생각합니다 (팝을하지 않은 것처럼).

미리 백업하십시오! 이것이 당신에게 효과가 있는지 모르겠습니다. 그래도 효과가 없을 경우를 대비하여 전체 저장소를 복사하십시오.

1) 패치에서 발생하는 모든 변경 사항을 선택하여 병합 문제를 해결하고 모든 충돌을 수정하십시오 (rtotsemerge에서 이것은 하나의 REMOETE (그들의)로 나타납니다).

git mergetool

2) 이러한 변경 사항을 적용하십시오 (이미 mergetool 명령을 통해 이미 추가됨). “병합”이라는 메시지 나 기억하는 것을 제공하십시오.

git commit -m "merge"

3) 이제 패치에서 새로운 커밋을 사용하여 원래 시작한 로컬 단계적 변경 사항이 계속 유지됩니다 (나중에 제거 할 수 있음). 이제 준비되지 않은 변경 사항을 커밋하십시오.

git add .
git add -u .
git commit -m "local changes"

4) 패치를 뒤집습니다. 다음 명령으로 수행 할 수 있습니다.

git stash show -p | git apply -R

5) 다음 변경 사항을 적용하십시오.

git commit -a -m "reversed patch"

6) 패치 / 언 패치 커밋 제거

git rebase -i HEAD^^^

여기에서 ‘병합’과 ‘역전 된 패치’가있는 두 줄을 제거하십시오.

7) 변경되지 않은 변경 사항을 되돌리고 ‘로컬 변경 사항’커밋 실행 취소

git reset HEAD^

간단한 예제를 통해 살펴 보았으므로 스 태쉬가 팝업되기 직전에 로컬 변경 사항과 스 태쉬를 계속 사용할 수있는 상태로 되돌릴 수 있습니다.


답변

나는 이것을 약간 다른 방식으로 해결했다. 여기에 일어난 일이 있습니다.

먼저 잘못된 브랜치에서 팝업이 발생하여 충돌이 발생했습니다. 숨김은 그대로 유지되었지만 색인은 충돌 해결에있어 많은 명령을 차단했습니다.

단순한 git reset HEAD분쟁 해결을 중단하고 커밋되지 않은 (및 원치 않는) ) 변경 사항을 .

몇몇 git co <filename>은 색인을 초기 상태로 되돌 렸습니다. 마지막으로 지점으로 전환 git co <branch-name>하고 new를 실행하여 git stash pop충돌없이 해결했습니다.