Git으로 변경된 여러 파일 중 하나의 파일 만 보관

git git-stash


지점에서 여러 개의 변경된 파일 중 하나만 숨기려면 어떻게해야합니까?




Answer 1 bukzor


면책 조항 : 다음 답변은 자식 2.13 이전의 자식에 대한 것입니다. git 2.13 이상에서는 아래 에서 다른 답변을 확인하십시오 .


Warning

의견에서 언급했듯이, 이것은 단계적이거나 비 단계적 인 모든 것을 숨김 상태로 만듭니다. --keep-index는 숨김이 완료된 후에 만 ​​색인을 그대로 둡니다. 나중에 숨김을 표시 할 때 병합 충돌이 발생할 수 있습니다.


이전에 추가하지 않은 모든 내용이 숨겨집니다. 그냥 git add 유지하려는 일을, 다음을 실행합니다.

git stash --keep-index

예를 들어 이전 커밋을 둘 이상의 변경 세트로 분할하려는 경우 다음 절차를 사용할 수 있습니다.

  1. git rebase -i <last good commit>
  2. 일부 변경 사항을 edit 로 표시하십시오 .
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. 필요에 따라 문제를 해결하십시오. git add 변경 사항을 잊지 마십시오 .
  7. git commit
  8. git stash pop
  9. 필요에 따라 # 5부터 반복하십시오.
  10. git rebase --continue



Answer 2 konrad.kruczynski


git stash save -p "my commit message" 를 사용할 수도 있습니다 . 이 방법으로 숨김에 추가 할 덩어리를 선택할 수 있으며 전체 파일도 선택할 수 있습니다.

각 덩어리에 대해 몇 가지 조치가 프롬프트됩니다.

   y - stash this hunk
   n - do not stash this hunk
   q - quit; do not stash this hunk or any of the remaining ones
   a - stash this hunk and all later hunks in the file
   d - do not stash this hunk or any of the later hunks in the file
   g - select a hunk to go to
   / - search for a hunk matching the given regex
   j - leave this hunk undecided, see next undecided hunk
   J - leave this hunk undecided, see next hunk
   k - leave this hunk undecided, see previous undecided hunk
   K - leave this hunk undecided, see previous hunk
   s - split the current hunk into smaller hunks
   e - manually edit the current hunk
   ? - print help



Answer 3 VonC


Since git is fundamentally about managing a all repository content and index (and not one or several files), git stash deals, not surprisingly, with the all working directory.

Actually, since Git 2.13 (Q2 2017), you can stash individual files, with git stash push:

git stash push [--] [<pathspec>...]

pathspec 이 '주어집니다 git stash push ', 새로운 마리화나는 페이지의 "pathspec 일치하는 파일의 수정 상태를 기록 은닉 특정 파일을 변경 이상을".

단순화 된 예 :

 git stash push path/to/file

이 기능 의 테스트 사례 에는 몇 가지 옵션이 더 있습니다.

test_expect_success 'stash with multiple pathspec arguments' '
    >foo &&
    >bar &&
    >extra &&
    git add foo bar extra &&

    git stash push -- foo bar &&   

    test_path_is_missing bar &&
    test_path_is_missing foo &&
    test_path_is_file extra &&

    git stash pop &&
    test_path_is_file foo &&
    test_path_is_file bar &&
    test_path_is_file extra

원래 답변 (2010 년 6 월 미만)은 숨기려는 항목을 수동으로 선택하는 것에 관한 것이 었습니다.

Casebash 의견 :

이것은 (스 stash --patch 원래 솔루션) 훌륭하지만 종종 많은 파일을 수정 했으므로 패치를 사용하는 것이 성가시다

bukzor답변 (2011 년 11 월 공고 )은 다음을 기반으로보다 실용적인 솔루션을 제안합니다.
git add + git stash --keep-index 입니다.
가서 그의 대답을 찬성하라. (나 대신에) 공식 답변이어야한다.

이 옵션에 대해 chhh 는 주석에서 대체 워크 플로우를 지적합니다.

이러한 숨김 상태 후에 " git reset --soft "를 사용하여 명확한 스테이징을 다시 수행해야합니다.
명확한 스테이징 영역이고 일부 비 단계적 수정 만있는 원래 상태에 도달하기 위해 인덱스를 부드럽게 재설정하여 얻을 수 있습니다 (bukzor-처럼 수행하지 않음).


(원래 답변 2010 년 6 월 : 수동 숨김)

그러나 git stash save --patch 를 사용하면 다음과 같은 부분 숨김을 얻을 수 있습니다.

--patch , 대화 형 HEAD와 작업 트리 사이의 DIFF에서에서 심술쟁이를 선택하는 은닉한다.
숨김 항목은 색인 상태가 저장소의 색인 상태와 동일하도록 구성되며 작업 트리에는 대화식으로 선택한 변경 사항 만 포함됩니다. 선택한 변경 사항이 작업 트리에서 롤백됩니다.

그러나 전체 색인 (이미 색인화 된 다른 파일을 포함 할 수 있기 때문에 원하지 않을 수도 있음)과 부분 작업 트리 (저장하려는 파일처럼 보일 수 있음)를 저장합니다.

git stash --patch --no-keep-index

더 잘 맞을 수도 있습니다.


경우 --patch 은 하지 작업, 수동 프로세스의 세력을 수행합니다

하나 이상의 파일의 경우 중간 해결책은 다음과 같습니다.

  • Git 저장소 외부로 복사
    (실제로, eleotlecram흥미로운 대안을 제안합니다 )
  • git stash
  • 다시 복사
  • git stash # 이번에는 원하는 파일 만 숨겨집니다.
  • git stash pop stash@{1} # 모든 파일 수정 사항을 다시 적용하십시오
  • git checkout -- afile # 로컬 수정 전에 파일을 HEAD 컨텐츠로 재설정

다소 번거로운 프로세스가 끝나면 하나 또는 여러 개의 파일 만 보관됩니다.




Answer 4 blueyed


git stash -p (또는 git add -p 으로 stash --keep-index ) 너무 성가신 것, 내가 찾은이 쉽게 사용하는 diff , checkoutapply :

특정 파일 / 디렉토리 만 "스 태쉬"하려면 :

git diff path/to/dir > stashed.diff
git checkout path/to/dir

그런 다음

git apply stashed.diff



Answer 5 sandstrom


다음 과 같이 git stash push 를 사용하십시오 .

git stash push [--] [<pathspec>...]

예를 들면 다음과 같습니다.

git stash push -- my/file.sh

2017 년 봄에 출시 된 Git 2.13부터 사용할 수 있습니다.