Git에서 단계별 변경 사항만 저장하는 방법은 무엇입니까?
다음 워크플로우를 사용합니다.
- 몇 가지 변경 사항을 준비합니다.
- 스테이징되지 않은 변경 내용을 스택에 저장합니다.
- 단계에 있는 것들(빌드, 테스트 등)로 몇 가지 작업을 수행합니다.
- 저지르다.
- 준비되지 않은 변경 사항을 복원합니다.
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
인덱스의 변경 내용만 준비합니다.
당신의 질문은 정반대이기 때문에, 우리는 두 가지 선택지가 있습니다.
- 다음과 같이 작동을 반대로 합니다.
git stash push --staged # Stash staged changes
git stash # Stash everything else
git stash pop stash@{1} # Restore staged changes stash
- 보관할 변경사항 대신 저장할 변경사항을 준비합니다.이제 실행할 수 있습니다.
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
'sourcecode' 카테고리의 다른 글
pathlib가 있는 새 폴더를 만들고 파일을 해당 폴더에 씁니다. (0) | 2023.05.23 |
---|---|
Stuff 및 'For Xml Path'는 SQL Server에서 어떻게 작동합니까? (0) | 2023.05.23 |
열거형 MongoDB 저장 (0) | 2023.05.23 |
(linux touch 명령어와 같이) 윈도우의 명령줄에 빈 파일 만들기 (0) | 2023.05.18 |
git vim 임시 파일 무시 (0) | 2023.05.18 |