例如,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
更改(即“要提交的更改”,而不是未分级的更改或未跟踪的文件),以便我可以将它们转移到另一个分支?
答案 0 :(得分:15)
Git的基本存储机制是&#34;提交&#34; - 事实上,所有git stash
都会做一些不寻常的提交 - 所以Nick Volynkin's answer是正确的一。它可能会使用一些扩展,并且有更容易(好的,可能更容易)的方法。
我不是git stash
的忠实粉丝,但如果你习惯使用它,这里是最简单的其他方法:
git stash save
(又名git stash
)。这将写入两个提交,一个基于当前索引,另一个用于保存尚未停止的工作树文件。 (如果你需要保存未跟踪的文件,你可以添加-u
标志,然后存储脚本添加第三次提交。通常你可以将这些未跟踪的文件留在你的周围但工作树没有跟踪。)这些提交不在任何分支上,它们只在特殊的&#34; stash&#34; REF。与此同时,你仍然处于“错误”状态。分支,我将在下面打wrongbr
。
git checkout
您想要的分支。现在你进入正确的分支。
git stash apply --index
。这使用在步骤1中进行的特殊存储提交,同时将它们保存在存储中(apply
)。 --index
非常重要:它告诉存储脚本保持索引和非分页文件分开,即,让您回到之前的暂存和非暂存设置。
如果一切顺利,您现在可以git commit
对您想要的分支进行更改apply
。先前暂存的文件将再次暂存,并且未暂存的文件仍未分级,因为您--index
使用git stash apply
存储了存储空间。提交将提交暂存文件,使未分段文件保持未分级状态。
现在你可以回到另一个&#34;错误&#34;分支(最初创建存储的地方)和git stash pop
或--index
有或没有git reset --hard
。您可能需要清除所有未暂存的文件(这样做是安全的,它们仍然存在):git checkout wrongbr
,然后是git stash pop
,然后是pop
。请注意,apply
仅为drop
,后跟apply
:我们并未希望 删除第3步中的藏匿处(stash拥有原始修改但未停止文件的唯一副本),这就是我们在那里使用pop
的原因,但现在我们(大概)做想要删除存储,所以使用stash
就行了。
在第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
。这里有三种可能的情况:
另一个分支尚不存在。大!使用git commit
创建它,从现在开始。然后是git rebase
。你已经完成了,除非你想要将新分支重新开始,而不是从现在开始的地方开始#34;。如果是这样,请在新分支上使用git checkout otherbranch
。请注意,在您处理了未分段的文件之后,您可以在以后执行该rebase。
另一个分支确实存在,幸运的是 - git checkout
正常工作。做到并承诺,你就完成了。然后,您可以git checkout
为未分段文件分配所需的分支。
最烦人的情况:另一个分支确实存在,但stash
告诉您,您将覆盖您尚未提交的内容。
案例3是您需要提交或存储的案例。
这里做什么取决于你最满意的。例如,您可以尝试上述四步git stash
方法作为最简单的替代方法。
对于我自己来说,我现在只是承诺,错误的&#34;分支,然后再次提交(或使用git cherry-pick
)来取消未受影响的文件。这给了我一个git commit
进入右分支的提交。这是一个可能有效的示例序列:
wrongbr
进行提交,但是&#34;错误&#34;分支(让我们调用您当前的分支git stash save
以供参考)。-u
保存未分段的更改(或使用git checkout
保存未跟踪的文件)。git checkout rightbr
您希望提交的分支,例如git cherry-pick wrongbr
。git commit
。如果成功,那就好;如果没有,请根据需要编辑文件以在合并问题后进行清理,然后git checkout wrongbr
结果。git reset --hard HEAD^
:我们现在将通过删除在步骤4中复制的提交来解决此问题。git stash pop
:这会丢弃我们复制的提交。git stash apply && git stash drop
(或apply
执行相同的操作,drop
变体只是让您有机会在藏匿git cherry-pick
之前检查结果。注意这里的第4步:wrongbr
接受命名提交(wrongbr
的提示,其中包含我们想要的提交,只是在错误的分支上),将其与其父进行比较,然后尝试将生成的diff应用于当前分支。如果当前分支中的文件与rightbr
中的相应文件差别很大,则可能需要进行3向合并。这只是在简单检查git checkout rightbr
并最初提交的情况下发生并发症的地方。也就是说,我们正在做这个长版本,因为&#34;最烦人的&#34;在我们提交之前尝试stash
时发生了这种情况,因此我们很有可能需要做一些修复。这也可能会导致原始的4步{{1}}方法出现问题。
答案 1 :(得分:3)
提交这些文件,然后重新提交提交。
答案 2 :(得分:2)
存储所有内容,但保留索引(此存储将暂存(来自git stash --keep-index
)和非阶段编辑):
git stash
存储索引,这是在步骤1中的存储之后剩下的所有内容(这就是您要存储的内容)。
stash@{1}
弹出或应用(更安全)拥有它的藏品,即步骤1中的藏品(现在位于stash@{0}
,因为最新的藏匿处始终为git stash apply stash@{1}
)。
stash@{0}
从HEAD
git checkout HEAD ./path/to/files/to/reset ./another/path/to/other/file/to/reset
中的文件
git reset HEAD --hard
如果您在第4步中陷入困境,请尝试btn
消除所有本地更改,然后在第3步重新开始。