Git으로 변경된 여러 파일 중 하나의 파일 만 보관 하시겠습니까?


3068

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


109
@bukzor의 승인 된 답변이 질문 된대로 정답이라고 생각하지 않습니다. git stash --keep-index색인을 유지하지만 색인과 색인 모두에서 모든 것을 숨 깁니다 .
Raman

@Antonio 원래 질문은 TortoiseGit과 관련이 없기 때문에 현상금이 실제로 별도의 질문이어야한다고 생각합니다.
JesusFreke

1
@JesusFreke Yep, 50 rep을 절약 할 수있는 결과를 감안할 때 :) 이것은 단지 "부분 숨김 별자리"를 검색하려고하면 리디렉션되는 질문입니다. Tortoisegit는 여기서 인기있는 주제가 아닌 것 같습니다. stackoverflow.com/questions/tagged/tortoisegit
Antonio

7
>>>>>>>>> git diff -- *filename* > ~/patch다음 git checkout -- *filename*과 나중에는 패치를 다시 적용 할 수 있습니다git apply ~/patch
neaumusic

36
아래의 기존 답변은 대부분 구식입니다. Git 2.13 (2017 년 2 분기)부터로 지원됩니다 git stash push [--] [<pathspec>...].
하드 슈나이더

답변:


1372

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


경고

의견에서 언급했듯이, 이것은 단계적이거나 비 단계적 인 모든 것을 숨김 상태로 만듭니다. --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

47
나는이 방법이 훨씬 더 간단 찾을 : stackoverflow.com/a/5506483/457268
k0pernikus

561
왜 이것이 반대인지 잘 모르겠습니다. 모두 나와는 다른 기대를 가져야합니다. 원래 게시물은 "커밋되지 않은 변경 사항 중 일부만 숨기려면 어떻게해야합니까?" 을 사용 git stash save -k하면 예 (녹색 git stat)이 유지되지만 전체 가 유지됩니다. 변경 세트 (녹색 및 빨강 모두)가 숨겨집니다. 이는 OP의 요청 인 "일부 변경 사항 만 저장"을 위반합니다. (나중에 사용하기 위해) 빨간색 중 일부만 숨기고 싶습니다.
Pistos

70
@Pistos가 제기 한 질문에 대한 답변에 더 관심이 있으시면 여기를보십시오 : stackoverflow.com/questions/5506339/…
Raman

27
@Raman : 훌륭합니다! git stash -p내가 찾던 것입니다. 이 스위치가 최근에 추가되었는지 궁금합니다.
Pistos

14
경고 : git stash --keep-index고장입니다. 더 많은 변경을 수행하면 git stash pop나중에 보관하지 않은 파일뿐만 아니라 보관 된 변경된 파일이 숨김에 포함되므로 병합 충돌이 발생합니다. 예를 들어 : 파일 A와 B를 변경 한 다음 A를 변경하여 테스트하려면 B를 숨 깁니다. A와 관련된 문제를 찾은 다음 수정했습니다. 나는 A를 저지른다. 이전 버전의 A가 병합 충돌로 인해 아무런 이유없이 숨겨져 있기 때문에 이제는 풀 수 없습니다. 실제로 A와 B는 많은 파일, 아마도 이진 이미지 또는 무언가 일 수 있으므로 기본적으로 B를 포기하고 잃어야합니다.
rjmunro

3015

당신은 또한 사용할 수 있습니다 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

5
아니었다. 사실로부터 약 7 년 후 Darcs에서 빌렸다.
nomen

6
저는 TortoiseGit 중독자입니다. 그러나 TortoiseGit은 지원하지 않습니다 stash -p. 이 답변은 대화 형 / 사용자 친화적 인 형태로 유지되므로이 답변에 수여합니다.
안토니오

27
다음을 추가 할 수도 있습니다. git stash save -p my stash message; 논쟁의 순서는 매우 직관적이지 않기 때문에 ...
Chris Maes

15
이와 사이 git log -p에서 -p플래그는 "원하는 멋진 일을하지만 표현하는 방법을 모른다"를 의미해야한다고 생각합니다 .
Kyle Strand

2
왜 지구상에서이 위대한 답이 12 위에 있는가? 모든 0, +1, +2 답변 후에 ??????
DenisFLASH

