2017-05-03 8 views
0

나는이 질문에 대한 응답을 찾지 못했지만 놀랍다. 기본적으로 나는 여러 파일들을 숨긴다 (나는 git 확장을 통해 그것을 탐색 할 수있다). 내용을 살펴보면, 적용하기 전에 일부 파일을 삭제하고 싶습니다. 가능합니까? 내가 생각할 수있는힘내 : 적용하지 않고 은닉 파일에 넣기

유일한 해결 방법은 다음과 같습니다 다시

  1. 체크 아웃 새로운 지점
  2. 체크 아웃에 숨겨 놓은이 대상 파일
  3. 숨겨 놓은
  4. 분기

에게 삭제 더 좋은 점이 있나요?

감사합니다.

답변

1

예 더 좋은 방법이 있습니다. 모든

첫째, 당신은 그럼 당신은 은닉 커밋의 내용을 확인하기 위해 아래 할 수

git stash list 

로 숨겨 놓은 목록을 확인할 수 있습니다.

git stash show -p [email protected]{1} 

그럼 당신은 당신이 직접 커밋 기준으로 [email protected]{0}을 사용할 수 있습니다

git stash apply [email protected]{1} 
+0

감사 할 그러나 이것은 내 질문에 대답하지 않는 것을 결정한다. 나는 은닉의 내용을보고 그것을 전세계에 적용하는 방법을 알고있었습니다. 나는 숨은 꼬리표의 일부 적용을 찾고 있었는데, @LeGEC 대답 – clemlaflemme

3

를 사용하여 적용 할 수 있습니다.

git checkout [email protected]{0} -- file1 file2 file3 

을하고 당신이 원하는 것을 유지하기 위해 수동은 diff를 검사 : 당신의 작업 트리가 깨끗하고 (더 수정 된 파일)가없는 경우

, 당신은 당신이 원하는 파일을 체크 아웃 할 수 있습니다. 당신이 git stash apply의 동작에 가까운 무언가를 원하는 경우에


, 당신은 그것을 패치를 작성하고 적용 할 수 있습니다

git show -p [email protected]{0} -- file1 file2 file3 | git apply - 

[email protected]{0}에 수정 된 파일을 나열하려면 [편집] :

git diff --name-only [email protected]{0}^ [email protected]{0} 

하나만 제외하고 모든 파일을 가져 오려면 :

git show -p [email protected]{0} -- $(git diff --name-only [email protected]{0}^ [email protected]{0} |\ 
          grep -v "thefile") 
+0

git이 놀랍습니다. 이 기능은 훌륭하지만 스태시를 수정하지 않습니다. 하나의 파일을 제외한 모든 파일을 적용하려면 모든 파일을 나열해야합니다. 반대 명령이 있습니까? – clemlaflemme

+0

'git show -p stash @ {0}을 (를) 만들 수 없습니다 - file1 file2 file3 | git apply - '작동하지 않으면'error : unrecognized input '이 발생합니다. git apply -' – clemlaflemme

+0

"작동합니다":'git show -p ...> patch && git apply patch'가 작동한다는 것을 의미합니까? – LeGEC

1

이 질문의 까다로운 부분은 마치 숨겨진 꼬리표가 완성 될 때처럼 보이게하려는 것입니다. 이러한 명령이 제거

git stash pop 
# maybe a 'git reset head' if the index was changed 
git checkout -- file.with.unwanted.changes.in.stash 

그러나 : git stash {pop|apply}은 (때로는 인덱스) 작업 트리에 영향을 미치는 때문에, 선택적으로 숨겨 놓은에서 변경을 충분히 쉽게 (수 있도록 충분한 나는 처음에 문제를 생각하고 오버라고 생각) 완전히 은닉 물; 대조적으로 pop 대신에 git stash apply이라고 말하면 줄 바꿈은 변경되지 않습니다.숨겨진 꼬리표가 선택한 변경 사항을 그대로 유지하려는 것처럼 들립니다 (다시 적용해야 할 경우를 대비하여).

은 (난 당신이 정반대 싶어 시간이있을 수 있습니다 번갈아 가정 - 이러한 변화는 적용되지 않았다 숨김에서 떠날를, 그래서 그들은 나중에 적용 할 수 있습니다.)

그래서 단계를 복용 뒤로 : 은닉을 수정하는 데 관련된 것은 무엇입니까?

은닉은 실제로 2 ~ 3 개의 임시 커밋으로 구성됩니다. 특별 심판 stash은 이러한 커밋을 가리키며 여러 개의 숨김의 "스택"은 reflog를 사용하여 유지됩니다 (해킹 비트 일 수 있지만 일반적으로 효과적입니다).

숨김을 수정하려면 (커밋이 변경 불가능하기 때문에) 새로운 커밋을 만들고 그에 따라 stash ref 및 reflog를 재정렬해야합니다.

LeGEC이 언급 한 표기법이 작동하고 독서에 유연성을 더해 줄 수 있습니다. 그러나 reflog 사용이 비 숨겨진 참조와 동일하지 않기 때문에 을 작성하는 방법을 고안하기 위해이 사실을 활용하면 예기치 않은 결과가 발생할 수 있습니다. 결과가 끔찍하거나 예측/통제가 불가능할 것이라고 말하는 것이 아닙니다. 하지만 결국에는 당신이 피하는 것보다 더 복잡한 것을 만들 것이라고 생각합니다.

실제 문서화 된 git-stash 부속 명령에 자신을 한정하면 숨김이 다소 적습니다. stash를 만들 때 patch 모드로 스택에 넣을 작업 변경 사항을 선택할 수 있지만 pop/apply에 해당하는 기능은 없습니다. 당신은 당신이 분할 할 깨끗한 작업 트리와 은닉이있는 경우

, 당신은 같은 일을 시도 할 수 : 그래도, 그 뭔가 몇 가지 변경 사항을 적용

, 그리고 숨김에서 그 같은 변경 사항을 유지

git stash pop 
git stash -p 
# select the "good" changes 
git checkout -- . 
git stash apply 

몇 가지 변경 사항을 적용하고, 숨겨 놓은

git stash pop 
git stash -p 
# select the "unwanted" changes 
에 남아있는 변경 사항을 유지

분할 두 부분으로 숨겨 놓은, 나중에 그들과 함께

git stash pop 
git stash -p 
# select the "good" changes 
git stash 
# now the "good" changes are [email protected]{1} and the "unwanted" are [email protected]{0} 
+0

부수적 인 기술적 인 참고 사항 : 각 숨김은 항상 최소한 두 개의 커밋 (인덱스 상태 + 작업 트리 상태)이고 때로는 인덱스, 작업 트리 및 "추가"입니다. "git stash -u"또는 "git stash -a"에 "additional"부분이 숨겨져 있으며 "untracked-sans-ignored"또는 "untracked-ignored-ignored"파일 만 포함됩니다 (색인 및 작업과는 다릅니다. -tree는 추적 된 모든 파일을 저장합니다. – torek

+0

@torek - 허 ... 어떤 이유로 든 둘 중 하나가 비어 있으면 생략 될 것이라고 생각했습니다. 업데이트됩니다. 감사. –