有没有办法可以隐藏我的分阶段变化?我遇到问题的情况是,我在给定时间处理了几个错误,并且有几个未分阶段的更改.我希望能够单独存档这些文件,创建我的.patch文件,并将它们存放起来,直到代码被批准为止.这样,当它被批准时,我可以存储我的整个(当前)会话,弹出该错误并推送代码.
我是以错误的方式来做这件事的吗?我是否误解了git如何以其他方式工作以简化我的流程?
Bar*_*zyk 404
是的,无论是否相信,它都是可能的 :DOUBLE STASH:
git stash --keep-index
.此命令将创建一个包含所有更改(暂存和未暂存)的存储,但会在工作目录中保留暂存的更改(仍处于暂存状态).git stash push -m "good stash"
"good stash"
已经ONLY上演文件.现在,如果您在存储之前需要非暂存文件,只需应用第一个存储(使用创建的--keep-index
存储),现在您可以删除存储到的文件"good stash"
.
请享用
Von*_*onC 181
在 Git 2.35(2022 年第 1 季度)中,“ git stash
” (man)学会了--staged
隐藏已添加到索引中的内容(仅此而已)的选项。
所以这现在得到了官方支持(8年后)。
请参阅提交 a8a6e06(2021 年 10 月 28 日)和提交 41a28eb(2021 年 10 月 18 日),作者:Sergey Organov ( sorganov
)。
(由Junio C Hamano 合并 -- gitster
--在提交 44ac8fd中,2021 年 11 月 29 日)
stash
:为“推送”和“保存”实施“--staged”选项签署人:谢尔盖·奥加诺夫
仅存储已上演的更改。
此模式允许轻松隐藏一些与当前正在进行的工作无关的更改,以供以后重用。
与 '
stash push --patch
' 不同,--staged
支持使用任何工具来选择对 stash-out 的更改,包括但不限于 'git add --interactive
' ( man )。
git stash
现在包含在其手册页中:
'git stash' [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--quiet]
git stash
现在包含在其手册页中:
save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]
git stash
现在包含在其手册页中:
-S
--staged
push
该选项仅对和命令有效save
。仅存储当前正在进行的更改。这与基本类似
git commit
,只是状态被提交到存储而不是当前分支。该
--patch
选项优先于该选项。
git stash
现在包含在其手册页中:
Saving unrelated changes for future use
当您正在进行大规模更改并且发现一些您不想忘记修复的不相关问题时,您可以进行更改,暂存它们,并将
git stash push --staged
它们存放起来以供将来使用。
这类似于提交分阶段的更改,只是提交最终位于存储中而不是当前分支上。Run Code Online (Sandbox Code Playgroud)---------------------------------------------------------------- # ... hack hack hack ... $ git add --patch foo # add unrelated changes to the index $ git stash push --staged # save these changes to the stash # ... hack hack hack, finish curent changes ... $ git commit -m 'Massive' # commit fully tested changes $ git switch fixup-branch # switch to another branch $ git stash pop # to finish work on the saved changes ----------------------------------------------------------------
Som*_* S. 127
TL;DR只需
-- $(git diff --staged --name-only)
为您的 git<pathspec>
参数添加
git stash -- $(git diff --staged --name-only)
Run Code Online (Sandbox Code Playgroud)
并简单地添加一条消息:
git stash push -m "My work in progress" -- $(git diff --staged --name-only)
Run Code Online (Sandbox Code Playgroud)
在v2.17.1和v2.21.0.windows.1上测试
限制:
- 请注意,如果您没有暂存文件,这将隐藏所有内容。
- 此外,如果您有一个仅部分暂存的文件(即只有一些已更改的行已暂存,而其他一些已更改的行未暂存),则整个文件将被隐藏(包括未暂存的行)。
Eug*_*kov 97
使用最新的git,您可以使用--patch
选项
git stash push --patch
Run Code Online (Sandbox Code Playgroud)
并且git会要求您将文件中的每个更改添加或不添加到存储中.你只需回答y
或n
小智 47
我创建了一个脚本,只保存当前暂存的内容,并保留其他所有内容.当我开始做太多无关的更改时,这很棒.简单地发布与所需提交无关的内容并将其存储起来.
(感谢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}
Run Code Online (Sandbox Code Playgroud)
Ram*_*man 11
在 Git 中仅存储索引(分阶段更改)比应有的更困难。我发现@Joe 的答案效果很好,并将它的一个小变化变成了这个别名:
stash-index = "!f() { \
! git diff --cached --exit-code --quiet && \
git stash push --quiet --keep-index -m \"temp for stash-index\" && \
git stash push \"$@\" && \
git stash pop --quiet stash@{1} && \
git stash show -p | git apply -R; }; f"
Run Code Online (Sandbox Code Playgroud)
它:
验证是否存在实际分阶段更改(git diff --cached --exit-code
如果有则返回非零状态)。HT:@nandilugio
这必将推动双方的演出和未分级变成一个临时藏匿处,留下独自上演的变化。
然后它将分阶段的更改推送到 stash 中,这是我们想要保留的 stash。传递给别名的参数,例如--message "whatever"
将添加到此 stash 命令中。
它弹出临时存储以恢复原始状态并删除临时存储,然后
最后通过反向补丁应用程序从工作目录中“删除”隐藏的更改。
对于仅存储未暂存更改(别名stash-working
)的相反问题,请参阅此答案。
在这种情况下,我更愿意为每个问题创建新的分支。我使用前缀temp /,所以我知道以后可以删除这些分支。
git checkout -b temp/bug1
Run Code Online (Sandbox Code Playgroud)
暂存修复bug1的文件并提交。
git checkout -b temp/bug2
Run Code Online (Sandbox Code Playgroud)
然后,您可以根据需要从各个分支中挑选提交,并提交拉取请求。
为什么不为某个bug提交更改并从该提交及其前身创建补丁?
# 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
Run Code Online (Sandbox Code Playgroud)
然后,要创建适当的补丁,请使用git format-patch
:
git format-patch HEAD^^
Run Code Online (Sandbox Code Playgroud)
这将创建两个文件:0001-fix-bug-123.patch
和0002-fix-bug-321.patch
或者,您可以为每个错误创建单独的分支,因此您可以单独合并或重新定义错误修复,如果它们无法解决,甚至可以删除它们.
为了完成同一件事...
git commit -m 'temp'
git add .
git stash
git reset HEAD~1
繁荣。不需要的文件被保存起来。所需的文件已准备就绪。
归档时间: |
|
查看次数: |
78345 次 |
最近记录: |