programing

변경된 여러 파일 중 하나의 파일만 저장하는 방법은 무엇입니까?

javajsp 2023. 4. 19. 22:14

변경된 여러 파일 중 하나의 파일만 저장하는 방법은 무엇입니까?

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

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

면책사항: 아래 답변은 git 2.13 이전 git에 대한 답변입니다.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

Git 2.13 (2017년 2분기)이후 개별 파일을 다음과 같이 저장할 수 있습니다.

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

pathspecgit stash push새 저장소는 경로 사양과 일치하는 파일에 대해서만 수정된 상태를 기록합니다. 자세한 내용은 "특정 파일에 대한 변경 저장"을 참조하십시오.

간단한 예:

 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월)은 저장할 항목을 수동으로 선택하는 것이었습니다.

대소문자 구분 코멘트:

(the)stash --patch 솔루션 많은 했기 때문에 하는 것이 .

bukzor답변(2011년 11월)은 다음을 기반으로 한 보다 실용적인 해결책을 제시합니다.
git add + 를 누릅니다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★그게 (나 대신) 공식 답변이 될 겁니다.

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

먹다'는 '먹다'를 .git reset --soft , 다음과 같이 해 주세요이러한 스테이징을 원래대로 되돌리려면 , 다음과 같이 해 주세요.
명확한 스테이징 영역이며 스테이징되지 않은 일부 수정사항만 있으면 인덱스를 원래 상태로 되돌리기 위해 (bukzor와 같은 작업을 수행하지 않고) 부드럽게 리셋할 수 있습니다.


(2010년 6월 답변: 수동 저장)

직,는git stash save --patch원하는 부분 저장 기능을 얻을 수 있습니다.

★★★★★★★★★★★★★★★★ --patchHEAD와 작업 트리의 차이에서 인터랙티브하게 훈크를 선택할 수 있습니다.
한 변경만합니다.stash 엔트리는 사용자가 선택한 합니다.선택한 변경 내용이 워크트리에서 롤백됩니다.

그러나 이렇게 하면 전체 인덱스(이미 인덱싱된 다른 파일이 포함될 수 있으므로 원하는 인덱스가 아닐 수 있음)와 부분 워크트리(저장하려는 워크트리처럼 보일 수 있음)가 저장됩니다.

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

더 잘 맞을지도 몰라요


if--patch동작하지 않습니다.수동 프로세스는 다음과 같습니다.

하나 또는 여러 파일에 대해 중간 솔루션은 다음과 같습니다.

  • git repo 밖에
    (실제로 eleotlecram흥미로운 대안을 제안합니다.)
  • git stash
  • 그것들을 다시 베끼다
  • git stash # 저장됨
  • git stash pop stash@{1} 수정사항 # 파일 수정사항 다시보기 # 파일 수정사항 다시보기
  • git checkout -- afile# HEAD 콘텐츠로 리셋합니다.

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

git stash push 이렇게요.

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

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

git stash push -- my/file.sh

2017년 봄에 출시된 Git 2.13부터 사용 가능합니다.

git stash -p (오류)git add -pstash --keep-index는 너무에, 하기 쉽다고 생각했습니다.diff,checkout ★★★★★★★★★★★★★★★★★」apply:

특정 파일/디르만 "스테이시"하려면:

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

그 후

git apply stashed.diff

3개의 파일이 있다고 칩시다.

a.rb
b.rb
c.rb

a.timeout이 아닌 b.timeout과 c.timeout만 저장해야 합니다.

당신은 이런 것을 할 수 있다.

# 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

저장된 변경 사항과 함께 메시지를 지정하지 않으려면 이중 대시 뒤에 파일 이름을 전달합니다.

$ git stash -- filename.ext

추적되지 않은 새 파일인 경우 먼저 스테이징해야 합니다.

이 방법은 git 버전 2.13 이상에서 작동합니다.

변경된 파일 중 일부만 저장하려는 경우 Stage에서 다른 파일 추가 후 실행하기만 하면 됩니다.git stash push --keep-index

스테이징되지 않은 모든 변경 파일이 저장됩니다.

또 다른 방법은 다음과 같습니다.

# 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를 「어디선가」로서 사용했습니다(그 결과, 마지막에 1개의 추가 단계가 있습니다.스테이크에 넣은 cahnges도 마찬가지입니다.

간단하게 다음과 같이 할 수 있습니다.

git stash push "filename"

또는 옵션 메시지를 사용하여

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