547

git은 기본적으로 모든 리포지토리 컨텐츠 및 인덱스 (하나 또는 여러 개의 파일이 아닌) 를 관리하는 것이므로git stash ,모든 작업 디렉토리와 함께.

실제로 Git 2.13 (Q2 2017)부터 다음을 사용하여 개별 파일을 숨길 수 있습니다 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와 작업 트리 사이의 차이점에서 대화식으로 덩어리를 선택할 수 있습니다.
숨김 항목은 색인 상태가 저장소의 색인 상태와 동일하도록 구성되며 작업 트리에는 대화식으로 선택한 변경 사항 만 포함됩니다. 선택한 변경 사항이 작업 트리에서 롤백됩니다.

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

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

더 잘 맞을 수도 있습니다.


경우 --patch, 수동 프로세스의 힘을 작동하지 않습니다

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

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

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


3
이것은 훌륭하지만 종종 많은 파일을 수정하여 패치를 사용하는 것이 성가신 일입니다
Casebash

6
@VonC : 답변 당 하나의 답변 만있는 것이 좋습니다. 또한 다른 사람의 답변을 자신의 것으로 복사하여 붙여 넣는 것은 나쁜 방법입니다.
bukzor

3
@ bukzor : 편집 된 답변이 부적절하게 보이면 미안합니다. 내 유일한 의도는 귀하의 답변에 더 많은 가시성을 제공하는 것이 었습니다. 그 의도를 명확하게하기 위해 게시물을 다시 편집했습니다.
VonC

1
@ 칼 : 사실, stackoverflow.com/a/13941132/6309 제안 git reset(혼합)
VonC

3
git is fundamentally about managing a all repository content and index and not one or several files-해결중인 문제를 어둡게 구현 한 구현입니다. 그것은 설명이지만 정당화는 아닙니다. 모든 소스 제어 시스템은 "여러 파일 관리"에 관한 것입니다. 어떤 의견이 가장 많이지지되는지보십시오.
Victor Sergienko

90

git stash -p(또는 git add -pstash --keep-index너무 성가신 것), 나는 그것을 쉽게 사용하는 것으로 diff, checkoutapply :

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

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

그런 다음

git apply stashed.diff

1
git add -p위의 답변에서 언급 한 흥미로운 대안 입니다. +1.
VonC

11
PNG와 같은 이진 파일이 있으면 diff 파일로 출력되지 않습니다. 따라서 이것은 100 % 솔루션이 아닙니다.
void.pointer

1
@RobertDailey로 : 그것은 나에게 흥미로운 점은,의 git diff > file.diffgit apply평소 부분 은닉 도구이다. git stash -p더 큰 변경 세트로 전환해야 할 수도 있습니다 .
thekingoftruth

1
@thekingoftruth 저는 여기에 패치 파일을 만드는 데 사용하는 별명이며, 수행 지원 바이너리 : patch = log --pretty=email --patch-with-stat --reverse --full-index --binary. 그러나 패치를 커밋하려면 변경 사항이 필요합니다.
void.pointer

2
숨김 파일이 다음과 같은 경우이 기능이 제대로 작동하지 않았습니다 ../../foo/bar.txt. 패치는 OK를 생성하지만 패치를 적용하려면 리포지토리 루트로 이동해야합니다. 따라서이 문제가 발생하면 저장소 루트 디렉토리에서 수행해야합니다.
Michael Anderson

86

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

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

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

git stash push -- my/file.sh

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


1
그러나 지난 3 월, 5 개월 전의 답변git stash push 에서 이미 언급 한 바 있습니다. 그리고 새로운 Git 2.13 명령에 대해 자세히 설명했습니다 : stackoverflow.com/a/42963606/6309 .
VonC

나는 Git이 너무 빨리 발전해 왔기 때문에 오랫동안 이것이 불가능했으며 2.13이 출시되고 갑자기 간단한 해결책이 있습니다!
sandstrom

1
@VonC 당신이 맞아, 당신은 또한 정답을 언급하지만, 두 대답 사이에, 이것은 하나 더 읽기 쉽습니다 (혼동하는 텍스트가 없으며 예제도 있습니다). 어쩌면 그들은 대신 답을 편집했을 것입니다
Utopik

