只收藏Git中没有上演的变化

Una*_*dra 193 git git-stash

我想做以下工作流程:

  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
Run Code Online (Sandbox Code Playgroud)

vha*_*lac 259

git stash save有一个选项--keep-index,完全符合您的需要.

所以,跑git stash save --keep-index.

  • 注意:这仍然会隐藏_all_您的更改; 与常规`git stash save`的唯一区别在于它也会在工作副本中留下已经分阶段的更改.在上面的工作流程中,这可以正常工作,因为你只是在已经拥有一半存储变化的本地副本上应用存储(git足够聪明,可以忽略).但是,如果在重新应用存储之前编辑代码,则在申请时可能会看到合并冲突.仅供参考. (90认同)
  • 由于peterflynn描述的问题,这个解决方案对我不起作用.这个问题不是一个好的答案,因为它仍然存在着分阶段的变化.有人有更好的解决方案吗? (17认同)
  • 真正.我继续使用`git stash`的`save`.也许是我的程序员坚持用apply/pop来表达对称性.:) (9认同)
  • 它不执行问题所要求的操作。它创建一个包含所有修改(包括索引)的存储。它的不同之处在于它不会“重置”索引。但如果您自己重置索引然后“stash pop”,索引将被恢复。问题是关于创建一个不包含索引文件的存储。 (4认同)
  • 文档似乎说“stash save”现在已被弃用:“此选项已被弃用,取而代之的是“git stash push”。它与“stash Push”的不同之处在于它不能采用路径规范,并且任何非选项参数都会形成消息”。 (3认同)
  • @ytpete那次咬了我很多次.我真的希望有一种方法让git只能隐藏你没有保留的东西......我经常提交东西,然后做一个完整的git stash,知道我可以`git commit --ammend`如果有什么问题我承诺了. (2认同)
  • `--amend` (而不是 `--amend`) (2认同)
  • @peterflynn 在这种情况下你可以使用`git diff`。使用`git diff > ~/patch`导出暂存区和工作区之间的更改,`git checkout`丢弃工作区的更改,对暂存区做你需要做的事情,然后`git apply ~ /patch` 恢复保存的更改。 (2认同)

pd9*_*d93 51

从 Git 2.35+(2022 年第 1 季度)开始,您现在可以使用--staged标志 ( man ) on仅存储索引中的git stash push更改。

由于您的问题提出了完全相反的问题,我们有 2 个选择:

  1. 像这样反转操作:
git stash push --staged            # Stash staged changes
git stash                          # Stash everything else
git stash pop stash@{1}            # Restore staged changes stash
Run Code Online (Sandbox Code Playgroud)
  1. 暂存您想要隐藏的更改,而不是您想要保留的更改。现在你可以运行:
git stash push --staged
Run Code Online (Sandbox Code Playgroud)

我从另一个 S/O 帖子的答案中得到了这个信息。


ale*_*zik 32

这可以通过3个步骤完成:保存分阶段更改,存储其他所有内容,使用分阶段更改恢复索引.基本上是:

git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^
Run Code Online (Sandbox Code Playgroud)

这将完全符合您的要求.

  • @vas 不,该方法不会重复这一点。请参阅 peterflynn 对已接受答案的评论。 (7认同)
  • 注意:`-u` 也会隐藏未跟踪的文件。 (3认同)

seh*_*ehe 26

git stash save --keep-index
Run Code Online (Sandbox Code Playgroud)

另外,Re:

为什么不在升级后提交更改? - 申

答:因为你应该经常签入经过测试的代码:)这意味着,你需要只用你要提交的更改来运行测试

所有这一切除了当然,作为一名经验丰富的程序员,你有天生的冲动来测试和审查这些变化 - 只是部分开玩笑


Ram*_*man 16

在 Git 中仅存储工作树(未暂存的更改)比应有的要困难得多。接受的答案隐藏了未分阶段的更改,但也隐藏了分阶段的更改(并使它们也分阶段),这很少是您想要的。

这个别名效果很好:

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

它临时提交暂存的更改,从剩余的更改中创建一个存储(并允许额外的参数,例如--include-untracked--message作为别名参数传递),然后重置临时提交以取回暂存的更改。

它类似于@Simon Knapp 的回答,但有一些细微的差别——它用于--quiet采取的临时操作,并且它接受任意数量的 stash 参数push,而不是硬编码-m,它确实添加--soft到最终重置以便索引保持它开始时的状态。它还用于--no-verify提交以避免从预提交挂钩(HT:@Granfalloner)更改工作副本。

对于仅存储分阶段更改(别名stash-index)的相反问题,请参阅此答案

  • 作为对此代码段的进一步改进,值得将 [`--no-verify`](https://git-scm.com/docs/githooks) 选项添加到 `git commit` 中,否则隐式临时提交可能会严重混乱由于预提交挂钩而向上工作目录。 (5认同)
  • @Lotus 尝试将其直接按原样复制到“.gitconfig”的“[alias]”部分。这样,“zsh”就完全不参与了。 (2认同)

Eug*_*kov 11

有了git version 2.7.4你可以这样做:

git stash save --patch
Run Code Online (Sandbox Code Playgroud)

git会要求你添加或不更改为藏匿.
然后你只需回答yn

您可以像往常一样恢复工作目录:

git stash pop
Run Code Online (Sandbox Code Playgroud)

或者,如果您想保存已保存的存储更改:

git stash apply
Run Code Online (Sandbox Code Playgroud)


srt*_*h12 9

要将未标记(未添加到提交)的文件添加到 stash,请运行以下命令:

git stash -k
Run Code Online (Sandbox Code Playgroud)

如果您想将新添加的文件(未暂存 - 不是绿色)也包含到存储中,请执行以下操作:

git stash -k -u
Run Code Online (Sandbox Code Playgroud)

然后您可以提交暂存文件。之后,您可以使用以下命令取回最后保存的文件:

git stash pop
Run Code Online (Sandbox Code Playgroud)


ma1*_*w28 7

Git 没有只存储未暂存更改的命令。

然而,Git 确实允许您指定要存储哪些文件。

git stash push --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb
Run Code Online (Sandbox Code Playgroud)

如果您只想在这些文件中存储特定更改,请添加该--patch选项。

git stash push --patch --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb
Run Code Online (Sandbox Code Playgroud)

--include-untracked选项允许您隐藏未跟踪的文件。

git stash push --include-untracked --message 'Untracked files' -- app/controllers/widgets_controller.rb test/controllers/widgets_controller_test.rb
Run Code Online (Sandbox Code Playgroud)

运行git help stash(或man git-stash)以获取更多信息。

注意:如果您的未暂存更改相当杂乱,@alesguzik 的答案可能更容易。


Rhu*_*arb 5

扩展之前的答案,我有时会进行一系列复杂的更改,但希望首先进行单独的更改.例如,我可能已经发现了一个错误或其他错误的代码,我想在我的分阶段更改之前修复.一条可能的路线是:

首先存放一切,但保持分阶段的变化完好无损

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

现在也分别存储分阶段的更改

$ git stash save

为修复做出改变; 和测试; 提交他们:

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

$ git commit -m"fix ..."

现在恢复以前上演的更改:

$ git stash pop

解决任何冲突,并注意如果有冲突,git将应用但删除顶部存储条目.

(...然后提交暂存的更改,并恢复所有其他更改的存储,并继续...)