Git Stash Pop 충돌 실행 취소

Ankit Raj Goyal 2023년6월20일
  1. Git Stash Pop 병합 충돌 - 문제
  2. 충돌이 있는 Git Stash Pop 실행 취소 - 잘못된 병합을 중단하여 깨끗한 상태로 되돌리기
  3. 나쁜 충돌을 해결하여 Git Stash Pop 실행 취소
Git Stash Pop 충돌 실행 취소

이 문서의 솔루션과 병합 충돌이 있는 git stash pop을 실행 취소할 수 있습니다. 잘못된 숨김 팝 작업을 중단하고 깨끗한 상태로 돌아가는 방법을 보여줍니다.

그러나 우리는 충돌을 해결하고 새로운 좋은 병합으로 git stash pop을 실행 취소하는 방법도 보여줍니다.

Git Stash Pop 병합 충돌 - 문제

빠르게 진행되는 개발자의 워크플로우에서는 현재 상태를 숨기고 새로운 아이디어가 떠오를 때 다른 기능으로 건너뛰는 것이 일반적입니다.

새 기능에 대한 작업을 마치면 git stash pop 명령을 사용하여 숨겨진 변경 사항을 적용합니다. 그러나 때로는 이러한 전후 작업 흐름으로 인해 병합 충돌이 발생합니다.

이러한 상황에서 두 가지 중 하나를 수행할 수 있습니다.

  1. 잘못된 병합을 중단하고 이전의 깨끗한 상태로 돌아갑니다.
  2. 병합 충돌을 해결하기 위해 로컬에서 파일/디렉토리를 편집하거나 원격 리포지토리에서 가져올 수 있습니다. 그런 다음 올바른 변경 사항을 새로운 커밋과 병합할 수 있습니다.

두 솔루션을 모두 살펴보겠습니다.

충돌이 있는 Git Stash Pop 실행 취소 - 잘못된 병합을 중단하여 깨끗한 상태로 되돌리기

잘못된 stash pop 작업의 변경 사항을 제거하려면 다음 명령 중 하나를 사용해야 합니다. 이러한 메서드는 병합 충돌을 일으킨 모든 변경 사항을 중단하고 이전의 정상 상태로 돌아갑니다.

git reset --merge

먼저 설정을 살펴보자. 다음과 같이 몇 개의 파일이 있는 master 분기가 있습니다.

마스터 브랜치 초기 설정

그런 다음 여기에서 new_branch 로컬 분기를 포크합니다. 이 분기에서 몇 개의 파일을 수정하고 해당 변경 사항을 커밋합니다.

새 분기 초기 설정

이제 file1.txtfile2.txt에서 몇 가지 사항을 변경합니다. 그런 다음 이러한 변경 사항을 저장합니다.

git stash -u -m "Modify file1 and file2 in new_branch"

git stash는 여기에서 몇 가지 옵션을 사용합니다. -u 플래그를 사용하면 추적되지 않은 변경 사항을 숨길 수 있습니다.

-m 플래그는 동일한 의미를 전달합니다. 즉, 숨김에 시맨틱 메시지를 추가할 수 있습니다.

새 브랜치에 숨김

이제 master 브랜치에서 동일한 file1.txtfile2.txt에서 일부 변경을 수행합니다. 이러한 파일은 masternew_branch에 서로 다른 버전이 있습니다.

포크 후 파일 마스터 수정

master 브랜치에 stash를 적용하려는 경우 file1file2의 서로 다른 버전이 충돌을 일으킵니다.

git stash pop 충돌

이제 리포지토리를 확인하면 병합 시도가 잘못되어 이상한 파일이 있습니다.

git stash pop 충돌 이상한 동작

일부 옵션과 함께 reset 명령을 사용하여 git undo failed stash pop을 실행할 수 있습니다.

git reset --merge

git reset은 최근 --merge 옵션을 배웠습니다. --merge 옵션은 기본 --mixed 옵션과 유사하지만 병합 작업의 영향을 받는 파일에만 적용됩니다.

이 명령의 결과는 우리의 경우 git undo bad stash pop입니다.

git reset merge

git 체크아웃 -f

-f 플래그를 전달하여 git checkout 명령을 사용하여 위와 동일한 결과를 볼 수 있습니다.

git checkout -f

인수가 없으면 git checkout 명령은 기본 HEAD 인수를 사용합니다. 우리의 마지막 커밋은 나쁜 stash pop 병합 충돌 없이 좋았으므로 이 명령은 슬레이트를 깨끗이 지웁니다.

-f 플래그는 --force 옵션용입니다. 병합되지 않은 커밋과 추적되지 않은 파일을 무시하여 건강한 리포지토리 상태를 유지하는 데 도움이 됩니다.

git 체크아웃 강제 옵션

위의 두 가지 방법은 완전히 지우려는 경우 충돌이 있는 git stash pop을 실행 취소하는 것이 가장 좋습니다.

그러나 새로운 좋은 병합으로 커밋을 해결하려면 아래 방법을 사용해야 합니다.

나쁜 충돌을 해결하여 Git Stash Pop 실행 취소