@Utopik 당신은 "당신이 맞아"에 나를 가지고 있었지만 ... 예, 예를 포함하도록 내 대답을 편집했습니다.
VonC

그러면 git stash apply숨김 변경 사항을 복구하는 데 사용됩니까 ?
차드

49

3 개의 파일이 있다고 가정 해 봅시다

a.rb
b.rb
c.rb

b.rb와 c.rb 만 숨기고 a.rb는 숨기고 싶습니다.

당신은 이런 식으로 할 수 있습니다

# commit the files temporarily you don't want to stash
git add a.rb
git commit -m "temp" 

# then stash the other files
git stash save "stash message"

# then undo the previous temp commit
git reset --soft HEAD^
git reset

그리고 당신은 끝났습니다! HTH.


29

이를 수행하는 다른 방법 :

# Save everything
git stash 

# Re-apply everything, but keep the stash
git stash apply

git checkout <"files you don't want in your stash">

# Save only the things you wanted saved
git stash

# Re-apply the original state and drop it from your stash
git stash apply stash@{1}
git stash drop stash@{1}

git checkout <"files you put in your stash">

나는이 페이지에 와서 처음 두 가지 답변을 좋아하지 않은 후에 이것을 생각해 냈습니다 (첫 번째 답변은 질문에 대답하지 않고 -p대화 형 모드로 작업하는 것을 좋아하지 않았습니다 ).

아이디어는 @VonC가 저장소 외부의 파일을 사용하여 제안한 것과 동일합니다. 원하는 곳에서 변경 사항을 저장하고 숨김 상태에서 원하지 않는 변경 사항을 제거한 다음 변경 한 변경 사항을 다시 적용하십시오. 그러나, git stash를 "어딘가"로 사용했습니다. 결과적으로, 끝에 추가 단계가 있습니다 : 당신은 stash에 넣은 cahnge를 제거합니다.


1
나는이 접근법을 가장 선호합니다. stash 및 revert 명령 만 사용하여 Tortoisegit의 쉬운 워크 플로를 제공합니다.
Mark Ch

위치를 사용하여 SO에 대한 답변을 참조하는 것은 좋지 않습니다. 등급이 변경되면 위치가 변경됩니다.
Bryan Ash

2
@BryanAsh 글쎄, 여기가 중요하지 않습니다. 나는 다른 답변을 실제로 말하는 것이 아니라 일화를주고 있습니다. 메시지는 커뮤니티가 좋아하는 답변이 마음에 들지 않았으며 이러한 답변에 실제로 포함 된 내용이 아니라는 것입니다. 또한 두 번째와 세 번째 답변 사이의 900 투표 차이로 인해 가까운 시일 내에 변경 될 가능성이 거의 없으며 언제라도 변경되어야 할 경우 항상 "당시 답변의 최고"라고 말하도록 편집 할 수 있습니다. 실제로, 나는이 상황에서 이것이 어떤 종류의 문제인지 알지 못합니다.
재스퍼

23

업데이트 (2015 년 2 월 14 일)-충돌 상황을보다 잘 처리하기 위해 스크립트를 약간 다시 작성했습니다. 이는 .rej 파일이 아닌 병합되지 않은 충돌로 표시되어야합니다.


@bukzor의 접근 방식을 반대하는 것이 더 직관적이라는 것을 종종 알았습니다. 즉, 일부 변경 사항을 준비한 다음 단계적 변경 사항 만 숨 깁니다.

불행히도 git은 git stash --only-index 또는 이와 유사한 것을 제공하지 않으므로이 작업을 수행하는 스크립트를 작성했습니다.

#!/bin/sh

# first, go to the root of the git repo
cd `git rev-parse --show-toplevel`

# create a commit with only the stuff in staging
INDEXTREE=`git write-tree`
INDEXCOMMIT=`echo "" | git commit-tree $INDEXTREE -p HEAD`

# create a child commit with the changes in the working tree
git add -A
WORKINGTREE=`git write-tree`
WORKINGCOMMIT=`echo "" | git commit-tree $WORKINGTREE -p $INDEXCOMMIT`

# get back to a clean state with no changes, staged or otherwise
git reset -q --hard

