我想在一个分支中合并,而不暂存自动合并的文件进行提交。我预计合并会很混乱,所以我想在提交之前使用git diff检查所有更改。--no-commit标志阻止提交完成,但文件仍被暂存。有没有一种方法可以合并而不暂存要提交的文件?
git diff
--no-commit
06odsfpq1#
如果只是查看,您可以使用git diff --cached查看阶段性更改。这对你的情况有用吗?
git diff --cached
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:
--ours
--theirs
git checkout-index
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,我们强制对分支名称的“更改”为“将其设置为当前值”,即根本不移动它。这使得覆盖索引内容成为唯一可见的效果。
HEAD
git reset --mixed HEAD
--mixed
git reset --mixed *hash*
g6baxovj3#
您可以使用reset将所有在git merge <branch name> --no-commit之后暂存的文件移回未暂存提交的更改中。git reset HEAD -- .
git merge <branch name> --no-commit
git reset HEAD -- .
3条答案
按热度按时间06odsfpq1#
如果只是查看,您可以使用
git diff --cached
查看阶段性更改。这对你的情况有用吗?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将
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
,我们强制对分支名称的“更改”为“将其设置为当前值”,即根本不移动它。这使得覆盖索引内容成为唯一可见的效果。g6baxovj3#
您可以使用reset将所有在
git merge <branch name> --no-commit
之后暂存的文件移回未暂存提交的更改中。git reset HEAD -- .