sourcecode

Git에서 단계별 변경 사항만 저장하는 방법은 무엇입니까?

codebag 2023. 5. 23. 21:51
반응형

Git에서 단계별 변경 사항만 저장하는 방법은 무엇입니까?

다음 워크플로우를 사용합니다.

  1. 몇 가지 변경 사항을 준비합니다.
  2. 스테이징되지 않은 변경 내용을 스택에 저장합니다.
  3. 단계에 있는 것들(빌드, 테스트 등)로 몇 가지 작업을 수행합니다.
  4. 저지르다.
  5. 준비되지 않은 변경 사항을 복원합니다.

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

예:

git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git stash push
test
git commit
git stash pop

git stash push에는 사용자가 필요로 하는 작업을 수행하는 옵션이 있으므로 다음을 실행하십시오.

git stash push --keep-index

이 작업은 단계별 변경사항 저장, 다른 모든 내용 저장, 단계별 변경사항이 있는 인덱스 복원의 3단계로 수행할 수 있습니다.이는 기본적으로 다음과 같습니다.

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

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

git stash save --keep-index

또한, Re:

변경 사항을 스테이징한 후 커밋하지 않으시겠습니까?

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

물론 경험이 풍부한 프로그래머로서 이러한 변화를 테스트하고 검토하고 싶은 타고난 충동을 가지고 있다는 사실을 제외하고는 이 모든 것은 부분적으로만 농담입니다.

스테이징된 변경 사항 없이 저장

:--keep-index/-k

Git에 작업 트리(단계화되지 않은 변경 사항)만 저장하는 것은 필요 이상으로 어렵습니다.승인된 답변과 꽤 많은 다른 답변은 단계별 변경사항을 스테이징하고 요청에 따라 스테이지를 그대로 둡니다.--keep-index.

하지만 명백하지 않은 것은--keep-index또한 스테이징된 변경 사항을 스테이징합니다.단계별 변경사항은 단계별 및 저장소별로 수행됩니다.나중에 스택을 터뜨릴 때 스택에 대한 중간 변경이 충돌을 일으킬 가능성이 높기 때문에 이는 거의 원하는 것이 아닙니다.

별칭 솔루션

이 별칭은 작업 복사본 변경 사항만 스테이징하는 데 적합합니다.

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

사항을 일시적으로 변경 사항에 " 준된변사일로커고하밋으며적시다생, " 나비변사부터로하성스으택", "을다같추인허"와 같은 추가 인수를 합니다).--include-untracked그리고.--message별칭 인수로 전달됨)을 선택한 다음 준비된 변경 사항을 다시 가져오기 위해 임시 커밋을 재설정합니다.

이것은 @Simon Knapp의 대답과 비슷하지만, 몇 가지 사소한 차이점이 있습니다. - 그것은 다음을 사용합니다.--quiet stash 합니다.push 표현보다는-m그리고 그것은 추가합니다.--soft인덱스가 시작된 상태로 유지되도록 최종 재설정합니다.또한 다음을 사용합니다.--no-verify@Granfalloner (HT: @Granfalloner)에서 작업 복사본의 변경을 방지하기 위해 커밋합니다.

저장의 반대 문제의 경우 준비된 변경 사항만 저장합니다(가칭).stash-index) 이 답변을 참조하십시오.