# Cherry-pick the index changes back to the index, and stash.
# This cherry-pick is guaranteed to succeed
git cherry-pick -n $INDEXCOMMIT
git stash

# Now cherry-pick the working tree changes. This cherry-pick may fail
# due to conflicts
git cherry-pick -n $WORKINGCOMMIT

CONFLICTS=`git ls-files -u`
if test -z "$CONFLICTS"; then
    # If there are no conflicts, it's safe to reset, so that
    # any previously unstaged changes remain unstaged
    #
    # However, if there are conflicts, then we don't want to reset the files
    # and lose the merge/conflict info.
    git reset -q
fi

위의 스크립트를 git-stash-index경로의 어딘가에 저장 한 다음 git stash-index로 호출 할 수 있습니다

# <hack hack hack>
git add <files that you want to stash>
git stash-index

이제 숨김에는 준비한 변경 사항 만 포함하는 새 항목이 포함되어 있으며 작업 트리에는 아직 준비되지 않은 변경 사항이 포함되어 있습니다.

경우에 따라 작업 트리 변경 사항이 인덱스 변경 사항에 따라 달라질 수 있으므로 인덱스 변경 사항을 숨기면 작업 트리 변경 내용이 충돌합니다. 이 경우 git merge / git mergetool / etc로 해결할 수있는 일반적인 병합되지 않은 충돌이 발생합니다.


스크립트 pushd대신 cdpopd끝에 권장 하므로 스크립트가 성공하면 사용자는 스크립트를 실행하기 전과 동일한 디렉토리에있게됩니다.
Nate

1
@ Nate : 내가 아는 한, 사용자가 스크립트를 소싱 한 경우에만 디렉토리를 변경해야합니다. 스크립트를 정상적으로 실행 (~ / bin / git-stash-index)하거나 git (git stash-index)를 통해 실행하면 별도의 터미널 세션에서 실행되며 해당 세션의 작업 디렉토리 변경 사항은 사용자 터미널 세션의 작업 디렉토리. 이것이 사실이 아닌 일반적인 사용 사례를 알고 있습니까? ( "공통"으로 간주하지 않는 대본 소싱 이외)
JesusFreke

20

숨김 변경 사항이있는 메시지를 지정하지 않으려면 파일 이름을 이중 대시 뒤에 전달하십시오.

$ git stash -- filename.ext

추적되지 않은 / 새 파일 인 경우 먼저 준비해야합니다.

이 방법은 자식 버전 2.13 이상에서 작동합니다


그 대답은 장황하고 간결합니다. 누군가에게 도움이된다면 떠나겠습니다. 이 페이지에 아무도이 구문과 결과를 언급하지 않습니다. 대신`git stash push`를 언급합니다.
sealocal

이것이 내가 찾던 대답입니다. 감사! +1
nicodp

19

Git에서 브랜치를 생성하는 것은 쉽지 않기 때문에 임시 브랜치를 생성하고 개별 파일을 확인할 수 있습니다.


2
비 단계적 편집으로 분기를 만들 수 없습니다. 모든 편집 내용을 새 브랜치 (스 태쉬 / 스 태쉬 팝)로 쉽게 옮길 수 있지만 다시 정사각형으로 돌아갑니다.
bukzor

7
로컬로 변경 한 경우 지점을 전환 할 수 없습니다 . 그러나 새 브랜치를 만들고 선택적으로 파일을 추가 / 커밋 한 다음 다른 브랜치를 만들고 동일한 재귀 적으로 동일한 작업을 수행 한 다음 원래 브랜치를 체크 아웃하고 선택적으로 다시 병합 할 수 있습니다. 본질적으로 피처 브랜치를 생성하므로 실제로 작업을 수행하는 자연스러운 방법으로 보입니다.
iain

3
@iain은 병합이 필요하지 않은 한 로컬 변경 사항이 있으면 분기를 전환 할 수 있습니다. 예제 예제를 참조하십시오 . 이것은 적어도 Git v2.7.0부터 적용됩니다.
콜린 D 베넷

18

당신은 단순히 이것을 할 수 있습니다 :

git stash push "filename"

또는 선택적인 메시지와 함께

git stash push -m "Some message" "filename"

1
이것은 새로운 것을 추가하지 않습니다. 망할 놈의 숨겨 놓은 푸시는 이미 여러 답변에서 언급 한
JesusFreke

