git에서 단계적 변경 사항 만 저장하면 가능합니까? 방법이 있습니까?

단계적 변경 사항 만 숨길 수있는 방법이 있습니까? 내가 겪고있는 시나리오는 주어진 시간에 몇 가지 버그에 대해 작업했으며 여러 단계되지 않은 변경 사항이있는 경우입니다. 이 파일들을 개별적으로 준비하고 .patch 파일을 만든 다음 코드가 승인 될 때까지 숨기고 싶습니다. 이렇게하면 승인되면 전체 (현재) 세션을 숨기고 해당 버그를 팝하고 코드를 푸시 할 수 있습니다.

나는 이것에 대해 잘못 가고 있습니까? 프로세스를 단순화하기 위해 git이 다른 방식으로 작동하는 방식을 이해하고 있습니까?



답변

예, DOUBLE STASH로 가능합니다

  1. 숨겨야 할 모든 파일을 준비하십시오.
  2. 를 실행하십시오 git stash --keep-index. 이 명령은 모든 변경 사항 ( 스테이지 및 스테이지 되지 않은) 으로 숨김을 작성 하지만 작업 디렉토리에는 스테이징 된 변경 사항이 남아 있습니다 (여전히 스테이징 됨).
  3. 운영 git stash push -m "good stash"
  4. 이제 당신은 "good stash"했다 만 파일을 개최 .

이제 숨김 전에 준비되지 않은 파일이 필요한 경우 첫 번째 숨김 (로 만든 것--keep-index )을 적용하면 숨김 파일을 제거 할 수 있습니다 "good stash".

즐겨


답변

최신 자식으로 --patch옵션을 사용할 수 있습니다

git stash push --patch

git stash save --patch   # for older git versions

그리고 git은 파일의 각 변경 사항을 숨김에 추가하거나 묻지 않도록 요청합니다.
당신은 그냥 대답 y하거나n

이중 저장소의 UPD
별칭 :

git config --global alias.stash-staged '!bash -c "git stash --keep-index; git stash push -m "staged" --keep-index; git stash pop stash@{1}"'

이제 파일을 준비한 다음 실행할 수 git stash-staged있습니다.
결과적으로 준비된 파일은 숨김으로 저장됩니다 .

준비된 파일을 유지하지 않고 파일을 숨김 상태로 옮기려면 그런 다음 다른 별칭을 추가하고 다음을 실행할 수 있습니다 git move-staged.

git config --global alias.move-staged '!bash -c "git stash-staged;git commit -m "temp"; git stash; git reset --hard HEAD^; git stash pop"'

답변

현재 준비된 것만 숨기고 다른 모든 것을 남기는 스크립트를 만들었습니다. 관련이없는 변경을 너무 많이 시작하면 정말 좋습니다. 원하는 커밋과 관련이없는 것을 스테이징하고 그냥 숨기십시오.

(시작점 Bartłomiej에게 감사합니다)

#!/bin/bash

#Stash everything temporarily.  Keep staged files, discard everything else after stashing.
git stash --keep-index

#Stash everything that remains (only the staged files should remain)  This is the stash we want to keep, so give it a name.
git stash save "$1"

#Apply the original stash to get us back to where we started.
git stash apply stash@{1}

#Create a temporary patch to reverse the originally staged changes and apply it
git stash show -p | git apply -R

#Delete the temporary stash
git stash drop stash@{1}

답변

TL; DR-- $(git diff --staged --name-only) git <pathspec>매개 변수에 추가 하십시오.

간단한 원 라이너는 다음과 같습니다.

git stash -- $(git diff --staged --name-only)

그리고 간단하게 메시지를 추가하려면 :

git stash push -m "My work in progress" -- $(git diff --staged --name-only)

v2.17.1v2.21.0.windows.1 에서 테스트

한계 :

  • 파일이 준비되지 않은 경우 모든 것이 숨겨집니다.
  • 또한 부분적으로 만 스테이징 된 파일이있는 경우 (즉, 일부 변경된 라인 만 스테이지되고 다른 변경된 라인은 스테이징되지 않은 경우) 전체 파일이 스테이징되지 않습니다 (스테이지되지 않은 라인 포함).

답변

같은 것을 달성하기 위해 …

  1. 작업하려는 파일 만 준비하십시오.
  2. git commit -m 'temp'
  3. git add .
  4. git stash
  5. git reset HEAD~1

팔. 원하지 않는 파일은 숨겨져 있습니다. 원하는 파일이 모두 준비되었습니다.


답변

이 시나리오에서는 각 이슈마다 새로운 브랜치를 생성하는 것을 선호합니다. 접두사 temp /를 사용하므로 나중에이 분기를 삭제할 수 있음을 알고 있습니다.

git checkout -b temp/bug1

bug1을 수정 한 파일을 준비하고 커밋하십시오.

git checkout -b temp/bug2

그런 다음 필요에 따라 각 분기에서 커밋을 체리 선택하고 풀 요청을 제출할 수 있습니다.


답변

왜 특정 버그에 대한 변경 사항을 커밋하고 해당 커밋과 그 이전 버전에서 패치를 작성하지 않습니까?

# hackhackhack, fix two unrelated bugs
git add -p                   # add hunks of first bug
git commit -m 'fix bug #123' # create commit #1
git add -p                   # add hunks of second bug
git commit -m 'fix bug #321' # create commit #2

그런 다음 적절한 패치를 작성하려면 다음을 사용하십시오 git format-patch.

git format-patch HEAD^^

이 두 개의 파일을 생성합니다 : 0001-fix-bug-123.patch0002-fix-bug-321.patch

또는 각 버그에 대해 별도의 분기를 만들 수 있으므로 버그 수정을 개별적으로 병합하거나 리베이스 할 수 있으며 문제가 해결되지 않으면 삭제할 수도 있습니다.