업데이트 (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-indexgit stash-index로 할 수 .

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

이제 스테이징한 변경만 포함하는 새 항목이 저장되고 작업 트리에는 스테이징되지 않은 변경 내용이 계속 포함됩니다.

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

Git에서 브랜치를 작성하는 것은 간단한 일이기 때문에 임시 브랜치를 생성하여 개별 파일을 체크 인 할 수 있습니다.

실제로 사용할 때마다 변경 내용을 폐기하는 것을 의미하는 경우git stash 이 ('git stash'를 사용할 수.)

git checkout -- <file>

[주의]

★★★git stash분기 및 작업을 보다 빠르고 간편하게 수행할 수 있습니다.

를 파일에 음음음음((((((((((((((((( ) 。stashstash <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 repo 외부에 파일을 복사하는 VonC의 '중간' 솔루션의 문제는 경로 정보가 손실된다는 것입니다. 이 경우 나중에 많은 파일을 복사하는 것이 다소 번거롭습니다.

A 복사 대신 tar(유사한 툴로 충분)를 사용하는 것이 더 편리합니다.

  • tar cvf / tmp / stash . tar path / to / some / some / other / file ( ... 등)
  • git 체크아웃 경로/일부/파일 경로/일부/일부/기타/파일
  • 저장하다
  • tar xvf /tmp/stash.tar
  • 등(VonC의 '중간' 제안 참조)

커밋하기 전에 브랜치에서 관련 없는 변경을 한 적이 있는데, 브랜치를 다른 브랜치로 이동하여 (마스터와 같이) 개별적으로 커밋하고 싶은 경우가 있습니다.저는 이렇게 합니다.

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>...

은닉은 필요조차 없었지

이것은 Source Tree를 사용하여 3단계로 간단하게 실행할 수 있습니다.

  1. 보관하고 싶지 않은 것은 모두 임시로 커밋합니다.
  2. Git은 다른 모든 것을 추가하고 저장한다.
  3. git reset을 실행하여 임시 커밋 전에 커밋을 타깃으로 하여 임시 커밋을 팝합니다.

이 모든 작업은 SourceTree에서 몇 초 만에 완료할 수 있습니다.SourceTree에서는 추가할 파일(또는 개별 행)을 클릭하기만 하면 됩니다.추가된 후에는 임시 커밋에 커밋합니다.그런 다음 확인란을 클릭하여 모든 변경 내용을 추가한 다음 저장을 클릭하여 모든 내용을 저장합니다.저장된 변경을 제외하고 커밋 목록을 훑어보고 임시 커밋 전에 커밋의 해시를 기록한 다음 "git reset hash_b4_temp_commit"을 실행합니다.이것은 기본적으로 브런치를 커밋 직전에 커밋으로 리셋함으로써 커밋을 "포핑"하는 것과 같습니다.이제, 당신은 보관하고 싶지 않은 물건만 남았습니다.

나는 사용할 것이다.git stash save --patch인터랙티브에는 원하는 조작을 파일 전체에 적용할 수 있는 옵션이 있기 때문에 번거롭지 않습니다.

여기 있는 모든 답은 너무 복잡해...

"저장"을 위해 다음과 같이 하십시오.

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 stash -p (--patch): 되지 않은 파일을 제외하고
  • git stash -k (--keep-index): 모든 대상되지 않은 」 。
  • git stash -u (--include-untracked) 모든 대상되지 않은 파일을 합니다.「 」 、 「 」 / 「 」
  • git stash -p (--patch) -u (--include-untracked) 명령어: " " " "

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

  • 저장하지 않을 파일을 일시적으로 커밋합니다.
  • 추가 및 저장
  • 임시 커밋을 팝합니다.

다른 질문대한 답변으로 이 절차를 위한 간단한 스크립트를 작성했습니다.여기 Source Tree에서 절차를 수행하기 위한 단계가 있습니다.

2개의 브랜치를 전환하려고 하면 이 상황이 발생합니다.

「 「」를 사용해 .git add filepath

이 행은 나중에 실행한다.

git stash --keep-index

솔루션

로컬 변경:

  • 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. "filename_stash"라는 이름의 임시 저장소를 만들고 변경 내용을 파일에 보관합니다.c
  3. 파일_의 변경 사항만 사용하여 원하는 저장('my_stash')을 만듭니다.c
  4. 로컬 코드에 "temp_stash"(file_A 및 file_B)의 변경 내용을 적용하고 저장을 삭제합니다.

각 단계 사이에 git 상태를 사용하여 무슨 일이 일어나고 있는지 확인할 수 있습니다.

하려면 , 「」를 사용합니다.git stash --patch [file].

됩니다.Stash this hunk [y,n,q,a,d,j,J,g,/,e,?]? ? 라고하면 됩니다.a(이 덩치와 그 이후의 모든 덩치들은 파일에 저장) 그러면 넌 괜찮아.

비슷한 상황입니다.약속을 했고 그게 괜찮지 않다는 걸 깨달았어요.

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

, 나는 「」라고 생각하고 있다.git add -p (진행적), (진행적),git commit -m blah이치

Source Tree만 사용하여 명령줄에서 수행할 수 없습니다.파일 A를 변경했다고 가정하고 파일 B에 두 가지 변경 사항이 있다고 가정합니다.두 번째 행크만 파일B에 저장하고 다른 모든 것은 그대로 두는 경우는, 다음의 순서에 따릅니다.

  1. 모든 것을 준비하다
  2. A 파일의 모든 변경을 원래대로 되돌리는 작업복사를 변경합니다(예: 외부 diff 툴을 기동하여 파일을 일치시킵니다).
  3. 파일 B를 두 번째 변경만 적용한 것처럼 보이게 합니다(예: 외부 diff 도구를 실행하고 첫 번째 변경을 취소합니다).
  4. Keep staged changes를 사용하여 stash를 만듭니다.
  5. 모든 것을 분리하다
  6. 알았어!
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

이제 _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

이렇게 하면 파일이 하나만 저장됩니다.

VS 코드 사용자용.Git 사이드바 뷰의 Changes 그룹의 Stash 버튼은 그룹 내의 파일만 저장합니다.따라서 해당 그룹에서 일부 파일을 이동하면 나머지 파일을 저장할 수 있습니다.변경 사항을 되돌리지 않고 일부 파일을 이동하는 유일한 방법은 파일을 준비하는 것입니다.그래서:

  1. 저장하지 않을 파일을 준비합니다.
  2. Changes 그룹 헤더에 있는 stash 버튼을 클릭합니다.
  3. 이동시킨 파일의 스테이징을 해제합니다.

언급URL : https://stackoverflow.com/questions/3040833/how-do-i-stash-only-one-file-out-of-multiple-files-that-have-changed