例如,a 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/[....]/
Run Code Online (Sandbox Code Playgroud)
(我已经空白了文件名)
我将如何git add隐藏我所做的更改(即"要提交的更改",而不是未分级的更改或未跟踪的文件),以便我可以将它们转移到另一个分支?
tor*_*rek 16
Git的基本存储机制是"提交" - 事实上,所有这些git stash都是做出一些不同寻常的提交 - 所以Nick Volynkin的答案是正确的.它可能会使用一些扩展,并且有更容易(好的,可能更容易)的方法.
我不是很喜欢git stash,但如果你习惯使用它,这里是最简单的其他方法:
git stash save(又名git stash).这将写入两个提交,一个基于当前索引,另一个用于保存尚未停止的工作树文件.(如果你需要保存未跟踪的文件,你可以添加-u标志,然后存储脚本添加第三次提交.通常你可以将这些未跟踪的文件留在工作树中,而不是未跟踪的.)这些提交不在任何分支,他们只在特殊的"藏匿"参考.与此同时,你仍然处于"错误"的分支,我将wrongbr在下面称之为.
git checkout你想要这些分支.现在你在正确的分支上.
git stash apply --index.这使用在步骤1中进行的特殊存储提交,同时将它们留apply在存储中的那里().这--index非常重要:它告诉存储脚本将索引和未分段文件分开,即返回先前的暂存和非暂存设置.
如果一切顺利,您现在可以git commit根据需要对分支进行更改.先前暂存的文件再次暂存,未分段的文件仍然未分级,因为您使用apply了存储--index.提交将提交暂存文件,使未分段文件保持未分级状态.
现在你可以回到另一个"错误的"分支(你最初创建了藏匿处)和/ git stash apply或git stash pop有或没有--index.您可能需要清除任何不分阶段的文件(和它的安全的话,他们还是在藏匿)git reset --hard,其次git checkout wrongbr,然后git stash pop.请注意,pop只是apply后面drop:我们不希望到落藏匿在第3步(藏匿具有原始修改,但是,不分阶段的文件的唯一副本),这就是为什么我们使用apply那里,但现在我们(大概)我想放下藏匿物,所以使用pop就可以了.
但是,第3步中存在很大的潜在缺陷:存储可能无法正确应用.如果是这样,您必须使用其他方法.这是我不喜欢这个stash系统的一个原因:它在困难的情况下会崩溃,如果你不使用,你需要知道你可以使用的工具stash.在这种情况下,您可以在大多数时间使用这些工具......然后stash在您确定可行的情况下使用它作为方便的快捷方式.
背景:提交采用索引中的任何git ls-files --cached内容 - 将显示完整的内容,同时将其git status修改为"有趣的"并添加其他有用的信息 - 并使用所有必需的树对象进行提交,以及上.新提交的父提交是当前提交之前的任何提交.
您希望在另一个分支上进行新的提交.一种方法是在现有分支上立即制作; 然后将该提交复制到另一个分支上的新的不同提交.要执行"在不同分支上复制提交到新的,不同的提交",您可以使用git cherry-pick.确实,您可以使用git rebase:在封面下,它使用git cherry-pick自己.但rebase它不是一个正确的工具:它是为集体挑选樱桃而设计的,而你只有一个提交; 最后它用于git reset移动分支标签,但不是你想要的方式.你可以使它工作,但有一些更合适的工具.
让我们回到最初的问题:你想要获取当前索引并使用它来进行新的提交,但是在另一个分支上.如果您现在可以切换到另一个分支而不执行任何其他操作,那么这将是最简单的,然后进行新的提交.
你可以做到这一点很有可能.只是git checkout otherbranch然后git commit.这里有三种可能的情况:
另一个分支尚不存在.大!使用git checkout -b newbranch来创建它,从你现在在哪里开始.然后git commit.你已经完成了,除非你想把新分支重新开始从"你现在所在的地方"以外的地方开始.如果是这样,请git rebase在新分支上使用.请注意,在您处理了未分段的文件之后,您可以在以后执行该rebase.
另一个分支确实存在,而且 - 幸运的是 - 你的git checkout otherbranch工作正常.做到并承诺,你就完成了.然后,您可以git checkout为未分段文件分配所需的分支.
最烦人的情况:另一个分支确实存在,但git checkout告诉你你将覆盖你没有提交的东西.
案例3是您需要提交或存储的案例.
这里做什么取决于你最舒服的.例如,您可以尝试上述四步法stash作为最简单的替代方法.
但是对于我自己,我现在只是在"错误的"分支上提交,然后再次提交(或使用git stash)以使未分段的文件不受影响.这给了我一个可以git cherry-pick进入正确分支的提交.这是一个可能有效的示例序列:
git commit进行提交,但是在"错误"分支上(让我们调用你当前的分支wrongbr以供参考).git stash save保存未分级的更改(或者,使用-u未跟踪的文件).git checkout你希望提交的分支,例如,git checkout rightbr.git cherry-pick wrongbr.如果成功,那就好; 如果没有,根据需要编辑文件以在合并发布后清理,然后git commit是结果.git checkout wrongbr:我们现在将通过删除在步骤4中复制的提交来解决此问题.git reset --hard HEAD^:这会丢弃我们复制的提交.git stash pop(或者git stash apply && git stash drop做同样的事情,apply变体只是让你有机会drop在藏匿之前检查结果).注意这里的步骤4:git cherry-pick获取命名提交(提示wrongbr,其中包含我们想要的提交,只是在错误的分支上),将其与其父进行比较,然后尝试将生成的diff应用于当前分支.如果当前分支中的文件与其中的相应文件有很大不同,则可能需要进行3向合并wrongbr.这与在rightbr最初检查和提交的简单情况下发生并发症的地方相同.也就是说,我们正在做这个长版本,因为当我们尝试git checkout rightbr提交之前发生了"最烦人"的情况,所以我们很有可能需要做一些修复.这也可能导致原始的4步法出现问题stash.
小智 7
Git 有一个内置标志,仅存储已提交的文件,即仅添加已暂存的文件,而不是未暂存的更改或未跟踪的文件。
git stash push --staged
如果你赶时间:
git stash push -S
| 归档时间: |
|
| 查看次数: |
9602 次 |
| 最近记录: |