커밋없이 git stash 충돌을 해결하는 방법은 무엇입니까?


495

이 질문에서 요청한 것처럼 git stash pop커밋에 모든 수정 사항을 추가하지 않고 충돌을 해결하는 방법을 알고 싶습니다 (충돌이 없는 "git stash pop"과 마찬가지로).

이 방법으로 내 현재 접근 방식은 매우 냉담합니다.

git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>

[업데이트] 그것을 재현하는 방법 :

mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status

2016-06-27 : scy의 솔루션과 같은 해결 방법은 빈 HEAD에서만 작동하지만 HEAD와 같은 내용이없는 초기 문제는 해결하지 않음을 보여주는 예에 'third'라는 새 파일을 추가했습니다. A에 대한 git stash pop충돌없이.


따라서 git add해결 된 충돌 파일을 효과적으로 색인에 준비하고 색인에 포함시키지 않으시겠습니까?
Romain

네 맞습니다. git stash pop충돌이 발생하지 않을 때 (그러나 파일을 병합 해야하는 알림과 함께) 동작을 원합니다 .
Sven

2
이에 대한 대답은 다음과 같습니다. stackoverflow.com/questions/3945826/git-stash-questions . 선택한 답변에서 4 번째 주석에서 Adam은 왜 git이 이것을 수행하는지 설명합니다.
패트릭

@Patrick이 정보에 감사드립니다. "디자인 상"때문에 해결책이 없을 것 같습니다.
Sven

답변:


509

다른 답변을 따르지 마십시오

글쎄, 당신은 그들을 따를 수 있습니다 :). 그러나 커밋을 수행 한 다음 분기를 재설정하여 커밋을 제거하고 다른 답변에서 제안 된 유사한 해결 방법 이이 문제를 해결하는 확실한 방법이라고 생각하지 않습니다.

깨끗한 솔루션

다음 솔루션은 나에게 훨씬 깔끔한 것으로 보이며 Git 자체에서 제안한 것git status 입니다. 리포지토리에서 충돌 로 실행 해보십시오 .

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

쓸모없는 커밋을하지 않고 Git이 제안한 것을 수행하십시오.

  1. 수동으로 (또는 일부 병합 도구를 사용하여 아래 참조) 충돌을 해결하십시오.
  2. 를 사용하여 git reset해결하고 unstage 변경 등의 마크 충돌 (들). 매개 변수없이 실행할 수 있으며 Git은 인덱스에서 모든 것을 제거합니다. 당신은 git add전에 실행할 필요가 없습니다 .
  3. 마지막으로, git stash dropGit은 충돌시 그렇게하지 않기 때문에 숨김을 제거하십시오 .

명령 줄로 번역 :

$ git stash pop

# ...resolve conflict(s)

$ git reset

$ git stash drop

기본 동작 설명

이 해결로 표시 충돌하는 두 가지 방법은 다음과 같습니다 git addgit reset. git reset충돌이 해결 된 것으로 표시하고 색인에서 파일을 제거 하지만 ,git add 도 해결로 표시 충돌을하지만, 인덱스 파일을 유지합니다.

충돌이 해결 된 후 색인에 파일을 추가하는 것은 의도적 인 것입니다. 이렇게하면 이전 숨김과 변경 내용 및 충돌이 해결 된 후 변경 한 내용을 구별 할 수 있습니다. 마음에 들지 않으면 언제든지 사용할 수 있습니다git reset 색인에서 모든 것을 제거 .

병합 도구

KDiff3 , Meld 등과 같은 충돌을 해결하기 위해 수동으로 수행하는 대신 3 방향 병합 도구 를 사용하는 것이 좋습니다 . 일반적으로 모든 또는 대부분의 충돌을 자동으로 해결합니다. 그건 엄청난 시간을 절약!


32
@kamalpal git stash pop충돌로 실패 할 때 필요한 것 같습니다 .
Emile Bergeron

