지점에서 여러 개의 변경된 파일 중 하나만 숨기려면 어떻게해야합니까?
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-indexgit add변경 사항을 잊지 마십시오 .git commitgit stash popgit rebase --continuegit 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 stashgit 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색인을 유지하지만 색인과 색인 모두에서 모든 것을 숨 깁니다 .