Git合并,无需暂存更改

np8igboo  于 2023-05-12  发布在  Git
关注(0)|答案(3)|浏览(122)

我想在一个分支中合并,而不暂存自动合并的文件进行提交。我预计合并会很混乱,所以我想在提交之前使用git diff检查所有更改。--no-commit标志阻止提交完成,但文件仍被暂存。有没有一种方法可以合并而不暂存要提交的文件?

06odsfpq

06odsfpq1#

如果只是查看,您可以使用git diff --cached查看阶段性更改。这对你的情况有用吗?

2nc8po8w

2nc8po8w2#

不知道
技术上的原因是Git的合并实际上发生在索引中,索引被临时扩展,以保存所有三个输入提交。当每个文件成功合并(没有冲突)时,Git会将该特定索引项缩回到单个插槽-零项-因此该插槽将被提交。对于冲突的文件,Git将该索引条目保留为三个已占用的插槽,编号为1(merge base)、2(--ours或HEAD commit version)和3(--theirs)。
在合并过程中,工作树文件大多数都是空白的,除了Git会更新它们以保持合并的尝试。所有的真实的操作都在索引中。如果一切顺利,所有的工作树文件都会被更新以匹配最终的slot-zero副本,也就是说,看起来像是Git已经暂存了它们。但实际上它走了另一条路:正确的版本进入到索引中的插槽0,然后Git做了一个git checkout-index风格的操作,将索引文件复制到工作树中。
正如EncryptedWatermelon在评论中所说,你可以在这里使用git reset

git reset HEAD -- <filename>

告诉Git将HEAD提交的条目复制到该文件的索引条目。使用git reset --mixed HEAD,可以拼写为git reset,没有任何选项,告诉Git对 every 文件执行此操作。1像这样使用git reset没有直接/立即的价值,因为如果你想查看文件的更新索引副本发生了什么,你可以使用git diff --cached来比较HEAD和索引。但是如果你喜欢,你可以这样做,如果你想取消所有的舞台,然后只上演一些东西,不管出于什么原因,它都是可用的。
1 git reset--mixed形式也会指示Git更新当前分支名称,以便其存储的哈希ID是其当前存储的哈希ID。如果将其拼写为git reset --mixed *hash*,则将从指定的哈希ID重置索引,并将指定的哈希ID写入当前分支名称。通过使用HEAD,我们强制对分支名称的“更改”为“将其设置为当前值”,即根本不移动它。这使得覆盖索引内容成为唯一可见的效果。

g6baxovj

g6baxovj3#

您可以使用reset将所有在git merge <branch name> --no-commit之后暂存的文件移回未暂存提交的更改中。
git reset HEAD -- .

相关问题