21
@kamalpal 예, Git은 충돌시 숨김이 제거되지 않았다고 알려줍니다. 문제는 그러한 경우에 관한 것이 었으므로, 그 숨김을 유지하지 않으려면 실제로 실행해야합니다git stash drop .
David Ferenczy Rogožan

@ DavidFerenczyRogožan Git은 숨김 항목을 삭제하지 않았다고 전혀 알리지 않았습니다. 버전 2.17.1은 여기입니다.
Robert Siemer

298

원점에서 가져 오기 위해 변경 사항을 숨기는이 시나리오가 있다고 가정하십시오. 로컬 변경 사항이 debug: true일부 설정 파일에 있기 때문일 수 있습니다. 이제 당신은 누군가가 새로운 설정을 도입하여 갈등을 일으켰습니다.

git status 말한다 :

# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      src/js/globals.tpl.js
no changes added to commit (use "git add" and/or "git commit -a")

괜찮아. 나는 Git이 제안한 것을 따르기로 결정했다. 나는 갈등을 해결하고 다음과 같이 약속했다.

vim src/js/globals.tpl.js
# type type type …
git commit -a -m WIP   # (short for "work in progress")

이제 작업 사본이 원하는 상태에 있지만 원하지 않는 커밋을 만들었습니다. 작업 사본을 수정하지 않고 커밋을 제거하려면 어떻게해야합니까? 잠깐, 그것에 대한 인기있는 명령이 있습니다!

git reset HEAD^

작업 사본이 변경되지 않았지만 WIP 커밋이 사라졌습니다. 그것이 바로 내가 원하는 것입니다! ( --soft여기서 사용하지 않는 점에 유의 하십시오. 숨김 파일에 자동 병합 된 파일이 있으면 자동으로 스테이징되므로 이러한 파일은 나중에 다시 스테이징됩니다.reset .)

그러나 한 가지 더 남은 것이있다 : 매뉴얼 페이지 git stash pop"상태를 적용하면 충돌로 실패 할 수있다 git stash drop. 이것이 바로 우리가하는 일입니다.

git stash drop

그리고 끝났다.


34
작업 트리에만 영향을 미치는 무언가에 대해 HEAD ^ ...를 커밋 재설정하려고 고의적으로 상속받은 추악함이 많이 있습니다.

6
왜 갈등을 해결 한 다음 git add <resolved conflict files>그 뒤를 따라 가지 git reset HEAD않겠습니까?
BoltzmannBrain

제안 해 주셔서 감사하지만 git stash pop충돌 이없는 것과 같은 동작이 아니라는 초기 문제는 해결되지 않습니다 . 충돌하기 전에 HEAD에 다른 파일을 추가하고 커밋에 새 파일을 추가하는 것 git stash pop보다 git commit -a -m WIP. 그러나 충돌이 없으면 새 파일 만 HEAD에 남아 있지만 git stash pop파일 에는 없습니다 .
Sven

7
먼저 커밋 한 다음 커밋을 취소해야한다고 생각하지 않습니다. Dawid Ferenczy 답변 에서 간단히 재설정 하면 동일하게 적용됩니다
vladkras

3
Windows 사용자 ^의 경우이 줄은 특수 줄 연속으로 사용되며 More? 명령을 실행하는 대신 프롬프트. 대신 다음을 사용하십시오 git reset --soft HEAD~1.. 참조 어떻게 - - 난 - 삭제 - unpushed - 자식 - 커밋?
mrfelis

87

충돌을 해결하기 위해 변경 사항을 추가하는 대신 변경 사항을 git reset HEAD file준비하지 않고 충돌을 해결하는 데 사용할 수 있습니다 .

그러나이 명령을 두 번 실행해야 할 수도 있습니다. 한 번은 충돌을 해결 된 것으로 표시하고 한 번은 충돌 해결 루틴에 의해 준비된 변경 사항을 스테이지 해제하십시오.

현재는 없지만 두 가지를 동시에 수행하는 재설정 모드가있을 수 있습니다.


