Git Stash Uncached : 모든 미 단계 변경 사항을 삭제하는 방법은 무엇입니까?


96

git에 의해 버전이 지정된 프로젝트에서 두 가지 변경 사항이 있다고 가정합니다. 한 세트는 스테이징되고 다른 세트는 그렇지 않습니다.

이 상태 (커밋 전)에서 프로젝트를 실행하여 단계적 변경을 다시 확인하고 싶습니다. 모든 단계되지 않은 변경 사항을 제거하고 단계적으로 만 유지하는 간단한 방법은 무엇입니까? 따라서 프로젝트에서 사라지고 추가 작업을 위해 어딘가에 저장하려면 무단계 변경 사항이 필요합니다.

이것은 git stash명령 과 매우 흡사하게 들립니다 . 그러나 git stash내 프로젝트에서 무단계 및 단계적 변경을 모두 제거합니다. 그리고 나는 같은 것을 찾을 수 없습니다 git stash uncached.


오늘 내 자식 2.21을 사용하면 여전히 이에 대한 좋은 대답이 없습니다. 아래의 모든 답변은 정확하지 않거나 ( -k옵션) 사용하기 번거 롭습니다.
Penghe Geng

답변:


98

업데이트 2 :
사람들 이이 답변에 대해 불평하는 이유를 잘 모르겠습니다. 완벽하게 작동하는 것 같습니다. 추출되지 않은 파일의 경우 -u플래그를 추가 할 수 있습니다

전체 명령은 git stash --keep-index -u

다음 git-stash은 도움말 의 일부입니다.

--keep-index 옵션을 사용하면 이미 인덱스에 추가 된 모든 변경 사항이 그대로 유지됩니다.

--include-untracked 옵션을 사용하면 추적되지 않은 모든 파일도 숨겨지고 git clean으로 정리되어 작업 디렉토리가 매우 깨끗한 상태로 유지됩니다. 대신 --all 옵션을 사용하면 추적되지 않은 파일과 함께 무시 된 파일이 숨겨지고 정리됩니다.

그리고 이것은 어떻게 보이는지에 대한 gif입니다.

여기에 이미지 설명 입력

최신 정보:

이것이 선택된 답변 임에도 불구하고 [아래 답변] (https://stackoverflow.com/a/34681302/292408)이 올바른 답변이라고 많은 사람들이 지적 했으므로 확인하는 것이 좋습니다.

나는 오늘 (31/1/2020) 내 대답을 git version에 대해 다시 테스트했으며 2.24.0여전히 옳다고 생각하며 추적되지 않은 파일에 대한 작은 메모를 위에 추가했습니다. 작동하지 않는다고 생각되면 git 버전도 언급하십시오.

올드 답 :
경우 --keep-index옵션을 사용, 이미 인덱스에 추가 된 모든 변경 사항이 그대로 남아 있습니다 :

git stash --keep-index

문서에서git-stash :

부분 커밋 테스트

git stash save --keep-index작업 트리의 변경 사항에서 두 개 이상의 커밋을 수행하고 커밋하기 전에 각 변경 사항을 테스트하려는 경우 사용할 수 있습니다 .

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

그러나 단계적 변경 사항 만 시각적으로 확인하려는 경우 다음을 시도 할 수 있습니다 difftool.

git difftool --cached

4
git stash [-p|--patch]인터랙티브 숨김처럼 느껴지는 것도 보십시오. 에서 man git stash"--patch를 사용하면 대화 형으로 HEAD와 작업 트리 은닉 할 사이 DIFF에서 심술쟁이를 선택할 수 있습니다."
여기

1
나는 보통 add -p, checkout -p그리고 reset -p시도하지, 결코 stash -pD : 팁 주셔서 감사합니다
모하마드 AbuShady

18
이 답변은 또한 준비한 변경 사항을 숨길 것입니다.
Ben Flynn

이 답변은 혼란을 야기하므로 실제로 유용하지 않습니다. 이 답변은 더 나은 stackoverflow.com/a/34681302/292408 입니다.
Elijah Lynn

1
@ElijahLynn 나는 많은 사람들이 더 나은 대답이라고 말하는 것을 발견했기 때문에 다른 대답에 연결했습니다. 귀하의 의견에 감사드립니다
Mohammad AbuShady

100

받아 들여진 대답은 또한 몇몇 사람들이 지적했듯이 단계적 변화를 숨 깁니다. 다음은 숨김에 단계적 변경없이이를 수행하는 방법입니다.

아이디어는 단계적 변경 사항을 임시 커밋 한 다음 단계되지 않은 변경 사항을 숨긴 다음 임시 커밋을 해제하는 것입니다.

# temp commit of your staged changes:
$ git commit --message "WIP"

# -u option so you also stash untracked files
$ git stash -u

# now un-commit your WIP commit:
$ git reset --soft HEAD^

이 시점에서 준비되지 않은 변경 사항은 숨겨지고 작업 복사본에는 준비된 변경 사항 만 표시됩니다.


21
이것은 정말 정답 IMO입니다. --keep-index현재 허용되는 답변 의 옵션은 여전히 ​​색인에있는 내용을 숨기고 색인 에도 유지합니다. 그래서 그것은 복제되고 환희가 계속됩니다.
Ken Williams

3
@KenWilliams <델> 환희 </ 델> <기능> 비극 </ 기능>
tuespetre

@KenWilliams 정말 짜증났습니다. OP 선택한 답변을 조정할 수 있습니까?
MikeMurko 2018

2
git add .단계 향상 될 수도 있습니다 git add --all그 역시 현재 작업 디렉토리 위의 디렉토리에있는 파일을 잡아해야한다.
Elijah Lynn

1
허용되는 답변의 --keep-index 옵션이 오해의 소지가 있기 때문에 이것은 지금까지 최선의 답변입니다. 이것은 받아 들여진 대답이어야합니다.
Elijah Lynn

21

나는 단계되지 않은 변경 사항 만 진정으로 숨겨 놓은 무언가가 필요했기 때문에 표시된 답변이 나를 위해 작동하지 않는다는 것을 알았습니다. 표시된 대답 git stash --keep-index은 단계적 변경 사항과 단계적 변경 사항이 모두 숨겨져 있습니다. 이 --keep-index부분은 작업 복사본에서도 인덱스를 그대로 유지합니다. 그것은 OP에서 작동하지만 실제로 대답을 원했던 것과 약간 다른 질문을했기 때문입니다.

준비되지 않은 변경 사항을 숨길 수있는 유일한 방법은 숨김을 전혀 사용하지 않는 것입니다.

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .대신 apply -R.

작업 작업 작업 ...

git apply unstaged.diff
rm unstaged.diff

1
여기에 git version 2.6.1.windows.1, git stash -k설명했다.
koppor

이것이 받아 들여진 대답이어야합니다! 임시 커밋을 만드는 데 의존하지 않고 주장하는 것을 수행하는 여러 스택 오버플로 스레드에서 유일한 것입니다!
user643011

1
@ user643011 : 임시 커밋은 git에서 나쁜 것이 아닙니다. 그들은 비용이 들지 않으며 누구에게도 해를 끼치 지 않습니다.
프리츠

1
@Fritz : 일부 시나리오에서는 임시 커밋이 불가능합니다. 현재 작업 코드를 확인하는 사전 커밋 후크가있는 경우 실패 할 수 있습니다. 단계적 변경은 좋지만 단계되지 않은 변경은 그렇지 않은 경우이 접근 방식은 단계적 변경을 커밋하지 못합니다.
Penghe Geng

1
추적되지 않은 파일은 포함되지 않습니다. "git ls-files"를 사용하여 diff 패치를 찾아 포함해야합니다
ACyclic

5

Git : 준비되지 않은 변경 사항 보관

그러면 git add하지 않은 모든 수정 사항이 숨겨집니다.

git stash -k

새로 생성 된 (추가되지 않은) 파일은 -u스위치를 사용하지 않는 한 작업 디렉토리에 남아 있습니다.

git stash -k -u 

또한 나중에 git stash pop을 사용할 때 작업 디렉토리가 깨끗해야합니다 (즉 모든 변경 사항이 추가되어야 함).

http://makandracards.com/makandra/853-git-stash-unstaged-changes


13
이것은 git stash --keep-index. 스테이징 된 파일은 숨김에 포함됩니다.
Benjamin Cheah
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.