协慌网

登录 贡献 社区

只存储使用 Git 更改过的多个文件中的一个文件?

如何在我的分支上只隐藏多个已更改文件中的一个?

答案

你也可以使用git stash save -p "my commit message" 。通过这种方式,您可以选择将哪些帅哥添加到藏匿处,也可以选择整个文件。

每个块都会提示您一些操作:

y - stash this hunk
   n - do not stash this hunk
   q - quit; do not stash this hunk or any of the remaining ones
   a - stash this hunk and all later hunks in the file
   d - do not stash this hunk or any of the later hunks in the file
   g - select a hunk to go to
   / - search for a hunk matching the given regex
   j - leave this hunk undecided, see next undecided hunk
   J - leave this hunk undecided, see next hunk
   k - leave this hunk undecided, see previous undecided hunk
   K - leave this hunk undecided, see previous hunk
   s - split the current hunk into smaller hunks
   e - manually edit the current hunk
   ? - print help

警告

正如评论中所指出的,这会将所有内容都放入存储中,无论是分阶段还是非分阶段。 -step-index 只在保存完成后单独留下索引。以后弹出存储时,这可能会导致合并冲突。


这将隐藏您之前未添加的所有内容。只需git add你想要保留的东西,然后运行它。

git stash --keep-index

例如,如果要将旧提交拆分为多个变更集,则可以使用此过程:

  1. git rebase -i <last good commit>
  2. 将某些更改标记为edit
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. 根据需要修复问题。不要忘记git add任何更改。
  7. git commit
  8. git stash pop
  9. 必要时,从#5 开始重复。
  10. git rebase --continue

由于 git 基本上是关于管理所有存储库内容和索引(而不是一个或多个文件),因此git stash交易毫不奇怪, 与所有工作目录

实际上,自 Git 2.13(2017 年第 2 季度)以来,您可以存储单个文件,包括:

git stash push [--] [<pathspec>...]

有关更多信息,请参阅 “存储对特定文件的更改 ”。


原始答案(下面,2010 年 6 月)是关于手动选择您想藏匿的内容。

Casebash评论:

这个( stash --patch原始解决方案)很不错,但我经常修改了很多文件所以使用补丁很烦人

bukzor回答 (upvoted,2011 年 11 月)提出了一个更实际的解决方案,基于
git add + git stash --keep-index
去看看并提出他的答案,这应该是官方的(而不是我的)。

关于该选项, chhh在评论中指出了另一种工作流程:

你应该在这样的藏匿之后 “ git reset --soft ” 来恢复你的明确阶段:
为了达到原始状态 - 这是一个明确的暂存区域,并且只有一些选择的非阶段性修改,可以轻轻地重置索引以获取(不提交像你这样的东西 - bukzor - 确实)。


(原始答案 2010 年 6 月:手动藏匿)

然而, git stash save --patch可以让你实现你所追求的部分git stash save --patch

使用--patch ,您可以交互式地从 HEAD 和工作树之间的差异中选择要存储的数据。
构建存储条目,使其索引状态与存储库的索引状态相同,并且其工作树仅包含您以交互方式选择的更改。然后,从您的工作树中回滚所选更改。

但是,这将保存完整索引(可能不是您想要的,因为它可能包括已编入索引的其他文件),以及部分工作树(可能看起来像您要隐藏的那个)。

git stash --patch --no-keep-index

可能更适合。


如果--patch不起作用,手动过程可能会:

对于一个或多个文件,中间解决方案是:

  • 将它们复制到 Git 仓库之外
    (实际上, eleotlecram提出了一个有趣的选择
  • git stash
  • 把它们复制回去
  • git stash #这次,只有你想要的文件被藏起来了
  • git stash pop stash@{1} #重新应用所有文件修改
  • git checkout -- afile #在任何本地修改之前将文件重置为 HEAD 内容

在相当繁琐的过程结束时,您将只有一个或几个文件被藏起来。