我想拆分一个提交,但不确定使用哪个重置选项。
我正在看这页用简单的英语说,“git重置”是做什么的?,但我意识到我并不真正理解git索引或暂存区是什么,因此解释没有帮助。
此外,在我看来,在这个答案中——混合和——软的用例是相同的(当您想修复和重新承诺时)。有人能再详细解释一下吗?我知道,混合可能是最好的选择,但我想知道原因。最后,硬呢?
谁能给我一个工作流程的例子,如何选择3个选项会发生?
我想拆分一个提交,但不确定使用哪个重置选项。
我正在看这页用简单的英语说,“git重置”是做什么的?,但我意识到我并不真正理解git索引或暂存区是什么,因此解释没有帮助。
此外,在我看来,在这个答案中——混合和——软的用例是相同的(当您想修复和重新承诺时)。有人能再详细解释一下吗?我知道,混合可能是最好的选择,但我想知道原因。最后,硬呢?
谁能给我一个工作流程的例子,如何选择3个选项会发生?
当前回答
所有其他的答案都很棒,但我发现最好通过将文件分解为三类来理解它们:非阶段性、阶段性和提交:
——困难应该是容易理解的,它恢复了一切 ——mixed(默认): 非暂存文件:不要更改 暂存文件:移至非暂存文件 提交文件:移动到非暂存状态 ——软: 非暂存文件:不要更改 阶段性文件:不要更改 提交文件:移动到阶段性
总而言之:
-软选项将移动所有(除了非暂存文件)到暂存区 混合选项会把所有东西都移到非舞台区域
其他回答
用最简单的话来说:
——soft:取消提交更改,更改是阶段性的(index)。 ——mixed(默认):uncommit + unstage变更,变更留在工作树中。 ——难:uncommit + unstage + delete changes,什么都不剩。
请注意,这是一个简化的解释,旨在作为寻求理解这个复杂功能的第一步。
对于那些想要在这些命令之后可视化他们的项目状态的视觉学习者来说,这可能是有帮助的:
给定:- 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 add来执行它——也就是说,将它添加到索引中。当你提交时,提交的更改是那些已经添加到索引中的更改。
git重置更改,至少,当前分支(HEAD)指向的位置。-混合和-软之间的区别在于索引是否也被修改。如果我们在master分支上进行这一系列的提交:
- A - B - C (master)
头指向C,索引匹配C。
当我们运行git reset -soft B, master(因此HEAD)现在指向B,但索引仍然有从C的变化;Git状态将显示它们为阶段性。如果我们在这里运行git commit,我们会得到一个新的commit,和C一样。
好的,再从这里开始:
- A - B - C (master)
现在让我们进行git重置-mixed b(注意:-mixed是默认选项)。同样,master和HEAD指向B,但这一次索引也被修改以匹配B。如果我们在这一点上运行git commit,什么也不会发生,因为索引匹配HEAD。我们在工作目录中仍然有更改,但由于它们不在索引中,git状态将它们显示为未暂存。要提交它们,你需要git添加,然后像往常一样提交。
And finally, --hard is the same as --mixed (it changes your HEAD and index), except that --hard also modifies your working directory. If we're at C and run git reset --hard B, then the changes added in C, as well as any uncommitted changes you have, will be removed, and the files in your working copy will match commit B. Since you can permanently lose changes this way, you should always run git status before doing a hard reset to make sure your working directory is clean or that you're okay with losing your uncommitted changes.
最后,一个可视化图:
在研究这三个选项之前,我们必须了解三件事。
1) 历史/头部
2)阶段/索引
3)工作目录
reset——soft:历史记录已更改,HEAD已更改,工作目录未更改。
reset——mixed:历史记录已更改,HEAD已更改,工作目录已更改。
reset——hard:历史记录更改,HEAD更改,工作目录更改,数据丢失。
使用Git总是安全的——软的。在复杂的需求中应该使用其他选项。
以下是对TortoiseGit用户的基本解释:
Git复位-软-混合不动你的文件。
Git重置-实际上很难改变你的文件来匹配你重置的提交。
在TortoiseGit中,索引的概念被GUI隐藏得很好。当你修改一个文件时,你不必运行git add来将更改添加到暂存区域/索引中。当简单地处理现有文件的修改而不改变文件名时,git reset -soft和-mixed是一样的!只有添加新文件或重命名文件时才会注意到不同之处。在这种情况下,如果你运行git reset——mixed,你将不得不从Not Versioned Files列表中重新添加你的文件。