Git에서 비 단계적 변경 사항 만 처리


229

다음 작업 흐름을 수행하고 싶습니다.

  1. 스테이지에 변경 사항을 추가하십시오.
  2. 준비되지 않은 다른 모든 변경 사항을 보관하십시오.
  3. 무대에있는 것들로 무언가를하십시오 (예 : 빌드, 테스트 실행 등)
  4. 숨김을 적용하십시오.

2 단계를 수행하는 방법이 있습니까?

 echo "123" > foo
 git add foo # Assumes this is a git directory
 echo "456" >> foo
 git stash
 cat foo # Should yield 123

준비한 후에 변경 사항을 커밋하지 않겠습니까?
Shizzmo

3
IIRC --keepindex는 정확히 그렇게합니다
sehe

4
예를 들어 빌드가 실패하면 커밋을 원하지 않습니다. 커밋을 삭제할 수 있지만 가능한 경우 커밋 없이이 작업을 수행하고 싶습니다.
Unapiedra

세헤, 고마워 이 작품을 확인할 수 있습니다. Gee, 나는 구식linux.die.net/man/1/git-stash 의 매뉴얼을 보았다 . man git stash훨씬 낫다.
Unapiedra

--keep-index, fwiw입니다.
jaf0

답변:


288

git stash save--keep-index정확히 필요한 것을 수행 하는 옵션 이 있습니다.

을 실행하십시오 git stash save --keep-index.


9
진실. save와 함께 계속 사용 합니다 git stash. 어쩌면 apply / pop으로 대칭을 존중해야한다고 주장하는 프로그래머 일 것입니다. :)
vhallac

104
참고 : 여전히 모든 변경 사항 이 숨겨집니다 . 일반과의 유일한 차이점은 git stash save작업 복사본에 이미 단계적 변경 사항이 남아 있다는 것입니다. 위의 워크 플로우에서는 이미 숨김 변경 사항의 절반이있는 로컬 복사본 위에 숨김을 적용하기 때문에 잘 작동합니다 (git는 무시할만큼 똑똑합니다). 그러나 숨김을 다시 적용하기 전에 코드를 편집하면 적용 할 때 병합 충돌이 발생할 수 있습니다. 참고
peterflynn

2
@ytpete 그것은 여러 번 물린 적이 있습니다. 나는 정말로 git이 당신이 지키지 않는 것들을 숨길 수있는 방법이 있었기를 바란다 git commit --ammend.
rjmunro

1
--amend(이 아닌 --ammend)
Rhubbarb

19
peterflynn이 설명한 문제점으로 인해이 솔루션이 작동하지 않습니다. 단계적 변경 사항이 여전히 숨겨져 있기 때문에 질문에 대한 답은 아닙니다. 더 나은 해결책이 있습니까?
user643011

43

이는 3 단계로 수행 할 수 있습니다. 단계적 변경 사항 저장, 기타 모든 항목 숨김, 단계적 변경 사항으로 색인 복원. 기본적으로

git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^

이것은 당신이 원하는 것을 정확하게 할 것입니다.


3
참고 : -u추적되지 않은 파일도 보관합니다.
ma11hew28

이 접근법은 본질적으로 git stash save --keep-index더 많은 작업으로 수행하는 작업을 복제 합니다. 나는 어떤 이점도 보지 못한다.
Inigo

1
@ vas 아니오, 접근법은 그것을 복제하지 않습니다. 허용 된 답변에 대한 peterflynn의 의견을 참조하십시오.
Alexander Klauer

28
git stash save --keep-index

또한, Re :

준비한 후에 변경 사항을 커밋하지 않겠습니까? – 신

A : 테스트 된 코드를 항상 체크인해야하기 때문에 :) 즉, 커밋하려는 변경 사항만으로 테스트를 실행해야합니다.

떨어져 물론, 경험있는 프로그래머로, 당신은 테스트 및 검토 바로 그 변화에 타고난 충동을 가지고 있다는 사실에서이 모든 -에만 부분적으로 농담


14

git version 2.7.4당신 과 함께 할 수 있습니다 :

git stash save --patch

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

항상 그렇듯이 작업 디렉토리를 복원 할 수 있습니다.

git stash pop

또는 저장된 변경 사항을 숨김 상태로 유지하려면 다음을 수행하십시오.

git stash apply

대단해. 약간의 노동 집약적이지만 적어도 전체 파일을 건너 뛰고 추가 할 수 있습니다.
Dustin Oprea

5

이전 답변을 연장하면서 때로는 복잡한 일련의 변경 단계가 있지만 별도의 변경을 먼저 수행하려고합니다. 예를 들어, 단계적 변경을 수정하기 위해 버그 또는 잘못된 코드를 발견했을 수 있습니다. 가능한 경로는 다음과 같습니다.

먼저 모든 것을 숨기고 단계적 변경은 그대로 두십시오.

$ git stash save --keep-index [--include-untracked]

이제 단계적 변경 사항도 별도로 숨 깁니다.

$ 자식 숨김 저장

수정을 위해 변경하십시오. 그리고 테스트; 그들을 저 지르십시오 :

$ git add [--interactive] [--patch]

$ git commit -m "fix ..."

이제 이전 단계 변경 사항을 복원하십시오.

$ git stash pop

충돌을 해결하고 충돌이 발생하면 git은 해당 최상위 숨김 항목을 적용했지만 삭제 하지는 않습니다 .

(... 그런 다음 단계적 변경 사항을 커밋하고 다른 모든 변경 사항의 숨김을 복원하고 계속하십시오 ...)


4

태그가 지정되지 않은 (커밋에 추가되지 않은) 파일을 숨김에 추가하려면 다음 명령을 실행하십시오.

