Git:如何使用stash -p来存储特定文件?

时间:2014-05-16 20:42:54

标签: git git-stash

我正在试图找出如何在许多未提交的更改中存储两个特定文件。

这个非常有前途的答案,Stash only one file out of multiple files that have changed with Git?,没有显示用法,我无法解决问题。

以下不起作用,手册页不是很有帮助(它似乎谈论终端输出,而不是实际存储)。我想隐藏application.confplugins.sbt,然后提交其他所有内容。

app (master)$ git status
On branch master
Your branch is ahead of 'origin/master' by 29 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   views/mobile/blog.scala.html
        modified:   views/mobile/slideshow.scala.html
        modified:   ../public/css/mobile/styles.css

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

        both modified:   ../conf/application.conf

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

        modified:   ../project/plugins.sbt

app (master)$ git stash -p ../conf/application.conf ../project/plugins.sbt 

usage: git stash list [<options>]
   or: git stash show [<stash>]
   or: git stash drop [-q|--quiet] [<stash>]
   or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
   or: git stash branch <branchname> [<stash>]
   or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
                       [-u|--include-untracked] [-a|--all] [<message>]]
   or: git stash clear

3 个答案:

答案 0 :(得分:25)

使用

git stash --patch
然后,对于您可能提交的每个块, git将显示如下对话框:

diff --git files over files
index e69de29..ac4f3b3 100644
--- a/file.txt
+++ b/file.txt
@@ -0,0 +1 @@
+you did awesome stuff!
Stash this hunk [y,n,q,a,d,/,e,?]?

一个hunk是一个连贯的线条差异,因为git-diff会产生它。要选择单个文件,只要您到达该文件,就必须d ecline添加帅哥,然后您可以从该文件中添加a ll帅哥。

您还可以通过y es回答问题来选择单个大块头。如果大块似乎太大,你甚至可能会s。也可以e dit当前的大块。


可以在不同的git命令(f.e。--patchstashcommit)上使用add - 选项。

这是--patch - 函数的详细解释,我从developers documentation抓取:

This lets you choose one path out of a 'status' like selection.
After choosing the path, it presents the diff between the index
and the working tree file and asks you if you want to stage
the change of each hunk.  You can select one of the following
options and type return:

   y - stage this hunk
   n - do not stage this hunk
   q - quit; do not stage this hunk or any of the remaining ones
   a - stage this hunk and all later hunks in the file
   d - do not stage 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

答案 1 :(得分:6)

不带参数使用git stash -p。然后,您将能够以交互方式选择要隐藏的更改:

diff --git a/test b/test
index acbd8ae..662d47a 100644
--- a/test
+++ b/test
@@ -10,6 +10,7 @@ test
(...)
+    test
(...)
Stash this hunk [y,n,q,a,d,/,e,?]?

不幸的是,它不可能选择文件,只有帅哥。

答案 2 :(得分:1)

在最新版本的Git(&gt; v2.13)中,您可以使用

暂存要隐藏的特定文件
git stash push -- <pathspec>

例如,如果您要存储要隐藏的特定文件,则可以使用此命令专门存储这些文件:

git stash push -- example/file/path/and/file.html

您可以使用通配模式隐藏路径中的特定文件

来节省一些输入
git stash push -- **/path/**

您只想暂存要隐藏的文件,因为任何其他暂存文件都会被特定文件存储,但在存储后也会暂停,所以如果git stash pop您会收到冲突。