12

다음 코드를 파일에 저장하십시오 (예 : named) stash. 사용법은 stash <filename_regex>입니다. 인수는 파일의 전체 경로에 대한 정규식입니다. 예를 들어, A / B / c.txt 감춰,하기 stash a/b/c.txt또는 stash .*/c.txt등등

$ chmod +x stash
$ stash .*.xml
$ stash xyz.xml

파일로 복사 할 코드 :

#! /usr/bin/expect --
log_user 0
set filename_regexp [lindex $argv 0]

spawn git stash -p

for {} 1 {} {
  expect {
    -re "diff --git a/($filename_regexp) " {
      set filename $expect_out(1,string)
    }
    "diff --git a/" {
      set filename ""
    }
    "Stash this hunk " {
      if {$filename == ""} {
        send "n\n"
      } else {
        send "a\n"
        send_user "$filename\n"
      }
    }
    "Stash deletion " {
      send "n\n"
    }
    eof {
      exit
    }
  }
}

2
좋은 방법입니다. 나는 이것을 대답으로 선택했을 것입니다. 미래 독자를위한 팁 : 전체 경로에서 일치해야합니다. 예 : stash subdir / foo.c
er0

12

실제로 사용할 때마다 변경 사항을 버리고 실제로 git stashgit stash를 사용하여 일시적으로 숨기지 않는 경우를 대비하여 사용할 수 있습니다.

git checkout -- <file>

[ 참고 ]

이는 git stash분기 및 작업에 대한 빠르고 간단한 대안입니다.


8

파일을 Git 저장소 외부로 복사하는 VonC의 '중간'솔루션의 문제점은 경로 정보를 잃어 나중에 여러 번의 파일 복사가 번거 롭다는 것입니다.

복사 대신 tar를 사용하는 것이 더 쉽다는 것을 발견하십시오 (유사한 도구가 가능할 것입니다).

  • tar cvf /tmp/stash.tar 경로 / to / some / file 경로 / to / some / other / file (... 등)
  • git checkout path / to / some / file path / to / some / other / file
  • 자식 숨김
  • 타르 xvf /tmp/stash.tar
  • 등 (VonC의 '중간'제안 참조)

checkout -f필요하지 않습니다 checkout(없이 -f) 충분합니다. 답변을 업데이트했습니다.
eleotlecram

8

때로는 커밋하기 전에 지점에서 관련이없는 변경 작업을 수행 한 후 다른 지점으로 이동하여 별도로 커밋하려고합니다 (마스터 등). 나는 이것을한다:

git stash
git checkout master
git stash pop
git add <files that you want to commit>
git commit -m 'Minor feature'
git stash
git checkout topic1
git stash pop
...<resume work>...

첫 번째 stash& stash pop제거 할 수 있습니다, 모든 변경 사항을master 있습니다. 체크 아웃 할 때 충돌이없는 경우에만 지점으로 가져올 수 있습니다. 또한 부분 변경에 대한 새 분기를 작성하는 경우 숨김이 필요합니다.

충돌이없고 새로운 지점이 없다고 가정하여 단순화 할 수 있습니다.

git checkout master
git add <files that you want to commit>
git commit -m 'Minor feature'
git checkout topic1
...<resume work>...

보관하지 않아도 ...


8

이 작업은 SourceTree를 사용하여 3 단계로 쉽게 수행 할 수 있습니다.

  1. 숨기고 싶지 않은 모든 것을 일시적으로 커밋하십시오.
  2. 힘내 다른 모든 것을 추가하고 숨겨.
  3. git reset을 실행하여 임시 커밋을 팝하고 임시 커밋보다 커밋을 타겟팅하십시오.

이 작업은 SourceTree에서 몇 초 만에 완료 할 수 있습니다. 여기서 추가하려는 파일 (또는 개별 행)을 클릭하면됩니다. 일단 추가되면 임시 커밋에 커밋하십시오. 그런 다음 확인란을 클릭하여 모든 변경 사항을 추가 한 다음 숨김을 클릭하여 모든 것을 숨 깁니다. 스 태쉬 변경이 중단되면 커밋 목록을 살펴보고 임시 커밋 전에 커밋에 대한 해시를 확인한 다음 'git reset hash_b4_temp_commit'을 실행하십시오. 바로 직전. 이제, 당신은 당신이 숨기고 싶지 않은 것들만 남았습니다.