git stash -k

그런 다음 준비된 파일을 커밋 할 수 있습니다. 그 후 다음 명령을 사용하여 마지막 숨김 파일을 다시 가져올 수 있습니다.

git stash pop

4

Git에서 작업 트리 (스테이지되지 않은 변경 사항) 만 숨기는 것이보다 어렵습니다. 수락 된 답변은 비 단계적 변경 사항을 숨기고 단계적 변경 사항 도 숨기고 (단계적으로 남겨 둡니다), 거의 원하지 않습니다.

이 별명은 잘 작동합니다.

stash-working = "!f() { \
  git commit --quiet -m \"temp for stash-working\" && \
  git stash push \"$@\" && \
  git reset --quiet --soft HEAD~1; }; f"

단계적 변경 사항을 일시적으로 커미트하고 나머지 변경 사항에서 숨김을 작성하고 별명 인수 --include-untracked와 같은 추가 인수 --message를 전달한 다음 임시 커미트를 재설정하여 단계적 변경 사항을 되돌립니다.

@Simon Knapp의 답변 과 비슷 하지만 약간의 차이점이 있습니다. --quiet취한 임시 작업에 사용 되며을 push하드 코딩하는 대신 숨김에 대해 여러 매개 변수를 허용 하며 최종에 -m추가 --soft합니다. 인덱스가 시작된 그대로 유지되도록 재설정하십시오.

스테이징의 반대 문제에 대해서는 단계적 변경 (별칭 stash-index) 만이 답변을 참조하십시오 .


2

질문과 관련된 또 다른 팁 :

다음을 사용하여 비 단계적 변경을 효과적으로 숨길 수 있습니다.

$ git stash save --keep-index

스 태쉬에 메시지를 제공 할 수 있으므로, 스 태쉬에 수행 할 때 git stash list, 특히 스 태쉬 작업을 추가 저장으로 수행하는 경우 스 태쉬 된 내용이 더 명확 해 지도록 할 수 있습니다 . 예를 들어

$ git stash save --keep-index "변경 사항이 아직 준비되지 않았습니다"

(실제로 다른 답변에 명시된 모든 변경 사항이 포함되어 있음).

예를 들어, 위의 바로 뒤에 다음이 올 수 있습니다.

$ git stash 저장 "기능 X에 대한 단계별 변경 사항"

하지만 사용할 수 없다는 점에 유의하십시오.

$ git stash apply "stash @ {1}"### ✘ 당신이 원하는 것을하지 않습니다

스테이지되지 않은 변경 사항 만 복원합니다.


2

Git에는 비 단계적 변경 사항 만 숨기는 명령이 없습니다.

그러나 Git에서는 숨길 파일을 지정할 수 있습니다.

git stash push --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

해당 파일에서 특정 변경 사항 만 숨기려면 --patch옵션을 추가하십시오 .

git stash push --patch --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

--include-untracked옵션을 사용하면 추적되지 않은 파일을 숨길 수 있습니다.

git stash push --include-untracked --message 'Untracked files' -- app/controllers/widgets_controller.rb test/controllers/widgets_controller_test.rb

자세한 내용을 보려면 git help stash(또는 man git-stash)를 실행하십시오 .

참고 : 준비되지 않은 변경 사항이 이질적인 경우 @alesguzik의 답변 이 더 쉽습니다.


0

git stash push [--] [<pathspec>...]Git 2.16+ 이후 로 그 명령의 현대적인 형태는 ( git stash save더 이상 사용되지 않습니다 )

예를 들어 다음과 같이 와일드 카드 양식과 결합 할 수 있습니다.

git stash push --all --keep-index ':(glob)**/*.testextension' 

그러나 Git 2.22 (2019 년 2 분기)까지는 Git for Windows에서 제대로 작동하지 않습니다 ( 쉘 스크립트 대신 C로 다시 구현 된 것을 고려할 때 문제 2037 참조 )git stash

Thomas Gummerer ( )의 commit 7db9302 (2019 년 3 월 11 일)를 참조하십시오 . Johannes Schindelin ( )의 commit 1366c78 , commit 7b556aa (2019 년 3 월 7 일)를 참조하십시오 . ( Junio ​​C Hamano의해 병합 - 커밋 0ba1ba4 , 2019 년 4 월 22 일)tgummerer
dscho
gitster

내장 stash: :(glob)경로 스펙을 다시 처리

예를 들어 경로 사양 목록을 전달할 때 git add파싱 ​​된 경로 사양 형식이 아닌 원래 형식을 사용하도록주의해야합니다.

예를 들어 전화를 걸 때 차이가납니다.

git stash -- ':(glob)**/*.txt'

여기서 원본 양식에는 :(glob)접두사가 포함 되지만 구문 분석 된 양식에는 접 두부가 포함 되지 않습니다.

그러나 내장 git stash에서 구문 분석 된 (즉 잘못된) 양식을 전달 git add하면 오류 메시지와 함께 실패합니다.

fatal: pathspec '**/*.txt' did not match any files

실제로 성공적으로 업데이트 된 git stash경우에도 작업 트리에서 변경 사항을 삭제 하는 단계에서 refs/stash.


0

별명을 사용합니다.이 별명은 숨김 항목에 대한 메시지로 사용할 문자열을 허용합니다.

mystash = "!f() { git commit -m hold && git stash push -m \"$1\" && git reset HEAD^; }; f"

어느:

  • 인덱스의 모든 것을 커밋
  • 작업 트리에서 변경된 내용을 숨 깁니다 (물론 추가 -u하거나-a )
  • 마지막 커밋을 작업 시도로 다시 재설정합니다 ( --soft인덱스에 유지하기 위해 사용할 수 있음).
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.