我想拆分一个提交,但不确定使用哪个重置选项。
我正在看这页用简单的英语说,“git重置”是做什么的?,但我意识到我并不真正理解git索引或暂存区是什么,因此解释没有帮助。
此外,在我看来,在这个答案中——混合和——软的用例是相同的(当您想修复和重新承诺时)。有人能再详细解释一下吗?我知道,混合可能是最好的选择,但我想知道原因。最后,硬呢?
谁能给我一个工作流程的例子,如何选择3个选项会发生?
我想拆分一个提交,但不确定使用哪个重置选项。
我正在看这页用简单的英语说,“git重置”是做什么的?,但我意识到我并不真正理解git索引或暂存区是什么,因此解释没有帮助。
此外,在我看来,在这个答案中——混合和——软的用例是相同的(当您想修复和重新承诺时)。有人能再详细解释一下吗?我知道,混合可能是最好的选择,但我想知道原因。最后,硬呢?
谁能给我一个工作流程的例子,如何选择3个选项会发生?
当前回答
用最简单的话来说:
——soft:取消提交更改,更改是阶段性的(index)。 ——mixed(默认):uncommit + unstage变更,变更留在工作树中。 ——难:uncommit + unstage + delete changes,什么都不剩。
其他回答
-混合vs -软vs -硬:
--mixed:
Delete changes from the local repository and staging area.
It won't touch the working directory.
Possible to revert back changes by using the following commands.
- git add
- git commit
Working tree won't be clean.
--soft:
Deleted changes only from the local repository.
It won't touch the staging area and working directory.
Possible to revert back changes by using the following command.
- git commit.
Working tree won't be clean
--hard:
Deleted changes from everywhere.
Not possible to revert changes.
The working tree will be clean.
注意:如果提交被确认到本地存储库并放弃这些提交,我们可以使用:
`git reset command`.
但是如果提交被确认到远程存储库,那么不建议使用reset命令,我们必须使用revert命令来丢弃远程提交。
后悔的三种类型
许多现有的答案似乎并不能回答实际的问题。它们是关于命令做什么,而不是关于你(用户)想要什么——用例。但那正是警察问的!
在给出git reset命令时,你会后悔什么,这样的描述可能更有帮助。假设我们有这个:
A - B - C - D <- HEAD
以下是一些可能会让你后悔的事情,以及应对方法:
1. 我很遗憾B, C, D不是一个人。
git重置——软A,我现在可以立即提交,从A开始的所有更改都是一次提交。
2. 我很遗憾B、C和D不是两次提交(或十次提交,或其他)。
提交已经消失,索引回到了A,但是工作区域看起来仍然和d之后一样。所以现在我可以在一个完全不同的分组中添加并提交。
3.我很遗憾B, C, D发生在这支树枝上;我希望我在A之后有一个分支它们发生在另一个分支上。
在另一个分支上创建一个新的分支,然后git重置——硬a。当前分支现在结束于a,其他分支起源于它,包含B、C和D。
(当然,你也可以使用硬重置,因为你希望B、C和D从未发生过。)
git reset命令各选项的基本区别如下。
——soft:只重置HEAD到你选择的提交。工作原理与git签出基本相同,但不创建分离的头部状态。 ——mixed(默认选项):将HEAD重置为您在历史记录中选择的提交,并撤消索引中的更改。 ——hard:将HEAD重置为您在历史记录中选择的提交,撤消索引中的更改,并撤消工作目录中的更改。
请注意,这是一个简化的解释,旨在作为寻求理解这个复杂功能的第一步。
对于那些想要在这些命令之后可视化他们的项目状态的视觉学习者来说,这可能是有帮助的:
给定:- A - B - C (master)
适用于开启彩色终端机的用户 (git配置——global color。ui汽车):
git重置-软A,你会看到B和C的东西在绿色(分期和准备提交)
git重置-混合A(或git重置A),你会看到B和C的东西在红色(未分期和准备分期(绿色),然后提交)
git重置-硬A,你将不再看到B和C的变化在任何地方(将好像他们从来没有存在过)
或者对于那些使用像“塔”或“SourceTree”这样的GUI程序的人
git重置——软A,你会看到B和C的东西在“阶段性文件”区域准备提交
git reset—混合A(或git reset A),你会看到B和C的东西在“unstaging files”区域准备移动到staging,然后提交
git重置-硬A,你将不再看到B和C的变化在任何地方(将好像他们从来没有存在过)
你不必强迫自己记住它们之间的区别。想想你是如何做出承诺的。
做一些改变。 Git添加。 git commit -m“我做了某事”
软,混合和硬是一种让你放弃从3到1的操作的方法。
柔软的“假装”从未见过你有没有犯过错。 混“假装”从来没见过你有没有git加。 硬“假装”从来没有看到你做了文件更改。