이 질문에서 요청한 것처럼 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 자체에서 제안한 것git status
입니다. 리포지토리에서 충돌 로 실행 해보십시오 .
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)
쓸모없는 커밋을하지 않고 Git이 제안한 것을 수행하십시오.
- 수동으로 (또는 일부 병합 도구를 사용하여 아래 참조) 충돌을 해결하십시오.
- 를 사용하여
git reset
해결하고 unstage 변경 등의 마크 충돌 (들). 매개 변수없이 실행할 수 있으며 Git은 인덱스에서 모든 것을 제거합니다. 당신은git add
전에 실행할 필요가 없습니다 . - 마지막으로,
git stash drop
Git은 충돌시 그렇게하지 않기 때문에 숨김을 제거하십시오 .
명령 줄로 번역 :
$ git stash pop
# ...resolve conflict(s)
$ git reset
$ git stash drop
기본 동작 설명
이 해결로 표시 충돌하는 두 가지 방법은 다음과 같습니다 git add
및 git reset
. git reset
충돌이 해결 된 것으로 표시하고 색인에서 파일을 제거 하지만 ,git add
도 해결로 표시 충돌을하지만, 인덱스 파일을 유지합니다.
충돌이 해결 된 후 색인에 파일을 추가하는 것은 의도적 인 것입니다. 이렇게하면 이전 숨김과 변경 내용 및 충돌이 해결 된 후 변경 한 내용을 구별 할 수 있습니다. 마음에 들지 않으면 언제든지 사용할 수 있습니다git reset
색인에서 모든 것을 제거 .
병합 도구
KDiff3 , Meld 등과 같은 충돌을 해결하기 위해 수동으로 수행하는 대신 3 방향 병합 도구 를 사용하는 것이 좋습니다 . 일반적으로 모든 또는 대부분의 충돌을 자동으로 해결합니다. 그건 엄청난 시간을 절약!
답변
원점에서 가져 오기 위해 변경 사항을 숨기는이 시나리오가 있다고 가정하십시오. 로컬 변경 사항이 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
그리고 끝났다.
답변
충돌을 해결하기 위해 변경 사항을 추가하는 대신 변경 사항을 git reset HEAD file
준비하지 않고 충돌을 해결하는 데 사용할 수 있습니다 .
그러나이 명령을 두 번 실행해야 할 수도 있습니다. 한 번은 충돌을 해결 된 것으로 표시하고 한 번은 충돌 해결 루틴에 의해 준비된 변경 사항을 스테이지 해제하십시오.
현재는 없지만 두 가지를 동시에 수행하는 재설정 모드가있을 수 있습니다.
답변
git checkout stash -- .
나를 위해 일했다.
참고 : 숨김의 변경 사항을 작업 복사본으로 병합하지 않고 대신 숨김 파일로 덮어 쓰므 로 위험 할 수 있습니다 . 커밋되지 않은 변경 사항을 잃을 수 있습니다.
답변
git add .
git reset
git add .
git에게 충돌을 해결했다고 알려주는 모든 파일을 준비합니다.
git reset
커밋을 만들지 않고 모든 준비된 파일을 스테이지 해제합니다.
답변
이것은 당신이 찾고있는 대답 일 것 같습니다, 나는 이것을 개인적으로 시도하지는 않았지만, 그것이 트릭을 할 수있는 것처럼 보입니다. 이 명령을 사용하면 GIT는 커밋을 위해 모든 변경 사항을 추가하지 않고 변경 사항을 이전과 동일하게 적용하려고합니다.
git stash apply --index
전체 설명은 다음과 같습니다.