programing

gitstash -> 현재 변경 사항과 저장된 변경 사항 병합

telecom 2023. 6. 19. 21:09
반응형

gitstash -> 현재 변경 사항과 저장된 변경 사항 병합

지점에 몇 가지 변경을 가했는데, 해당 지점에 다른 필요한 변경 사항을 저장한 것을 잊어버렸다는 것을 깨달았습니다.제가 원하는 것은 저장된 변경사항을 현재 변경사항과 병합하는 방법입니다.

이것을 할 수 있는 방법이 있습니까?

편의를 위해 저는 결국 포기하고 먼저 현재의 변화를 저지르고 그 다음에 숨겨진 변화를 저질렀지만, 단번에 그것들을 받아들이는 것을 선호했을 것입니다.

tl;dr

달려.git add첫번째.


커밋되지 않은 변경사항이 인덱스에 추가된 경우(예: "staged", 사용)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"

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

입니다.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두 번의 커밋을 정말 원하지 않는다면, 하지만 그것은 가치가 있는 더 큰 문제일 수도 있습니다.

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

다음은 이를 위한 다른 옵션입니다.

git stash show -p|git apply
git stash drop

git stash show -p마지막으로 저장된 저장소의 패치가 표시됩니다. git apply적용할 것입니다.병합이 완료된 후 병합된 스택을 삭제할 수 있습니다.git stash drop.

제가 하는 방법은git add그렇다면 이것이 먼저git stash apply <stash code>가장 간단한 방법입니다.

당신은 쉽게 할 수 있습니다.

  1. 현재 변경 내용 커밋
  2. 저장소를 해제하고 충돌 해결
  3. 저장소에서 변경 내용 커밋
  4. 시작할 커밋에 대한 소프트 재설정(마지막 올바른 커밋)

@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^.

아마도, (diff tool을 통해) ...에서 병합하는 것이 가장 나쁜 생각은 아닐 것입니다.네... 나뭇가지!

> 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

저는 다른 해결책을 찾았습니다.현재 열려 있는 변경 사항을 커밋한 다음, 스택을 팝업한 다음 마지막 커밋 이전으로 소프트 재설정할 수 있습니다.

git commit -am 'Open changes'
git stash pop
git reset --soft HEAD~1

다른 옵션은 커밋되지 않은 로컬 변경사항에 대해 다른 "gitstash"를 수행한 다음 두 gitstash를 결합하는 것입니다.안타깝게도 git은 두 개의 stash를 쉽게 결합할 방법이 없는 것 같습니다.따라서 한 가지 옵션은 두 개의 .diff 파일을 만들고 둘 다 적용하는 것입니다. 적어도 추가 커밋은 아니며 10단계 프로세스를 포함하지 않습니다. |

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

언급URL : https://stackoverflow.com/questions/11675841/git-stash-merge-stashed-change-with-current-changes

반응형