2 ( 2022부터는 Git 2.35+ (Q1 2022)를 할 수 .--staged깃발을 올리다git stash push인덱스의 변경 내용만 준비합니다.

당신의 질문은 정반대이기 때문에, 우리는 두 가지 선택지가 있습니다.

  1. 다음과 같이 작동을 반대로 합니다.
git stash push --staged            # Stash staged changes
git stash                          # Stash everything else
git stash pop stash@{1}            # Restore staged changes stash
  1. 보관할 변경사항 대신 저장할 변경사항을 준비합니다.이제 실행할 수 있습니다.
git stash push --staged

저는 다른 S/O 게시물에 있는답변에서 이 정보를 얻었습니다.

TL;DR; git 2.35 플래그가 구현된 이후:git stash [push [-S|--staged]]수 있는 것은 다음과 같습니다.

git stashu

이 별칭을 추가한 후:

git config --global alias.stashu '!git stash push -S; git stash; git stash pop --index stash@{1}'"

설명:

git stash push -S                  # Stash staged changes
git stash                          # Stash everything else
git stash pop --index stash@{1}    # Restore staged changes into index

$ git config --global alias.stashu '!git stash push -S; git stash; git stash pop --index stash@{1}'

$ git diff 
```diff
diff --git a/src/js/modal.js b/src/js/modal.js
index d07c085..766e39a 100644
--- a/src/js/modal.js
+++ b/src/js/modal.js
@@ -6,10 +6,12 @@
 import "jquery-validation/dist/jquery.validate";
 import "bootstrap/dist/js/bootstrap.bundle";
 
+staged
 const FormDataJson = require('form-data-json-convert');
 FormDataJson.defaultOptionsToJson.uncheckedValue =  false;
 FormDataJson.defaultOptionsToJson.skipEmpty      =  true;
 
+unstaged
 import { TabulatorFull as Tabulator } from 'tabulator-tables/dist/js/tabulator';
 
 import { ajax_query } from "./common/ajax";
``` 

$ git add -p
```diff
@@ -6,7 +6,8 @@
 import "jquery-validation/dist/jquery.validate";
 import "bootstrap/dist/js/bootstrap.bundle";
 
+staged
 const FormDataJson = require('form-data-json-convert');
 FormDataJson.defaultOptionsToJson.uncheckedValue =  false;
 FormDataJson.defaultOptionsToJson.skipEmpty      =  true;
``` 

(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? y
```diff
@@ -9,7 +10,8 @@
 const FormDataJson = require('form-data-json-convert');
 FormDataJson.defaultOptionsToJson.uncheckedValue =  false;
 FormDataJson.defaultOptionsToJson.skipEmpty      =  true;
 
+unstaged
 import { TabulatorFull as Tabulator } from 'tabulator-tables/dist/js/tabulator';
 
 import { ajax_query } from "./common/ajax";
```
(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? n

$ git status
On branch dev-Modal
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
modified:   modal.js

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
modified:   modal.js

$ git diff
```diff
diff --git a/src/js/modal.js b/src/js/modal.js
index ac48408..766e39a 100644
--- a/src/js/modal.js
+++ b/src/js/modal.js
@@ -11,6 +11,7 @@ const FormDataJson = require('form-data-json-convert');
 FormDataJson.defaultOptionsToJson.uncheckedValue =  false;
 FormDataJson.defaultOptionsToJson.skipEmpty      =  true;
 
+unstaged
 import { TabulatorFull as Tabulator } from 'tabulator-tables/dist/js/tabulator';
 
 import { ajax_query } from "./common/ajax";
``` 

$ git stashu 
Saved working directory and index state WIP on dev-Modal: 9f6e760 Imported Tabulator module
Saved working directory and index state WIP on dev-Modal: 9f6e760 Imported Tabulator module
On branch dev-Modal
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
modified:   src/js/modal.js

Dropped stash@{1} (509be8cf1afa340faf77aa6a2b8d008aa82a980a)

$ git stash show -p
```diff
diff --git a/src/js/modal.js b/src/js/modal.js
index d07c085..ed509ed 100644
--- a/src/js/modal.js
+++ b/src/js/modal.js
@@ -10,6 +10,7 @@ const FormDataJson = require('form-data-json-convert');
 FormDataJson.defaultOptionsToJson.uncheckedValue =  false;
 FormDataJson.defaultOptionsToJson.skipEmpty      =  true;
 
+unstaged
 import { TabulatorFull as Tabulator } from 'tabulator-tables/dist/js/tabulator';
 
 import { ajax_query } from "./common/ajax";
```

**BONUS for those who read till here. The alias to stash staged changes:
```
$ git config --global alias.stashs 'stash push -S'
```
And now you can `stash staged`:
```
git stashs
```


와 함께git version 2.7.4다음 옵션을 사용할 수 있습니다.

git stash save --patch

그리고나서git에서는 변경 내용을 추가할지 여부를 묻는 메시지가 표시합니다.
그리고 당신은 그냥 대답해요.y또는n.

다음과 같이 작업 디렉터리를 복원할 수 있습니다.

git stash pop

저장된 변경사항을 저장된 상태로 유지하려면 다음을 수행합니다.

git stash apply

스테이징되지 않은(커밋에 추가되지 않은) 파일을 저장에 추가하려면 다음 명령을 실행합니다.

git stash -k

새로 추가된 파일(녹색이 아닌 스테이징되지 않은 파일)도 스택에 포함하려면 다음 작업을 수행합니다.

git stash -k -u

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

git stash pop

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의 답변이 더 쉬울 수 있습니다.

이전 답변을 확장하여 복잡한 변경 사항을 준비하기도 하지만 먼저 별도의 변경 사항을 적용하고 싶습니다.예를 들어, 단계별 변경 전에 수정하려는 버그나 잘못된 코드를 발견했을 수 있습니다.한 가지 가능한 경로는 다음과 같습니다.

먼저 모든 것을 저장하지만 준비된 변경 사항은 그대로 둡니다.

git stash 저장 --keep-index [--filename-untracked]

이제 준비된 변경 사항도 별도로 저장합니다.

git stash save

수정을 위한 변경 및 테스트, 커밋:

git add [--productive] [--productive]

git commit -m" 수정..."

이제 이전에 준비한 변경 사항을 복원합니다.

갓 스태쉬 팝

충돌을 해결하고 충돌이 발생한 경우 Git이 적용되었지만 해당 상위 스택 항목을 삭제하지는 않았습니다.

(... 그런 다음 준비된 변경 내용을 커밋하고 다른 모든 변경 내용의 저장을 복원한 후 계속...)

질문과 관련된 또 다른 팁:

다음을 사용하여 단계별 변경사항을 효과적으로 저장하는 경우

git stash 저장 --keep-index

당신은 창고에 메시지를 주고 싶을 수도 있습니다, 그래서 당신이 할 때.git stash list특히 추가 저장을 통해 해당 저장 작업을 수행하는 경우 이전에 저장한 내용이 더 분명합니다.를 들어, .

git stash save --keep-index "변경사항이 아직 준비되지 않음"

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

예를 들어, 위에 바로 이어서 다음과 같은 작업이 수행될 수 있습니다.

gitstash "기능 X에 대한 단계적 변경" 저장

하지만 사용할 없도록 주의하십시오.

gitstash apply "stash@{1}" ### ✘는 당신이 원하는 것을 제대로 하지 못합니다.

단계적이지 않은 변경 사항만 복원할 수 있습니다.

나는 별칭을 사용하는데, 이 별칭은 stash 항목에 대한 메시지로 사용할 문자열을 허용합니다.

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

대상:

  • 인덱스에 있는 모든 것을 커밋합니다.
  • 트리에서 추가할 도 있음).-u또는-a),
  • 을 다시 ).--soft인덱스에 저장).