충돌을 해결하려면 모든 브랜치에서 파일과 디렉토리를 동기화하여 잘 편집해야 합니다.

몇 가지 명령으로 로컬에서 수행하거나 원격 저장소에서 가져올 수 있습니다. 두 가지 솔루션을 모두 살펴보겠습니다.

Git Undo Failed Stash Pop에 대한 충돌 해결 - 로컬 분기의 경우

우리는 위와 같은 설정을 가지고 있습니다. 그러나 이번에는 mainnew_branch 사이의 충돌을 해결하고 stash를 다시 적용하여 원하는 결과를 얻을 것입니다.

먼저 stash pop 충돌을 일으키는 파일의 변경 사항을 제거합니다. 포크 후 마스터file1file2에서 변경한 내용으로 인해 문제가 발생했습니다.

우리는 file1file2에 잘못된 변경 사항을 적용하여 커밋 전 커밋으로 마스터재설정합니다.

git reset <good_commit_hash>

git reset 잘못된 커밋

git checkout HEAD .

또한 checkout 명령을 사용하여 작업 영역을 롤백합니다. 모든 충돌이 해결되도록 모든 파일을 선택하는 후행 점 .에 유의하십시오.

다음을 사용할 수도 있습니다.

git reset HEAD file1.txt file2.txt

우리의 경우 두 개의 관련 파일이 file1.txtfile2.txt라는 것을 알고 있기 때문입니다.

이 형식에서 git checkout 명령은 작업 영역을 충돌이 없는 마지막 양호한 커밋인 HEAD에 정렬하도록 설정합니다.

git 체크아웃 헤드

이제 master 브랜치에서 커밋이 사라진 것을 볼 수 있습니다.

잘못된 커밋이 로컬 설정에서 사라짐

이제 숨겨진 변경 사항을 성공적으로 적용합니다.

git stash pop

git good stash pop

성공적인 해결 적용 숨김

Git Undo Bad Stash Pop - 원격 리포지토리에서 가져와서 충돌 해결

원격 리포지토리의 정상 상태가 가장 낮도록 워크플로가 설정된 경우 원격에서 끌어와 잘못된 숨김 충돌을 해결할 수 있습니다.

먼저 이 솔루션의 구체적인 사용 사례를 설정해 보겠습니다.

건강한 원격

원격 뒤의 로컬 마스터

우리는 로컬 리모트가 리모트 메인보다 1 커밋 뒤에 있음을 알 수 있습니다. 이제 원격 마스터를 추적하는 새 로컬 분기를 만들고 일부 변경 사항을 숨긴다고 가정합니다.

git fetch --all

git switch -c new_branch_tracking_remote_master origin/master

로컬 브랜치 추적 원격 마스터

이 브랜치에 몇 가지 변경 사항을 숨깁니다.

git stash -m "Change file5.txt in local branch"

stash 로컬 추적 원격 마스터

이제 우리는 새로운 로컬 브랜치에서 이러한 변경 사항을 원한다는 것을 깨달았습니다. 우리는 로컬 마스터에서 새 로컬 브랜치를 포크합니다.

git checkout master

git branch local_branch_2

로컬 마스터의 새 포크

우리는 이 분기가 1 커밋 뒤이고 file5.txt 파일이 없다는 것을 알 수 있습니다. 이제 보관함을 팝하면 잘못된 병합 충돌이 발생합니다.

bad git pop 원격 워크플로우

이 경우 충돌을 해결하기 위해 원격 마스터를 로컬 마스터로 가져옵니다. 먼저 원격 저장소를 가져와야 합니다.

git fetch --all

그런 다음 로컬 마스터원격 마스터와 병합합니다.

git merge origin/master

원격에서 로컬 마스터 가져오기

이제 최신 변경 사항을 가져와서 로컬 마스터가 원격 마스터와 동기화되는 것을 볼 수 있습니다. 중요한 file5.txt가 있음을 알 수 있습니다.

업데이트된 로컬 마스터

이제 업데이트된 local master에서 로컬 브랜치인 local_branch_2rebase합니다.

먼저 로컬 브랜치를 체크아웃합니다.

git checkout local_branch_2

이제 로컬 마스터에서 rebase하십시오.

git rebase master

이렇게 하면 local_branch_2가 건강해지고 숨겨진 변경 사항을 받을 준비가 됩니다.

마스터에서 로컬 리베이스

이제 숨겨진 변경 사항을 적용합니다.

git stash pop

이번에는 숨겨진 변경 사항이 성공적으로 적용되는 것을 볼 수 있습니다.

git stash pop 성공 원격 설정

충돌을 해결하고 숨겨진 변경 사항을 성공적으로 병합했습니다.

git stash pop 원격 설정 성공

자원:

  1. https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
  2. https://www.theserverside.com/video/How-to-easily-merge-and-resolve-git-stash-pop-conflicts
  3. https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
  4. https://newbedev.com/git-stash-blunder-git-stash-pop-and-ended-up-with-merge-conflicts
  5. https://stackoverflow.com/questions/4778882/how-to-launch-and-edit-a-file-from-git-using-notepad

관련 문장 - Git Stash