2
재설정 모드는 내가 찾은 것입니다. 다른 해결 방법은 내가 설명한 것과 같으며 5 개 이상의 파일에는 실용적이지 않습니다.
Sven

25
그리고 "git stash drop"을 사용하여 "git stash pop"을 완성하십시오.
David Liu

2
질문에 명시 적으로 요청하지는 않지만 충돌시 숨김이 자동으로 삭제되지 않으므로 "git stash drop"을 포함하도록 답변을 업데이트하는 것이 유용 할 수 있습니다.
Abhishek Pathak

29
git checkout stash -- .

나를 위해 일했다.

참고 : 숨김의 변경 사항을 작업 복사본으로 병합하지 않고 대신 숨김 파일로 덮어 쓰므 로 위험 할 수 있습니다 . 커밋되지 않은 변경 사항을 잃을 수 있습니다.


이것은 "git pull --autostash"가 원하지 않는 병합 커밋과 git checkout stash를 도입 할 때 도움이되었습니다. 무조건 숨김에서 충돌을 덮어 씁니다
Alec Istomin

11
git add .
git reset

git add . git에게 충돌을 해결했다고 알려주는 모든 파일을 준비합니다.

git reset 커밋을 만들지 않고 모든 준비된 파일을 스테이지 해제합니다.


이것은 거의 같다, 실제로 나쁜 대답없는 git add -u다음git reset
ebob

4

이것은 당신이 찾고있는 대답 일 것 같습니다, 나는 이것을 개인적으로 시도하지는 않았지만, 그것이 트릭을 할 수있는 것처럼 보입니다. 이 명령을 사용하면 GIT는 커밋을 위해 모든 변경 사항을 추가하지 않고 변경 사항을 이전과 동일하게 적용하려고합니다.

git stash apply --index

전체 설명은 다음과 같습니다.

http://git-scm.com/book/en/Git-Tools-Stashing


이 힌트를 주셔서 감사합니다,하지만이 도움말 이미 한하지 않습니다 git stash pop- 또는이 복귀하고 할 수있는 방법이 git stash apply --index내가 그 알았을 때 git stash pop충돌로 실행은?
Sven

나는 이것을 생성하는 방법에 대한 예제를 추가했다. 10 개 이상의 파일을 편집하고 있다고 상상 해보자.
Sven

3
이 게시물의 하단에 보면 여기 당신이 실행하는 경우 말합니다 git stash pop과 충돌로 끝나는 실행할 수 있도록 숨겨 놓은이 ... 제거되지 않습니다 git reset --hard내가 제시 한 해결책을 시도해보십시오 다음 팝업을 취소합니다.
Marco Ponti

방금 시도한 결과 파일이 충돌 상태 인 후에는 작동하지 않습니다. 충돌을 수동으로 수정하더라도.
Sam3k

2

git stash branchwill works, 새 분기를 만들고 작업을 보관할 때 있었던 커밋을 확인하고 작업을 다시 적용한 다음 성공적으로 적용되면 숨김을 삭제합니다. 이것을 확인 하십시오


2

내가 찾은 가장 빠른 방법 은 커밋과 관련이없는 충돌을 해결 한 다음 수행 git add -u한 다음 수행 git reset HEAD하는 것입니다.


1

git stash question 에 따르면 , 갈등 을 고친 후에 git add <file>올바른 행동 과정이 있습니다.

이 의견 을 읽은 후에 변경 사항이 색인에 자동으로 추가된다는 것을 이해했습니다. 이것이 git add <file>충돌 해결 프로세스를 완료하는 이유 입니다.


-1

가장 좋은 방법은 아니지만 작동합니다.

$ git stash apply
$ >> resolve your conflict <<
$ >> do what you want to do with your code <<
$ git checkout HEAD -- file/path/to/your/file

에이 모든 변경 사항을 취소하는 것처럼이 대답은 나에게 명백히 잘못을 보인다 file/path/to/your/file, 영업 이익이 무엇을 요구 AFAIU하지 않은,
oromoiluig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.