8

사용 git stash save --patch합니다. 전체 파일에 원하는 작업을 적용하는 옵션이 있기 때문에 대화 형 작업이 성 가시지 않습니다.


3
이 답변에 대한 지원이 거의 없다는 것에 놀란 것은 에세이가 필요없는 최상의 솔루션입니다.
robstarbuck

확실히 좋은 대답 git stash -p은 전체 파일을 빠르게 숨기고 나중에 끝내는 것을 허용합니다.
Richard Dally

7

여기에있는 모든 대답은 너무 복잡합니다 ...

"스 태쉬"하는 것은 어떻습니까 :

git diff /dir/to/file/file_to_stash > /tmp/stash.patch
git checkout -- /dir/to/file/file_to_stash

파일 변경을 다시 표시하려면 다음을 수행하십시오.

git apply /tmp/stash.patch

하나의 파일을 숨기고 다시 팝업하는 것과 동일한 동작을합니다.


나는 그것을 시도했지만 아무 일도 일어나지 않았다. 내가 git apply오류가 없지만 변경 사항이 다시 나타나지 않을 때
ClementWalter

/ tmp에서 생성 한 패치 파일이 삭제되었을 수 있습니다. 차이점과 적용 사이에서 재부팅했을 수 있습니다. 더 영구적 인 다른 장소를 시도하십시오. 작동합니다. 패치 파일의 내용도 확인하십시오.
Christophe Fondacci

4

이에 대한 답변과 의견 및 유사한 스레드를 검토했습니다. 특정 추적 / 추적되지 않은 파일 을 숨길 수 있도록 다음 명령 중 올바른 명령은 없습니다 .

  • git stash -p (--patch): 추적되지 않은 파일을 제외하고 수동으로 덩어리를 선택합니다
  • git stash -k (--keep-index): 모든 추적 / 추적되지 않은 파일을 숨기고 작업 디렉토리에 보관하십시오.
  • git stash -u (--include-untracked): 모든 추적 / 추적되지 않은 파일을 숨 깁니다.
  • git stash -p (--patch) -u (--include-untracked): 잘못된 명령

현재 특정 추적 / 추적되지 않은 파일을 숨길 수있는 가장 합리적인 방법은 다음과 같습니다.

  • 숨기고 싶지 않은 파일을 임시 커밋
  • 추가 및 숨김
  • 임시 커밋 팝

나는 또 다른 질문에 대한 답변이 절차에 대한 간단한 스크립트를 작성 하고, 거기에 여기 SourceTree의 절차를 수행하는 단계 .


4

해결책

지역 변경 :

  • file_A (수정) 스테이지되지 않음
  • file_B (수정) 스테이지되지 않음
  • file_C (수정) 스테이지되지 않음

file_C의 변경 사항 만 포함하여 숨김 "my_stash"를 작성하려면 다음 을 수행하십시오 .

1. git add file_C
2. git stash save --keep-index temp_stash
3. git stash save my_stash
4. git stash pop stash@#{1}

끝난.


설명

  1. 스테이징 영역 에 file_C 추가
  2. "temp_stash"라는 임시 숨김을 작성하고 file_C의 변경 사항을 유지하십시오.
  3. file_C의 변경 사항만으로 원하는 숨김 ( "my_stash")을 작성하십시오.
  4. 로컬 코드에서 "temp_stash"(file_A 및 file_B)의 변경 사항을 적용하고 숨김을 삭제하십시오.

단계 사이에 git status 를 사용하여 진행 상황을 확인할 수 있습니다 .


3

두 분기간에 전환하려고하면이 상황이 발생합니다.

" git add filepath"를 사용하여 파일을 추가하십시오 .

나중에이 줄을 실행

git stash --keep-index


3

단일 파일을 숨기려면을 사용하십시오 git stash --patch [file].

프롬프트가 표시 Stash this hunk [y,n,q,a,d,j,J,g,/,e,?]? ?됩니다.. 입력하십시오 a(이 덩어리와 이후의 모든 덩어리를 파일에 저장하십시오).


push에서와 같이 누락git stash push --patch [file]
Filipe Esperandio

