스택 팝을 중단하는 방법은?
제가 창고를 털어서 합병 충돌이 있었습니다.중복으로 나열된 질문과 달리 보관하고 싶은 디렉터리에 이미 커밋되지 않은 변경 사항이 있습니다.병합 충돌을 사라지게 할 뿐만 아니라 디렉터리를 팝업 이전 상태로 되돌리고 싶습니다.
나는 노력했다.git merge --abort
하지만 git는 합병이 진행 중이 아니라고 주장했습니다.디렉터리에서 원래 변경한 내용을 삭제하지 않고 팝업을 중단할 수 있는 쉬운 방법이 있습니까?
심플 라이너 1개
항상 사용해 왔습니다.
git reset --merge
실패한 기억이 안 나요.
참고:git reset --merge
단계별 변경 내용을 삭제합니다.또한, @Saroopashree Kumaraguru가 댓글에 지적한 바와 같이, 저장된 내용물은 손실되지 않으며 나중에 다시 적용할 수 있습니다.
제 사용 사례: 잘못된 지점에 갑자기 나타나 충돌이 발생했습니다.제가 필요한 것은 팝업을 실행 취소하고 올바른 분기에 팝업할 수 있도록 저장 목록에 저장하기만 하면 됩니다.제가 한 일은:
git reset HEAD --hard
git checkout my_correct_branch
git stash pop
만만하다.
좋아요, 저는 "git stash unappy"를 해결했다고 생각합니다. 복다니합잡보다니▁보다 더 복잡합니다.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 help stash
팝업 섹션의 설명서:
상태를 적용하면 충돌이 발생하여 실패할 수 있습니다. 이 경우에는 상태가 스택 목록에서 제거되지 않습니다.충돌을 수동으로 해결하고 이후 수동으로 gitstash 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이 보이지 않습니다. 단지 실패할 뿐입니다.저희가 도와드릴 수 있는 다른 조치가 있습니까?
다른 변경 사항에 대해 걱정할 필요가 없고 마지막 커밋으로 돌아가려는 경우 다음을 수행할 수 있습니다.
git reset .
git checkout .
git clean -f
좋아요, 제 생각에 당신이 필요한 곳으로 돌아갈 수 있는 (팝을 하지 않은 것처럼) 워크플로우를 간신히 찾은 것 같습니다.
사전에 백업하십시오!! 이 방법이 효과가 있을지 모르니, 효과가 없을 경우를 대비하여 전체 보고서를 복사하십시오.
병합 문제를 해결하고 패치에서 발생하는 모든 변경 내용을 선택하여 모든 충돌을 해결합니다(torto emerge에서는 이 변경 내용이 하나로 표시됨).리모트(그들의)
git mergetool
이러한 변경 사항을 커밋합니다(mergetool 명령을 통해 이미 추가됨)."합병" 또는 당신이 기억하는 어떤 것에 대한 커밋 메시지를 주세요.
git commit -m "merge"
이제 패치에서 새 커밋을 사용하여 원래 시작한 로컬 스테이징되지 않은 변경 사항이 남아 있습니다(나중에 제거할 수 있습니다).이제 단계별 변경사항 커밋
git add .
git add -u .
git commit -m "local changes"
패치를 반대로 적용합니다.이 작업은 다음 명령을 사용하여 수행할 수 있습니다.
git stash show -p | git apply -R
다음 변경 사항을 커밋합니다.
git commit -a -m "reversed patch"
패치/패치 해제 커밋 제거
git rebase -i HEAD^^^
여기서 '접지'와 '접지 패치'가 들어 있는 두 줄을 제거합니다.
변경되지 않은 변경 내용을 다시 가져오고 '로컬 변경' 커밋을 실행 취소합니다.
git reset HEAD^
간단한 예를 들어 살펴보았는데, 이를 통해 원하는 위치로 돌아갈 수 있습니다. 즉, 저장소가 터지기 바로 전에 로컬 변경 사항을 적용하고 저장소를 계속해서 팝업할 수 있습니다.
저는 이것을 다소 다른 방법으로 해결했습니다.이런 일이 벌어졌습니다.
우선 지점을 잘못 찾아 갈등이 생겼습니다.스택은 그대로 유지되었지만 인덱스가 충돌 해결 중이어서 많은 명령이 차단되었습니다.
단한.git reset HEAD
충돌 해결을 중단하고 커밋되지 않은(및 원하지 않는) 변경 사항을 남겼습니다.
개의 러명여git co <filename>
인덱스를 초기 상태로 되돌렸습니다.마침내, 저는 지점을 바꿨습니다.git co <branch-name>
새로실을 합니다.git stash pop
충돌 없이 해결되었습니다.
몇 가지 아이디어:
사용하다
git mergetool
병합 파일을 원래 부품과 새 부품으로 분할합니다.그 중 하나가 당신의 비스택 변경사항이 있는 파일이기를 바랍니다.스택의 디프를 역방향으로 적용하여 변경 사항만 취소합니다.병합 충돌이 발생한 파일을 수동으로 분할해야 합니다(위의 방법이 효과적일 것으로 기대됨).
저는 두 가지 모두 테스트하지 않았기 때문에 효과가 있을지 확신할 수 없습니다.
만약 당신이 숨겨진 변화를 가지고 있다면 이 라이너 1개를 사용해 보세요.모든 로컬 변경사항이 제거됩니다.
git checkout -f
병합 - 다른 분기 코드를 병합하고 충돌이 있는 경우에만 중단합니다.
git merge --abort
스택 팝업에 충돌이 있는 경우 다음을 사용할 수 있습니다.
git reset --merge
나는 깨끗하게 번식할 수 있었습니다.git stash pop
커밋되지 않은 변경 사항이 있는 "merge" 디렉터리에 있지만 병합 충돌을 생성하는 팝업은 아직 없습니다.
병합 충돌 시 적용하려는 스택이 사라지지 않은 경우 검사할 수 있습니다.git show stash@{0}
으로 (으)로)--ours
또는--theirs
및 와 합니다.git statis
그리고.git diff HEAD
스택을 적용할 때 어떤 변경 사항이 발생했는지 확인할 수 있어야 합니다.
병합 충돌 때문에 스택을 터뜨리지 않았다는 DavidG의 말이 맞다면 작업 디렉터리를 정리하기만 하면 됩니다. ㅠㅠ.git commit
당신이 신경쓰는 모든 것.(할 수 있습니다.reset
또는squash
완료되지 않은 경우 나중에 커밋합니다.)그럼 당신이 안전에 신경쓰는 모든 것을 가지고,git reset
밖의 것git stash pop
당신의 작업 디렉토리에 버려집니다.
이전에 준비된 변경 사항이 없는 경우git stash pop
질문과 같이 다음 두 가지 명령이 작동합니다.
git diff --name-only --cached | xargs git checkout --ours HEAD
git ls-tree stash@{0}^3 --name-only | xargs rm
첫 번째는 성공 여부와 상관없이 모든 병합을 저장에서 되돌립니다.두 번째는 스택에 의해 도입된 추적되지 않은 파일을 삭제합니다.
man git stash
:The working directory must match the index.
@ @DavidG 지적것은는하가,▁@,stash pop
현재 준비되지 않은 수정된 파일이 충돌하면 실패합니다.때문에 을 넘어 병합 충돌을 하는 것에 대해 할 필요가 없습니다.HEAD
그러면 나머지 수정된 파일은 스택과 관련이 없으며, 다음 이전에 수정되었습니다.stash pop
단계적으로 변경된 경우 동일한 명령을 사용할 수 있는지 여부가 불분명하며 @Ben Jackson의 기술을 사용해 보십시오.제안 감사합니다.
다음은 모든 다양한 사례에 대한 테스트 설정입니다. https://gist.github.com/here/4f3af6dafdb4ca15e804
# Result:
# Merge succeeded in m (theirs)
# Conflict in b
# Unstaged in a
# Untracked in c and d
# Goal:
# Reverse changes to successful merge m
# Keep our version in merge conflict b
# Keep our unstaged a
# Keep our untracked d
# Delete stashed untracked c
사용하다git reflog
Git 기록의 모든 변경 사항을 나열합니다.하고 ID를 입력합니다.git reset ACTION_ID
if 추적 파일을 사용해 보십시오.
git rm <path to file>
git reset <path to file>
git checkout <path to file>
다른 사람들이 제 답변이 도움이 되기를 바라며 여기에 글을 올립니다.저는 제가 숨겼던 지점과 다른 지점에서 스택 팝을 하려고 했을 때 비슷한 문제를 겪었습니다.저의 경우 커밋되지 않았거나 인덱스에 있지만 병합 충돌 사례(@pid와 동일한 사례)에 포함된 파일이 없었습니다.다른 사람들이 이전에 지적했듯이, 실패한 git stash pop은 실제로 내 저장소를 유지했고, 그리고 나서 빠른 git reset HEAD 플러스는 내 원래 지점으로 돌아가서 그곳에서 stash를 하는 것이 내 문제를 해결했습니다.
언급URL : https://stackoverflow.com/questions/8515729/how-to-abort-a-stash-pop
'programing' 카테고리의 다른 글
.NET: 어레이 목록 대 목록 (0) | 2023.05.15 |
---|---|
Linux의 PostgreSQL 데이터베이스 기본 위치 (0) | 2023.05.15 |
라우터 탐색에서 동일한 페이지에서 ngOnInit를 호출하지 않음 (0) | 2023.05.15 |
임시로 작업 복사본을 특정 Git 커밋으로 전환 (0) | 2023.05.15 |
중첩된 NPM 종속성 버전을 재정의하려면 어떻게 해야 합니까? (0) | 2023.05.15 |