지점에서 여러 개의 변경된 파일 중 하나만 숨기려면 어떻게해야합니까?
git diff -- *filename* > ~/patch
다음 git checkout -- *filename*
과 나중에는 패치를 다시 적용 할 수 있습니다git apply ~/patch
git stash push [--] [<pathspec>...]
.
지점에서 여러 개의 변경된 파일 중 하나만 숨기려면 어떻게해야합니까?
git diff -- *filename* > ~/patch
다음 git checkout -- *filename*
과 나중에는 패치를 다시 적용 할 수 있습니다git apply ~/patch
git stash push [--] [<pathspec>...]
.
답변:
면책 조항 : 다음 답변은 자식 2.13 이전의 자식에 대한 것입니다. 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
git rebase --continue
git stash save -k
하면 예 (녹색 git stat
)이 유지되지만 전체 가 유지됩니다. 변경 세트 (녹색 및 빨강 모두)가 숨겨집니다. 이는 OP의 요청 인 "일부 변경 사항 만 저장"을 위반합니다. (나중에 사용하기 위해) 빨간색 중 일부만 숨기고 싶습니다.
git stash -p
내가 찾던 것입니다. 이 스위치가 최근에 추가되었는지 궁금합니다.
git stash --keep-index
고장입니다. 더 많은 변경을 수행하면 git stash pop
나중에 보관하지 않은 파일뿐만 아니라 보관 된 변경된 파일이 숨김에 포함되므로 병합 충돌이 발생합니다. 예를 들어 : 파일 A와 B를 변경 한 다음 A를 변경하여 테스트하려면 B를 숨 깁니다. A와 관련된 문제를 찾은 다음 수정했습니다. 나는 A를 저지른다. 이전 버전의 A가 병합 충돌로 인해 아무런 이유없이 숨겨져 있기 때문에 이제는 풀 수 없습니다. 실제로 A와 B는 많은 파일, 아마도 이진 이미지 또는 무언가 일 수 있으므로 기본적으로 B를 포기하고 잃어야합니다.
당신은 또한 사용할 수 있습니다 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
stash -p
. 이 답변은 대화 형 / 사용자 친화적 인 형태로 유지되므로이 답변에 수여합니다.
git stash save -p my stash message
; 논쟁의 순서는 매우 직관적이지 않기 때문에 ...
git log -p
에서 -p
플래그는 "원하는 멋진 일을하지만 표현하는 방법을 모른다"를 의미해야한다고 생각합니다 .
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 stash
git stash
# 이번에는 원하는 파일 만 보관됩니다git stash pop stash@{1}
# 모든 파일 수정 사항을 다시 적용하십시오git checkout -- afile
# 로컬 수정 전에 파일을 HEAD 컨텐츠로 재설정다소 번거로운 프로세스가 끝나면 하나 또는 여러 개의 파일 만 보관됩니다.
git reset
(혼합)
git is fundamentally about managing a all repository content and index and not one or several files
-해결중인 문제를 어둡게 구현 한 구현입니다. 그것은 설명이지만 정당화는 아닙니다. 모든 소스 제어 시스템은 "여러 파일 관리"에 관한 것입니다. 어떤 의견이 가장 많이지지되는지보십시오.
때 git stash -p
(또는 git add -p
과 stash --keep-index
너무 성가신 것), 나는 그것을 쉽게 사용하는 것으로 diff
, checkout
및apply
:
특정 파일 / 디렉토리 만 "스 태쉬"하려면 :
git diff path/to/dir > stashed.diff
git checkout path/to/dir
그런 다음
git apply stashed.diff
git add -p
위의 답변에서 언급 한 흥미로운 대안 입니다. +1.
git diff > file.diff
와 git apply
평소 부분 은닉 도구이다. git stash -p
더 큰 변경 세트로 전환해야 할 수도 있습니다 .
patch = log --pretty=email --patch-with-stat --reverse --full-index --binary
. 그러나 패치를 커밋하려면 변경 사항이 필요합니다.
../../foo/bar.txt
. 패치는 OK를 생성하지만 패치를 적용하려면 리포지토리 루트로 이동해야합니다. 따라서이 문제가 발생하면 저장소 루트 디렉토리에서 수행해야합니다.
다음 git stash push
과 같이 사용하십시오 .
git stash push [--] [<pathspec>...]
예를 들면 다음과 같습니다.
git stash push -- my/file.sh
2017 년 봄에 출시 된 Git 2.13부터 사용할 수 있습니다.
git stash push
에서 이미 언급 한 바 있습니다. 그리고 새로운 Git 2.13 명령에 대해 자세히 설명했습니다 : stackoverflow.com/a/42963606/6309 .
git stash apply
숨김 변경 사항을 복구하는 데 사용됩니까 ?
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.
이를 수행하는 다른 방법 :
# 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를 제거합니다.
업데이트 (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
대신 cd
및 popd
끝에 권장 하므로 스크립트가 성공하면 사용자는 스크립트를 실행하기 전과 동일한 디렉토리에있게됩니다.
Git에서 브랜치를 생성하는 것은 쉽지 않기 때문에 임시 브랜치를 생성하고 개별 파일을 확인할 수 있습니다.
당신은 단순히 이것을 할 수 있습니다 :
git stash push "filename"
또는 선택적인 메시지와 함께
git stash push -m "Some message" "filename"
다음 코드를 파일에 저장하십시오 (예 : 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
}
}
}
파일을 Git 저장소 외부로 복사하는 VonC의 '중간'솔루션의 문제점은 경로 정보를 잃어 나중에 여러 번의 파일 복사가 번거 롭다는 것입니다.
복사 대신 tar를 사용하는 것이 더 쉽다는 것을 발견하십시오 (유사한 도구가 가능할 것입니다).
checkout -f
필요하지 않습니다 checkout
(없이 -f
) 충분합니다. 답변을 업데이트했습니다.
때로는 커밋하기 전에 지점에서 관련이없는 변경 작업을 수행 한 후 다른 지점으로 이동하여 별도로 커밋하려고합니다 (마스터 등). 나는 이것을한다:
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>...
보관하지 않아도 ...
이 작업은 SourceTree를 사용하여 3 단계로 쉽게 수행 할 수 있습니다.
이 작업은 SourceTree에서 몇 초 만에 완료 할 수 있습니다. 여기서 추가하려는 파일 (또는 개별 행)을 클릭하면됩니다. 일단 추가되면 임시 커밋에 커밋하십시오. 그런 다음 확인란을 클릭하여 모든 변경 사항을 추가 한 다음 숨김을 클릭하여 모든 것을 숨 깁니다. 스 태쉬 변경이 중단되면 커밋 목록을 살펴보고 임시 커밋 전에 커밋에 대한 해시를 확인한 다음 'git reset hash_b4_temp_commit'을 실행하십시오. 바로 직전. 이제, 당신은 당신이 숨기고 싶지 않은 것들만 남았습니다.
사용 git stash save --patch
합니다. 전체 파일에 원하는 작업을 적용하는 옵션이 있기 때문에 대화 형 작업이 성 가시지 않습니다.
git stash -p
은 전체 파일을 빠르게 숨기고 나중에 끝내는 것을 허용합니다.
여기에있는 모든 대답은 너무 복잡합니다 ...
"스 태쉬"하는 것은 어떻습니까 :
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
오류가 없지만 변경 사항이 다시 나타나지 않을 때
이에 대한 답변과 의견 및 유사한 스레드를 검토했습니다. 특정 추적 / 추적되지 않은 파일 을 숨길 수 있도록 다음 명령 중 올바른 명령은 없습니다 .
git stash -p (--patch)
: 추적되지 않은 파일을 제외하고 수동으로 덩어리를 선택합니다git stash -k (--keep-index)
: 모든 추적 / 추적되지 않은 파일을 숨기고 작업 디렉토리에 보관하십시오.git stash -u (--include-untracked)
: 모든 추적 / 추적되지 않은 파일을 숨 깁니다.git stash -p (--patch) -u (--include-untracked)
: 잘못된 명령현재 특정 추적 / 추적되지 않은 파일을 숨길 수있는 가장 합리적인 방법은 다음과 같습니다.
나는 또 다른 질문에 대한 답변이 절차에 대한 간단한 스크립트를 작성 하고, 거기에 여기 SourceTree의 절차를 수행하는 단계 .
지역 변경 :
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}
끝난.
단계 사이에 git status 를 사용하여 진행 상황을 확인할 수 있습니다 .
두 분기간에 전환하려고하면이 상황이 발생합니다.
" git add filepath
"를 사용하여 파일을 추가하십시오 .
나중에이 줄을 실행
git stash --keep-index
단일 파일을 숨기려면을 사용하십시오 git stash --patch [file]
.
프롬프트가 표시 Stash this hunk [y,n,q,a,d,j,J,g,/,e,?]? ?
됩니다.. 입력하십시오 a
(이 덩어리와 이후의 모든 덩어리를 파일에 저장하십시오).
push
에서와 같이 누락git stash push --patch [file]
비슷한 상황. 커밋하고 그것이 좋지 않다는 것을 깨달았습니다.
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
명령 줄에서 SourceTree 만 사용하는 방법을 모르겠습니다. 파일 A를 변경했고 파일 B에 두 개의 변경 덩어리가 있다고 가정합시다. 파일 B의 두 번째 덩어리 만 숨기고 나머지는 그대로 두려면 다음과 같이하십시오.
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)
복잡한 방법 중 하나는 먼저 모든 것을 커밋하는 것입니다.
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^
예, 다소 어색합니다 ...
나는 내가 필요한 것으로 대답하지 않았으며 다음과 같이 쉽습니다.
git add -A
git reset HEAD fileThatYouWantToStash
git commit -m "committing all but one file"
git stash
이것은 정확히 하나의 파일을 숨 깁니다.
git stash --keep-index
색인을 유지하지만 색인과 색인 모두에서 모든 것을 숨 깁니다 .