내 분기에 변경된 여러 파일 중 하나만 숨기려면 어떻게 해야 합니까?
질문자 :Rachel
git stash push -p -m "my commit message"
-p
숨겨야 할 덩어리를 선택하자. 전체 파일도 선택할 수 있습니다.
각 덩어리에 대해 몇 가지 작업을 수행하라는 메시지가 표시됩니다.
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
konrad.kruczynski
면책 조항 : 다음 답변은 git 2.13 이전의 git에 대한 것입니다. git 2.13 이상의 경우 아래에서 다른 답변을 확인하십시오.
경고
주석에서 언급했듯이 이것은 스테이징된 것과 스테이징되지 않은 모든 것을 숨김에 넣습니다. --keep-index는 숨김이 완료된 후 인덱스를 그대로 둡니다. 이것은 나중에 숨김을 팝할 때 병합 충돌을 일으킬 수 있습니다.
이렇게 하면 이전에 추가하지 않은 모든 항목이 숨겨집니다. git add
한 다음 실행하기만 하면 됩니다.
git stash --keep-index
예를 들어, 오래된 커밋을 둘 이상의 변경 집합으로 분할하려면 다음 절차를 사용할 수 있습니다.
-
git rebase -i <last good commit>
- 일부 변경 사항을
edit
. -
git reset HEAD^
-
git add <files you want to keep in this change>
-
git stash --keep-index
- 필요에 따라 문제를 수정하십시오. 변경 사항
git add
하는 것을 잊지 마십시오. -
git commit
-
git stash pop
- 필요에 따라 5번부터 반복합니다.
-
git rebase --continue
bukzor
Git 2.13(2017년 2분기)부터 git stash push
하여 개별 파일을 숨길 수 있습니다.
git stash push [-m <message>] [--] [<pathspec>...]
pathspec
이 'git stash push
'에 지정되면 새 stash는 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
"해야합니다.
명확한 준비 영역이고 일부 선택되지 않은 수정만 있으면 원래 상태에 도달하기 위해 인덱스를 부드럽게 재설정하여 얻을 수 있습니다(당신과 같은 것을 커밋하지 않고).
(원래 답변 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 내용으로 재설정합니다.
다소 번거로운 프로세스가 끝나면 하나 또는 여러 개의 파일만 숨길 수 있습니다.
VonC
다음과 같이 git stash push
사용하십시오.
git stash push [--] [<pathspec>...]
예를 들어:
git stash push -- my/file.sh
이것은 2017년 봄에 릴리스된 Git 2.13부터 사용할 수 있습니다.
sandstrom
git stash -p
(또는 git add -p
with stash --keep-index
diff
, checkout
및 apply
를 사용하는 것이 더 쉽다는 것을 알았습니다.
특정 파일/디렉토리만 "숨김"하려면:
git diff path/to/dir > stashed.diff git checkout path/to/dir
그 후
git apply stashed.diff
blueyed
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.
venkatareddy
숨긴 변경 사항이 있는 메시지를 지정하지 않으려면 이중 대시 뒤에 파일 이름을 전달하십시오.
$ git stash -- filename.ext
추적되지 않은/새 파일인 경우 먼저 준비해야 합니다.
이 방법은 git 버전 2.13 이상에서 작동합니다.
sealocal
이 작업을 수행하는 또 다른 방법은 다음과 같습니다.
# 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를 제거하는 것입니다.
Jasper
간단하게 다음을 수행할 수 있습니다.
git stash push "filename"
또는 선택적 메시지와 함께
git stash push -m "Some message" "filename"
vinodsaluja
업데이트(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
이제 stash에는 스테이징한 변경 사항만 포함하는 새 항목이 포함되고 작업 트리에는 아직 스테이징되지 않은 변경 사항이 포함되어 있습니다.
경우에 따라 작업 트리 변경 사항은 인덱스 변경 사항에 따라 달라질 수 있으므로 인덱스 변경 사항을 숨길 때 작업 트리 변경 사항이 충돌합니다. 이 경우 git merge/git mergetool/etc로 해결할 수 있는 일반적인 병합되지 않은 충돌이 발생합니다.
JesusFreke
변경된 파일 중 일부만 숨기려면 Stage에 다른 파일을 추가하기만 하면 됩니다. 그런 다음 git stash push --keep-index
스테이징되지 않은 모든 변경된 파일을 숨깁니다.
Amin Shojaei
Git에서 분기를 만드는 것은 간단하기 때문에 임시 분기를 만들고 개별 파일을 확인하면 됩니다.
shangxiao
다음 코드를 파일(예: 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 } } }
apricot
git stash
를 사용할 때마다 실제로 변경 사항을 버리는 것을 의미하는 경우를 대비하여 (그리고 실제로 git stash를 사용하여 일시적으로 숨기지 마십시오), 이 경우 다음을 사용할 수 있습니다.
git checkout -- <file>
[ 참고 ]
git stash
는 분기 및 작업에 대한 더 빠르고 간단한 대안입니다.
Devesh
VonC의 Git 리포지토리 외부로 파일을 복사하는 '중간' 솔루션의 문제는 경로 정보가 손실되어 나중에 여러 파일을 다시 복사하는 것이 다소 번거롭다는 것입니다.
A 복사 대신 tar(비슷한 도구가 사용할 수 있음)를 사용하는 것이 더 쉽습니다.
- tar cvf /tmp/stash.tar 경로/to/some/file 경로/to/some/other/file (... 등)
- 자식 체크 아웃 경로/to/some/파일 경로/to/some/other/file
- 자식 숨김
- tar xvf /tmp/stash.tar
- 등 (VonC의 '중간' 제안 참조)
eleotlecram
때로는 커밋하기 전에 내 브랜치에서 관련 없는 변경을 수행했는데 다른 브랜치로 이동하고 별도로 커밋하고 싶습니다(예: 마스터). 나는 이것을한다:
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>...
은신처도 필요없다...
void.pointer
이것은 SourceTree를 사용하여 3단계로 쉽게 수행할 수 있습니다.
- 숨기고 싶지 않은 모든 것을 임시로 커밋합니다.
- Git은 다른 모든 것을 추가한 다음 숨깁니다.
- 임시 커밋보다 먼저 커밋을 대상으로 하는 git reset을 실행하여 임시 커밋을 팝합니다.
추가하려는 파일(또는 개별 라인)을 클릭하기만 하면 되는 SourceTree에서 이 모든 작업을 몇 초 만에 완료할 수 있습니다. 추가한 후에는 임시 커밋에 커밋합니다. 그런 다음 확인란을 클릭하여 모든 변경 사항을 추가한 다음 숨김을 클릭하여 모든 것을 숨깁니다. 숨긴 변경 사항을 제거하고 커밋 목록을 살펴보고 임시 커밋 전에 커밋에 대한 해시를 확인한 다음 'git reset hash_b4_temp_commit'을 실행합니다. 이는 기본적으로 분기를 다음으로 재설정하여 커밋을 "팝핑"하는 것과 같습니다. 그 직전에 커밋하십시오. 이제 숨기고 싶지 않은 물건만 남았습니다.
Triynko
git stash save --patch
합니다. 원하는 작업을 전체 파일에 적용할 수 있는 옵션이 있기 때문에 상호 작용이 성가시다고 생각하지 않습니다.
Raffi Khatchadourian
여기의 모든 대답은 너무 복잡합니다 ...
"stash"하려면 어떻게해야합니까?
git diff /dir/to/file/file_to_stash > /tmp/stash.patch git checkout -- /dir/to/file/file_to_stash
파일 변경 사항을 다시 팝업하려면 다음을 수행하십시오.
git apply /tmp/stash.patch
하나의 파일을 숨겼다가 다시 넣는 것과 똑같은 동작입니다.
Christophe Fondacci
나는 이에 대한 답변과 의견과 유사한 여러 스레드를 검토했습니다. 추적된/추적되지 않은 특정 파일 을 숨길 수 있도록 하기 위해 다음 명령 중 어느 것도 올바르지 않습니다.
-
git stash -p (--patch)
: 추적되지 않은 파일을 제외하고 수동으로 덩어리 선택 -
git stash -k (--keep-index)
: 모든 추적/비추적 파일을 숨기고 작업 디렉토리에 보관합니다. -
git stash -u (--include-untracked)
: 추적/추적되지 않은 모든 파일을 숨김 -
git stash -p (--patch) -u (--include-untracked)
: 잘못된 명령
현재 특정 추적/비추적 파일을 숨길 수 있는 가장 합리적인 방법은 다음과 같습니다.
- 숨기고 싶지 않은 파일을 임시로 커밋합니다.
- 추가 및 보관
- 임시 커밋 팝
다른 질문에 대한 답변으로 이 절차에 대한 간단한 스크립트를 작성했으며 여기 SourceTree에서 절차를 수행하는 단계가 있습니다 .
ZimbiX
해결책
로컬 변경 사항:
- 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}
완료.
설명
- 스테이징 영역에 file_C 추가
- "temp_stash"라는 임시 숨김을 만들고 file_C에 변경 사항을 유지하십시오.
- file_C의 변경 사항만 사용하여 원하는 숨김("my_stash")을 만듭니다.
- 로컬 코드에서 "temp_stash"(file_A 및 file_B)의 변경 사항을 적용하고 숨김을 삭제합니다.
단계 사이에 git status를 사용하여 진행 상황을 확인할 수 있습니다.
Alex 75
두 분기 간에 전환하려고 하면 이러한 상황이 발생합니다.
git add filepath
"를 사용하여 파일을 추가하십시오.
나중에 이 줄을 실행
git stash --keep-index
Sireesh Yarlagadda
단일 파일을 숨기려면 git stash --patch [file]
.
다음과 같은 메시지가 표시됩니다. Stash this hunk [y,n,q,a,d,j,J,g,/,e,?]? ?
. a
(이 덩어리와 이후의 모든 덩어리를 파일에 숨김)만 입력하면 문제가 해결됩니다.
vinibrsl
비슷한 상황입니다. 커밋하고 괜찮지 않다는 것을 깨달았습니다.
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
David Hrbáč
이 상황에서 나는 git add -p
(대화형), git commit -m blah
그리고 필요한 경우 남은 것을 숨깁니다.
J0hnG4lt
SourceTree만 사용하여 명령줄에서 수행하는 방법을 모르겠습니다. 파일 A를 변경했고 파일 B에 두 개의 변경 덩어리가 있다고 가정해 보겠습니다. 파일 B에 두 번째 덩어리만 숨기고 나머지는 그대로 두려면 다음과 같이 하십시오.
- 모든 것을 무대로
- 파일 A의 모든 변경 사항을 취소하는 작업 복사본을 변경합니다. (예: 외부 diff 도구를 실행하고 파일을 일치시키십시오.)
- 파일 B가 두 번째 변경 사항만 적용된 것처럼 보이게 합니다. (예: 외부 diff 도구를 실행하고 첫 번째 변경 사항을 실행 취소합니다.)
- "단계적 변경 사항 유지"를 사용하여 숨김을 만듭니다.
- 모든 것을 언스테이징
- 완료!
Juozas Kontvainis
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)
celikz
VS 코드 사용자용. Git 사이드바 보기에서 변경 그룹의 숨김 버튼은 그룹의 파일만 숨깁니다. 따라서 해당 그룹에서 일부 파일을 이동하면 나머지 파일을 숨길 수 있습니다. 변경 사항을 되돌리지 않고 일부 파일을 다른 곳으로 옮기는 유일한 방법은 파일을 준비하는 것입니다. 그래서:
- 숨기고 싶지 않은 파일 준비
- 변경 그룹 헤더에서 숨김 버튼을 클릭합니다.
- 이동한 파일의 스테이지 해제
PEZ
한 가지 복잡한 방법은 먼저 모든 것을 커밋하는 것입니다.
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^
그래 좀 어색해...
Martin G
나는 내가 필요한 것에 대한 답을 찾지 못했고 다음과 같이 쉽습니다.
git add -A git reset HEAD fileThatYouWantToStash git commit -m "committing all but one file" git stash
이것은 정확히 하나의 파일을 숨깁니다.
SCBuergel
출처 : http:www.stackoverflow.com/questions/3040833/stash-only-one-file-out-of-multiple-files-that-have-changed-with-git
'etc. > StackOverFlow' 카테고리의 다른 글
기존 Git 분기가 원격 분기를 추적하도록 하시겠습니까? (0) | 2021.10.07 |
---|---|
Git의 브랜치에서 커밋 삭제 (0) | 2021.10.07 |
디렉토리의 모든 파일을 어떻게 나열합니까? (0) | 2021.10.07 |
목록에서 항목의 인덱스 찾기 (0) | 2021.10.07 |
Java에서 ArrayList보다 LinkedList를 언제 사용합니까? (0) | 2021.10.07 |