2022: "Stashing only staged changes in git - 가능한가?"에서 언급했습니다. Git 2.35(Q1 2022)에는 ":git stash push --staged(man)

이 옵션은 푸시 및 저장 명령에만 유효합니다.

현재 준비된 변경 사항만 저장합니다.
은 기본적인 것과 .git commit현재 분기 대신 상태가 스택에 커밋된 경우를 제외합니다.


는 2019입니다.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에서 잘 작동하지 않습니다. 문제 2037참조하십시오. 셸 스크립트 대신 C에서 다시 구현되었습니다.

토마스 구메러()의 tgummerer커밋 7db9302(2019년 3월 11일)를 참조하십시오.
커밋 1366c78, 커밋 7b556aa(2019년 3월 7일)를 요하네스 쉰들린()dscho 참조.
(주니오 C 하마노에 의해 합병 -- -- 커밋 0ba1ba4, 2019년 4월 22일)

붙박이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실제로 업데이트되었습니다.

OP가 요청한 것과 정확히 일치하는 최고의 해결책이 있습니다.불필요한 커밋이나 변경된 모든 파일을 스테이징하지 않고 추적되지 않은 파일만 스테이징합니다.--keep-index

단계별로 추적되지 않은 모든 변경사항이 나열됩니다.git diff --name-only) 새 선을 공백으로 변환합니다(| tr '\n' ' '를 사용하여 모든 파일을 스태킹합니다.git stash push:

git stash push $(git diff --name-only | tr '\n' ' ')

저는 파이썬 프로그램에 관심이 있었습니다.pre-commit해주세요.여기 코드가 있습니다.https://github.com/pre-commit/pre-commit/blob/3fe38dff05957f609cf7b97f471b35a8d9e0659a/pre_commit/staged_files_only.py#L50

기능적으로는 다음과 같습니다.

git diff-index --ignore-submodules --binary --exit-code --no-color --no-ext-diff $(git write-tree) -- >stash.patch
git checkout -- .

# Do stuff now

git apply stash.patch && rm stash.patch

재고:스택 데이터를 작업 트리 변경으로만 제한할 필요는 없지만 나중에 적용할 때 스택의 작업 트리 변경만 적용하도록 결정할 수 있습니다.

따라서 저장 시간에 평소와 같이 수행하십시오.

git stash [-k|--keep-index]

적용 시간에 수행

git cherry-pick -m2 -n stash

설명:-m2저장된 인덱스 상태인 스테이지 커밋의 두 번째 상위 항목에 대한 변경 내용을 선택합니다. -n|--no-commit자동 커밋을 차단합니다. stash@{1}스택의 두 번째 스택에 대한 기준이 될 것입니다...

제가 알기로는 현재 작업 트리의 단계별 변경 사항만 저장하는 것은 불가능합니다.git stash push즉, 인덱스 상태의 변경 내용을 저장합니다.이 명령은 작업 트리의 모든 변경 사항(단계별 및 단계별 변경 사항), HEAD 상태의 변경 사항을 저장합니다.--keep-index또한 작업 트리 상태를 HEAD 상태 대신 인덱스 상태로 설정합니다(따라서 HEAD 상태에서 변경 사항을 복원할 때 충돌이 발생합니다).git stash pop. 만약에.git stash push선택권이 있었습니다.-U|--unstaged변경사항만 " " " " " " " " " (" " " " " " " " " " (")--keep-index에 선택할 수 있습니다.-S|--staged단계별 변경사항만 저장합니다.

