你如何只存储已添加的文件?

时间:2015-05-20 20:37:10

标签: git git-stash

例如,git status给出以下内容:

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

    modified:   app/src/[....]
    modified:   app/src/[....]
    new file:   app/src/[....]
    deleted:    app/src/[....]
    modified:   app/src/[....]
    modified:   test/unit/[....]
    modified:   test/unit/[....]
    new file:   test/unit/[....]
    deleted:    test/unit/[....]
    modified:   test/unit/[....]

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:   test/unit/[....]

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    app/src/[....]/
    app/src/[....]/
    app/src/[....]/

(我已将文件名留空)

我如何隐藏我所拥有的git add更改(即“要提交的更改”,而不是未分级的更改或未跟踪的文件),以便我可以将它们转移到另一个分支?

3 个答案:

答案 0 :(得分:15)

Git的基本存储机制是&#34;提交&#34; - 事实上,所有git stash都会做一些不寻常的提交 - 所以Nick Volynkin's answer是正确的一。它可能会使用一些扩展,并且有更容易(好的,可能更容易)的方法。

我不是git stash的忠实粉丝,但如果你习惯使用它,这里是最简单的其他方法:

  1. git stash save(又名git stash)。这将写入两个提交,一个基于当前索引,另一个用于保存尚未停止的工作树文件。 (如果你需要保存未跟踪的文件,你可以添加-u标志,然后存储脚本添加第三次提交。通常你可以将这些未跟踪的文件留在你的周围但工作树没有跟踪。)这些提交不在任何分支上,它们只在特殊的&#34; stash&#34; REF。与此同时,你仍然处于“错误”状态。分支,我将在下面打wrongbr

  2. git checkout您想要的分支。现在你进入正确的分支。

  3. git stash apply --index。这使用在步骤1中进行的特殊存储提交,同时将它们保存在存储中(apply)。 --index非常重要:它告诉存储脚本保持索引和非分页文件分开,即,让您回到之前的暂存和非暂存设置。

    如果一切顺利,您现在可以git commit对您想要的分支进行更改apply。先前暂存的文件将再次暂存,并且未暂存的文件仍未分级,因为您--index使用git stash apply存储了存储空间。提交将提交暂存文件,使未分段文件保持未分级状态。

  4. 现在你可以回到另一个&#34;错误&#34;分支(最初创建存储的地方)和git stash pop--index有或没有git reset --hard。您可能需要清除所有未暂存的文件(这样做是安全的,它们仍然存在):git checkout wrongbr,然后是git stash pop,然后是pop。请注意,apply仅为drop,后跟apply:我们并未希望 删除第3步中的藏匿处(stash拥有原始修改但未停止文件的唯一副本),这就是我们在那里使用pop的原因,但现在我们(大概)想要删除存储,所以使用stash就行了。

  5. 在第3步中存在很大的潜在缺陷:可能存储无法正确应用。如果是这样,您必须使用其他方法。这是我不喜欢stash系统的一个原因:它在困难的情况下会崩溃,如果您不使用stash,您需要知道可以使用的工具。在这种情况下,您可以在大多数时间使用这些工具......然后使用git ls-files --cached作为方便的捷径,以确保您确定它可以正常工作。

    背景:提交现在采用索引中的任何内容 - git status将显示完整的内容,而git cherry-pick将其修改为&#34;有趣的&#34;一些并添加其他有用的信息 - 并使用所有必需的树对象等来提交它们。新提交的父提交是当前提交之前的任何提交。

    您希望在另一个分支上进行新的提交。一种方法是在现有分支上立即制作;然后将该提交复制到另一个分支上的新的不同提交。要做&#34;复制提交到不同分支上的新的,不同的提交&#34;你可以使用git rebase。确实可以使用git cherry-pick:在封面下,它使用rebase本身。但是git reset并不是一个非常合适的工具:它专为大量采摘樱桃而设计,你只需要一次提交;最后,它使用git checkout otherbranch来移动分支标签,但不是以你想要的方式。你可以使它工作,但有一些更合适的工具。

    让我们回到原来的问题:你想要获取当前索引并使用它来进行新的提交,但在另一个分支上。如果您现在可以切换到另一个分支而不执行任何其他操作,那么这将是最简单的,然后进行新的提交。

    可以做这件事的机会很好。只需git commit然后git checkout -b newbranch。这里有三种可能的情况:

    1. 另一个分支尚不存在。大!使用git commit创建它,从现在开始。然后是git rebase。你已经完成了,除非你想要将新分支重新开始,而不是从现在开始的地方开始#34;。如果是这样,请在新分支上使用git checkout otherbranch。请注意,在您处理了未分段的文件之后,您可以在以后执行该rebase。

    2. 另一个分支确实存在,幸运的是 - git checkout正常工作。做到并承诺,你就完成了。然后,您可以git checkout为未分段文件分配所需的分支。

    3. 最烦人的情况:另一个分支确实存在,但stash告诉您,您将覆盖您尚未提交的内容。

    4. 案例3是您需要提交或存储的案例。

      这里做什么取决于你最满意的。例如,您可以尝试上述四步git stash方法作为最简单的替代方法。

      对于我自己来说,我现在只是承诺,错误的&#34;分支,然后再次提交(或使用git cherry-pick)来取消未受影响的文件。这给了我一个git commit进入分支的提交。这是一个可能有效的示例序列:

      1. wrongbr进行提交,但是&#34;错误&#34;分支(让我们调用您当前的分支git stash save以供参考)。
      2. -u保存未分段的更改(或使用git checkout保存未跟踪的文件)。
      3. git checkout rightbr您希望提交的分支,例如git cherry-pick wrongbr
      4. git commit。如果成功,那就好;如果没有,请根据需要编辑文件以在合并问题后进行清理,然后git checkout wrongbr结果。
      5. git reset --hard HEAD^:我们现在将通过删除在步骤4中复制的提交来解决此问题。
      6. git stash pop:这会丢弃我们复制的提交。
      7. git stash apply && git stash drop(或apply执行相同的操作,drop变体只是让您有机会在藏匿git cherry-pick之前检查结果。
      8. 注意这里的第4步:wrongbr接受命名提交(wrongbr的提示,其中包含我们想要的提交,只是在错误的分支上),将其与其父进行比较,然后尝试将生成的diff应用于当前分支。如果当前分支中的文件与rightbr中的相应文件差别很大,则可能需要进行3向合并。这只是在简单检查git checkout rightbr并最初提交的情况下发生并发症的地方。也就是说,我们正在做这个长版本,因为&#34;最烦人的&#34;在我们提交之前尝试stash时发生了这种情况,因此我们很有可能需要做一些修复。这也可能会导致原始的4步{{1}}方法出现问题。

答案 1 :(得分:3)

提交这些文件,然后重新提交提交。

答案 2 :(得分:2)

  1. 存储所有内容,但保留索引(此存储将暂存(来自git stash --keep-index)和非阶段编辑):

    git stash

  2. 存储索引,这是在步骤1中的存储之后剩下的所有内容(这就是您要存储的内容)。

    stash@{1}

  3. 弹出或应用(更安全)拥有它的藏品,即步骤1中的藏品(现在位于stash@{0},因为最新的藏匿处始终为git stash apply stash@{1})。

    stash@{0}

  4. HEAD

    中查看最初添加到索引中的文件,即git checkout HEAD ./path/to/files/to/reset ./another/path/to/other/file/to/reset中的文件

    git reset HEAD --hard

  5. 如果您在第4步中陷入困境,请尝试btn消除所有本地更改,然后在第3步重新开始。