@FilipeEsperandio push이전 버전 의 Git 에서만 작동 합니다 save. 어느 쪽이든 push또는 save다음을 호출함으로써 암시된다 stash: "인수없이 git stash를 호출하는 것은 git stash push와 같다", docs
patrick

2

비슷한 상황. 커밋하고 그것이 좋지 않다는 것을 깨달았습니다.

git commit -a -m "message"
git log -p

답변을 바탕으로 도움이되었습니다.

# revert to previous state, keeping the files changed
git reset HEAD~
#make sure it's ok
git diff
git status
#revert the file we don't want to be within the commit
git checkout specs/nagios/nagios.spec
#make sure it's ok
git status
git diff
#now go ahead with commit
git commit -a -m "same|new message"
#eventually push tu remote
git push

2

이 상황에서는 I git add -p(대화식) git commit -m blah를 누른 다음 필요한 경우 남은 내용을 숨 깁니다.


2

명령 줄에서 SourceTree 만 사용하는 방법을 모르겠습니다. 파일 A를 변경했고 파일 B에 두 개의 변경 덩어리가 있다고 가정합시다. 파일 B의 두 번째 덩어리 만 숨기고 나머지는 그대로 두려면 다음과 같이하십시오.

  1. 모든 것을 무대
  2. 파일 A의 모든 변경 사항을 취소하는 작업 복사본을 변경합니다 (예 : 외부 diff 도구를 시작하고 파일을 일치시킵니다).
  3. 파일 B에 두 번째 변경 만 적용되는 것처럼 보이게합니다. (예 : 외부 diff 도구를 시작하고 첫 번째 변경을 취소하십시오.)
  4. "단계적 변경 사항 유지"를 사용하여 숨김을 작성하십시오.
  5. 모든 것을 무대에서
  6. 끝난!

2
git add .                           //stage all the files
git reset <pathToFileWillBeStashed> //unstage file which will be stashed
git stash                           //stash the file(s)
git reset .                         // unstage all staged files
git stash pop                       // unstash file(s)

1
글쎄, 당신은 그렇게해서는 안됩니다. 답변 질문에 대한 솔루션을 제공해야한다. 당신은 당신의 자신의 질문을 할 수 있습니다.
L_J

이 솔루션은이 질문에 대한 가장 쉬운 답변 중 하나입니다. 질문을 읽고 모든 답변을 비교 한 다음이 답변이 해당 솔루션에 대한 해결책이나 질문에 대한 정보가 충분하지 않다고 의심되는 경우 다시 대화 할 수 있습니다.
celikz

세 번째 명령 인 "git stash"는 준비된 파일을 따르지 않으므로 작동하지 않습니다. 준비된 파일과 준비되지 않은 파일은 모두 숨김 상태가됩니다. 질문은 구체적으로 하나의 파일 만
숨기는

0

복잡한 방법 중 하나는 먼저 모든 것을 커밋하는 것입니다.

git add -u
git commit // creates commit with sha-1 A

원래 커밋으로 다시 재설정하지만 새 커밋에서 _one_file을 체크 아웃하십시오.

git reset --hard HEAD^
git checkout A path/to/the_one_file

이제 the_one_file을 숨길 수 있습니다.

git stash

원래 커밋으로 다시 재설정하면서 파일 시스템에 커밋 된 내용을 저장하여 정리하십시오.

git reset --hard A
git reset --soft HEAD^

예, 다소 어색합니다 ...


0

나는 내가 필요한 것으로 대답하지 않았으며 다음과 같이 쉽습니다.

git add -A
git reset HEAD fileThatYouWantToStash
git commit -m "committing all but one file"
git stash

이것은 정확히 하나의 파일을 숨 깁니다.


0

빠른 답변


git에서 변경된 특정 파일을 되돌리려면 다음 줄을 수행하십시오.

git checkout <branch-name> -- <file-path>

실제 예는 다음과 같습니다.

git checkout master -- battery_monitoring/msg_passing.py


0

변경된 파일을 숨기려면 간단히

숨기고 싶지 않은 파일을 Stage 에서 추가 한 다음 실행하십시오.git stash save --keep-index

스테이지되지 않은 모든 변경된 파일을 숨겨줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.