그러니 당분간은 당신이 본받아야 합니다.

git stash push --unstaged

git stash pop

임시 파일 포함:

git diff >unstaged
git restore .

git apply unstaged
rm unstaged

사용 사례가 부분 변경을 수행하기 전에 테스트 중이며 이미 참조 문서에 있지만 결함이 있는 옵션이 있습니다.--keep-index갈등을 유발합니다. 옵션이 .-U|--unstaged:

git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git diff >unstaged
git restore .
test
git commit
git apply unstaged
rm unstaged

상태 시각화

스태킹에 대한 더 나은 이해를 위해서는 각 단계에서 작업 트리, 인덱스 및 HEAD의 상태를 살펴보는 것이 중요하다고 생각합니다.사용 사례를 살펴보겠습니다.

git init

일해 색인을 달다 머리

echo one >file

일해 색인을 달다 머리
하나.

git add file

일해 색인을 달다 머리
하나. 하나.

git commit

일해 색인을 달다 머리
하나. 하나. 하나.

echo two >>file

일해 색인을 달다 머리
하나. 하나. 하나.
두명

git add file

일해 색인을 달다 머리
하나. 하나. 하나.
두명 두명

echo three >>file

일해 색인을 달다 머리
하나. 하나. 하나.
두명 두명
세개

git diff >unstaged

git restore .

일해 색인을 달다 머리
하나. 하나. 하나.
두명 두명

test

git commit

일해 색인을 달다 머리
하나. 하나. 하나.
두명 두명 두명

git apply unstaged

rm unstaged

일해 색인을 달다 머리
하나. 하나. 하나.
두명 두명 두명
세개

언급URL : https://stackoverflow.com/questions/7650797/how-to-stash-only-unstaged-changes-in-git

반응형