스택을 역방향으로 적용하는 방법은 무엇입니까?
나는 작은 패치를 내 상품 보관함에 저장해 두었습니다.다음을 사용하여 작업 복사본에 적용했습니다.git stash apply
이제 패치를 역방향으로 적용하여 변경 사항을 되돌리고 싶습니다.git revert
(재고에 반대하는 것 외에는 하지 않을 것입니다.
이거 어떻게 하는지 아는 사람?
명확화:제 작업 복사본에 다른 변경 사항이 있습니다.제 사례는 설명하기 어렵지만, 스택에 있는 디버깅이나 실험 코드를 상상할 수 있습니다.이제 제 작업 복사본에 다른 변경 사항이 섞여 있습니다. 그리고 저는 재고의 변경 사항이 있는지 없는지 그 효과를 보고 싶습니다.
하는 것으로, a 현재재이지것는보처않지만는이지럼원하것고가을,▁it현▁supports않지만▁this.git stash apply --reverse
좋은 기능이 될 것입니다.
git-stash man 페이지에 따르면, "stash는 트리가 작업 디렉토리의 상태를 기록하는 커밋으로 표현되며, 첫 번째 부모는 다음과 같은 커밋입니다.HEAD
", ", ", ", ", ", ", ",", ", ", ",", ", git stash show -p
는 "저장된 상태와 원래 상위 상태 사이의 차이로 저장된 변경 사항"을 제공합니다.
다른 변경사항을 그대로 유지하려면 다음을 사용합니다.git stash show -p | patch --reverse
다음과 같이 합니다.
$ git init
Initialized empty Git repository in /tmp/repo/.git/
$ echo Hello, world >messages
$ git add messages
$ git commit -am 'Initial commit'
[master (root-commit)]: created 1ff2478: "Initial commit"
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 messages
$ echo Hello again >>messages
$ git stash
$ git status
# On branch master
nothing to commit (working directory clean)
$ git stash apply
# On branch master
# 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: messages
#
no changes added to commit (use "git add" and/or "git commit -a")
$ echo Howdy all >>messages
$ git diff
diff --git a/messages b/messages
index a5c1966..eade523 100644
--- a/messages
+++ b/messages
@@ -1 +1,3 @@
Hello, world
+Hello again
+Howdy all
$ git stash show -p | patch --reverse
patching file messages
Hunk #1 succeeded at 1 with fuzz 1.
$ git diff
diff --git a/messages b/messages
index a5c1966..364fc91 100644
--- a/messages
+++ b/messages
@@ -1 +1,2 @@
Hello, world
+Howdy all
편집:
이에 대한 약간의 개선 사항은 다음과 같습니다.git apply
패치 대신:
git stash show -p | git apply --reverse
또다음사수있다습니도용할을는다있을 사용할 수도 .git apply -R
…의 git apply --reverse
.
최근에 이게 정말 유용하다는 걸 알게 됐어요
git checkout -f
커밋되지 않은 변경 사항을 제거합니다.
git stash
[save]
상태와 상태를 및 " " " " " " " " " " " " " " " " " " " " " " " " " " " 으로 합니다.HEAD
판본
git stash apply
는 변경에 이한변불니다옵러를화러다니.git reset --hard
다시 제거할 수 있습니다.
git stash pop
이러한 변경 사항을 되돌리고 상위 저장된 변경 사항을 제거합니다.git stash [save]
이 경우 이전(팝 전) 상태로 돌아갑니다.
V1 gitman 페이지에 stash 적용 취소에 대한 참조가 있었습니다.발췌본은 아래와 같습니다.
최신 V2 gitman 페이지에는 stash 적용 해제에 대한 참조가 포함되어 있지 않지만 아래는 여전히 잘 작동합니다.
Stash 적용 해제 일부 사용 사례 시나리오에서는 Stash된 변경 사항을 적용하고 일부 작업을 수행한 후 원래 Stash에서 발생한 변경 사항을 적용 취소할 수 있습니다.Git는 이러한 stash un-apply 명령을 제공하지 않지만 단순히 stash와 관련된 패치를 검색하고 반대로 적용하면 효과를 얻을 수 있습니다.
$ git stash show -p stash@{0} | git apply -R
다시 말하지만, stash를 지정하지 않으면 Git는 가장 최근의 stash를 가정합니다.
$ git stash show -p | git apply -R
별칭을 만들고 stash-unapply 명령을 Git에 효과적으로 추가할 수 있습니다.예:
$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply
이것은 기한이 한참 지났지만, 내가 문제를 올바르게 해석한다면, 나는 간단한 해결책을 찾았다, 참고로, 이것은 나만의 용어로 설명한 것입니다.
git stash [save]
내용을 를 " 상태합니다.
git stash list
다음과 같은 기능을 제공합니다.stash@{0}: On develop: saved testing-stuff
git apply stash@{0}
이전과 같이 현재 분기를 설정합니다. stash [save]
git checkout .
현재 분기를 다음과 같이 설정합니다. stash [save]
, 스에저코손않습으로 수 . 다음을 통해 찾을 수 있습니다.git apply stash@{0}
한 번. 다시시.
어쨌든, 이것은 나에게 효과가 있었습니다!
스택을 역방향으로 적용하는 방법은 무엇입니까?
다른 사람들이 언급한 것과는 별개로, 가장 쉬운 방법은 먼저 하는 것입니다.
git reset HEAD
모든 로컬 변경 사항을 확인합니다.
git checkout .
두 가지 명령을 적용할 수 있습니다.
git reset .
을
그리고나서
git checkout .
를
실수로 저장을 눌렀을 경우 공유한 이미지를 따라 저장을 해제할 수 있습니다.
@Greg Bacon 답변 외에도 이진 파일이 인덱스에 추가되고 다음을 사용하여 스택의 일부가 된 경우
git stash show -p | git apply --reverse
을 초래할 수도 있습니다.
error: cannot apply binary patch to '<YOUR_NEW_FILE>' without full index line
error: <YOUR_NEW_FILE>: patch does not apply
추가하기--binary
문제를 해결했지만 안타깝게도 아직 이유를 파악하지 못했습니다.
git stash show -p --binary | git apply --reverse
git stash show -p | git apply --reverse
모든 경우에 해당하지 않는 경고:git apply -R
(man) "는 Git 2.30(Q1 2021)으로 수정된 동일한 경로에 두 번씩 접촉하는 패치를 올바르게 처리하지 않았습니다.
이는 일반 파일에서 심볼릭 링크(또는 그 반대)로 경로를 변경하는 패치와 가장 관련이 있습니다.
Jonathan jhowtan
Tan()의 commit b0f266d(2020년 10월 20일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- commit c23cd78, 2020년 11월 2일)
apply
언제-R
의 역 입니다.도우미: 하마노 주니오
사인 오프 바이: 조나단 탄
심볼릭 링크를 파일로 변경하는 패치는 두 개의 섹션(코드에서 "struct patch"로 표시됨)으로 작성됩니다. 첫 번째 섹션은 심볼릭 링크 삭제이고 두 번째 섹션은 파일 생성입니다.
를 당해패 를적때할과 함께 할 때
-R
섹션이 반대로 되어 있습니다. (1) 심볼 링크 생성, (2) 파일 삭제.이것은 "파일 삭제" 섹션이 선택되었을 때 문제가 발생하는데, 이는 Git가 소위 파일이 파일이 아니라 심볼릭 링크임을 관찰하여 "잘못된 유형" 오류 메시지가 발생하기 때문입니다.
우리가 원하는 것은 (1) 파일 삭제, (2) 심볼 링크 생성입니다.
코드에서, 이것은 다음의 행동에 반영됩니다.
previous_patch()
에서 호출되었을 때.check_preimage()
선택합니다.
생성 후 삭제는 삭제가 확인되었을 때previous_patch()
생성 섹션을 반환하여 모드 충돌을 트리거하여 "creation type" 오류 메시지를 생성합니다.하지만 삭제 후 생성은 삭제가 확인되면
previous_patch()
아온다를 합니다.NULL
그래서 삭제 모드는 우리가 원하는 lstat에 대해 확인됩니다.패치에 동일한 파일을 참조하는 두 개의 섹션을 포함할 수 있는 다른 방법도 있습니다. 예를 들어, 7a07841c0b ("
git-apply
동일한 경로에 한 번 이상 더 잘 접촉하는 패치를 처리합니다.", 2008-06-27, Git v1.6.0-rc0 -- 병합).같은git apply -R
(man) 방식으로 실패하고 이 커밋으로 인해 이 사례가 성공합니다.따라서 섹션 목록을 작성할 때 다음과 같은 경우 (뒤 대신 목록 앞에 추가하여) 역순으로 작성합니다.
-R
통과했습니다.
이것은 위의 답변에 추가되지만 새 스택이 저장될 때 스택 번호가 변경될 수 있기 때문에 메시지를 기반으로 Git Stash 검색을 추가합니다.나는 몇 가지 bash 함수를 작성했습니다.
apply(){
if [ "$1" ]; then
git stash apply `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"`
fi
}
remove(){
if [ "$1" ]; then
git stash show -p `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"` | git apply -R
git status
fi
}
- 이 생성하기 " (메시지) " " " 입니다.
$ git stash save "my stash"
- 이 붙은 명된적법을
$ apply "my stash"
- 명명된 스택을 제거하려면 다음과 같이 하십시오.
$ remove "my stash"
, git reset --hard
변경사항이나 추적되지 않은 변경사항을 잃지 않습니다.
,git stash --help
적용되는 상태가 "팝처럼, 그러나 상태를 저장 목록에서 제거하지 않음"이므로 상태가 여전히 해당 상태에 있으면 다시 가져올 수 있습니다.
또는 충돌이 없는 경우 다음과 같이 수행할 수 있습니다.git stash
변경 내용을 테스트한 후 다시 확인합니다.
갈등이 하지 마세요, ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠgit reset --hard
"충돌과 실패할 수 . 이되지 않습니다."와이들 상태가 되지 않습니다상태를 적용하면 충돌이 발생하여 실패할 수 있습니다. 이 경우에는 상태가 저장 목록에서 제거되지 않습니다.충돌을 수동으로 해결하고 이후 수동으로 gitstash drop을 호출해야 합니다."
체크아웃할 때 저장소 이름을 잘못 입력했습니다.그래서 말 그대로 끌어당길 수 있는 거리가 없었습니다.
따라서 케이스를 확인하는 것 외에도 지점 이름 철자를 확인하거나 복사하여 붙여넣는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/1020132/how-to-reverse-apply-a-stash
'bestsource' 카테고리의 다른 글
응용 프로그램이 중단 모드에 있음 - 원인을 확인할 수 없음 (0) | 2023.05.14 |
---|---|
유형이 특정 일반 인터페이스 유형을 구현하는지 확인하는 방법 (0) | 2023.05.14 |
WPF에 대한 자바의 대답은 무엇입니까? (0) | 2023.05.09 |
Node.js에서 ES6 가져오기를 사용하려면 어떻게 해야 합니까? (0) | 2023.05.09 |
정렬된 배열 처리가 정렬되지 않은 배열보다 느린 이유는 무엇입니까? (0) | 2023.05.09 |