Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';git重置——混合、软和硬之间的区别是什么?_Git_Version Control - Fatal编程技术网

什么';git重置——混合、软和硬之间的区别是什么?

什么';git重置——混合、软和硬之间的区别是什么?,git,version-control,Git,Version Control,我希望拆分提交,但不确定要使用哪个重置选项 我正在查看页面,但我意识到我并不真正理解git索引或暂存区是什么,因此解释没有帮助 另外,--mixed和--soft的用例在我看来也是一样的(当您想要修复并重新提交时)。有人能把它分解得更多吗?我意识到--mixed可能是一种选择,但我想知道为什么。最后,关于——硬的 有人能给我一个工作流示例,说明如何选择这3个选项吗?当您修改存储库中的文件时,更改最初是未过时的。为了提交它,您必须将其暂存,即使用gitadd将其添加到索引中。进行提交时,提交的更改

我希望拆分提交,但不确定要使用哪个重置选项

我正在查看页面,但我意识到我并不真正理解git索引或暂存区是什么,因此解释没有帮助

另外,
--mixed
--soft
的用例在我看来也是一样的(当您想要修复并重新提交时)。有人能把它分解得更多吗?我意识到
--mixed
可能是一种选择,但我想知道为什么。最后,关于
——硬的


有人能给我一个工作流示例,说明如何选择这3个选项吗?

当您修改存储库中的文件时,更改最初是未过时的。为了提交它,您必须将其暂存,即使用
gitadd
将其添加到索引中。进行提交时,提交的更改是已添加到索引中的更改

git reset
至少会更改当前分支(
HEAD
)指向的位置。
--mixed
--soft
之间的区别在于是否也修改了索引。因此,如果我们在分支
master
上执行这一系列提交:

- A - B - C (master)
HEAD
指向
C
,索引匹配
C

当我们运行
git reset--soft B
master
(因此
HEAD
)现在指向
B
,但是索引仍然有
C
的变化<代码>git状态
会将它们显示为暂存状态。因此,如果此时运行
gitcommit
,我们将得到一个新的提交,其更改与
C
相同


好的,再从这里开始:

- A - B - C (master)
现在让我们执行git重置--mixed B
。(注意:
--mixed
是默认选项)。再次,
master
HEAD
指向B,但这次索引也被修改为匹配
B
。如果此时运行
git commit
,则由于索引匹配
HEAD
,因此不会发生任何事情。我们仍然在工作目录中有更改,但由于它们不在索引中,
git status
将它们显示为未老化。要提交它们,您可以
git add
,然后像往常一样提交


最后,
--hard
--mixed
相同(它会更改您的
标题和索引),只是
--hard
也会修改您的工作目录。如果我们在
C
并运行
git reset--hard B
,则在
C
中添加的更改以及您所做的任何未提交的更改将被删除,并且您的工作副本中的文件将与提交
B
匹配。由于您可能会以这种方式永久丢失更改,因此在执行硬重置之前,您应该始终运行
git status
,以确保您的工作目录是干净的,或者您可以丢失未提交的更改


最后,一个可视化:
以下是对陆龟用户的基本解释:

git reset--soft
--mixed
保持文件不变

git reset--hard
实际更改文件以匹配重置的提交

在Ortoisegit中,GUI非常隐藏索引的概念。修改文件时,不必运行
git add
将更改添加到临时区域/索引。当简单地处理对不改变文件名的现有文件的修改时,
git reset--soft
--mixed
是相同的!只有在添加新文件或重命名文件时,您才会注意到差异。在这种情况下,如果运行git reset--mixed,则必须从未版本控制的文件列表中重新添加文件

请注意,这是一个简化的解释,旨在作为理解此复杂功能的第一步

对于希望在执行以下每个命令后可视化其项目状态的视觉学习者来说,这可能会有所帮助:

给定:
-A-B-C(主控)


对于使用开启颜色的终端的用户 (git config--global color.ui auto):

git reset--soft A
你会看到B和C的东西是绿色的(已准备好提交)

git reset——混合了A
(或
git reset A
),您将看到B和C的内容为红色(未分级,准备分级(绿色),然后提交)

git reset——硬A
,您将不再在任何地方看到B和C的更改(就好像它们从未存在过一样)


或者对于那些使用“Tower”或“SourceTree”等GUI程序的用户

git reset--soft A
您将在“暂存文件”区域中看到B和C的内容,准备提交

git reset——混合了A
(或
git reset A
),您将在“未分级文件”区域中看到B和C的内容,准备移动到分级然后提交


git reset——硬A
,您将不再在任何地方看到B和C的更改(就好像它们从未存在过一样)

这是在什么情况下使用这3个选项的简短答案:

要保留代码中的当前更改,但要重写提交历史记录,请执行以下操作:

  • soft
    :您可以一次提交所有内容,并使用新的描述创建一个新的提交(如果您使用torotise git或任何其他GUI,这就是要使用的GUI,因为您仍然可以在提交中勾选要提交的文件,并以这种方式使用不同的文件进行多个提交。在Sourcetree中,所有文件都将暂存以进行提交。)
  • mixed
    :在进行提交之前,您必须将各个文件再次添加到索引中(在Sourcetree中,所有更改的文件都将被取消分级)
要实际丢失代码中的更改,请执行以下操作:

  • hard
    :您不仅要重写历史,还要
              $ git branch topic/wip     (1)
              $ git reset --hard HEAD~3  (2)
              $ git checkout topic/wip   (3)
    
    A - B - C - D <- HEAD
    
    --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`.