git reset --mixed, - soft和--hard有什么区别?
我希望拆分提交,不知道要使用哪个重置选项。我在看页面你能解释一下“git reset”用简单的英语做什么吗?,但我意识到我并不真正理解git索引或临时区域是什么,因此解释没有帮助。
我希望拆分提交,不知道要使用哪个重置选项。
我在看页面你能解释一下“git reset”用简单的英语做什么吗? ,但我意识到我并不真正理解git索引或临时区域是什么,因此解释没有帮助。
另外,-- --mixed
和--soft
的用例在我的回答中看起来是一样的(当你想要修复和重新发送时。)有人可以将它分解得更多吗? 我意识到 - --mixed
可能是选择,但我想知道为什么 。 最后,怎么样 - --hard
?
有人能给我一个如何选择3个选项的工作流程示例吗?
#1楼
以下是TortoiseGit用户的基本说明:
git reset --soft
和--mixed
保持您的文件不变。
git reset --hard
实际上会更改您的文件以匹配您重置的提交。
在TortoiseGit, 该指数的概念是非常受GUI隐藏。 修改文件时,不必运行git add
将更改git add
到暂存区/索引。 当简单地处理对不改变文件名的现有文件的修改时, git reset --soft
和--mixed
是相同的! 如果添加新文件或重命名文件,您只会注意到不同之处。 在这种情况下,如果运行git reset --mixed,则必须从“ 未版本化的文件”列表中重新添加文件。
#2楼
请注意,这是一个简化的解释,旨在作为了解这一复杂功能的第一步。
对于想要在每个命令之后可视化项目状态的视觉学习者可能会有所帮助:
对于那些使用打开颜色的终端的人(git config --global color.ui auto):
git reset --soft A
你会看到B和C的东西是绿色的(上演并准备提交)
git reset --mixed A
(或git reset A
),你会看到B和C的东西是红色的(未分阶段,准备上演(绿色),然后提交)
git reset --hard A
你将不会再看到B和C的变化(就好像它们从未存在过)
或者对于那些使用像'Tower'或'SourceTree'这样的GUI程序的人
git reset --soft A
,你会在'staged files'区域看到B和C的东西准备提交
git reset --mixed A
(或git reset A
),你会在'unstaged files'区域看到B和C的东西,准备移动到staged然后提交
git reset --hard A
你将不会再看到B和C的变化(就好像它们从未存在过)
#3楼
修改存储库中的文件时,更改最初是未分级的。 为了提交它,你必须进行它 - 也就是说,使用git add
将它添加到索引中。 进行提交时,提交的更改是已添加到索引的更改。
git reset
至少会改变当前分支( HEAD
)所指向的位置。 --mixed
和--soft
之间的区别在于您的索引是否也被修改。 所以,如果我们在这一系列提交的分支master
上:
- A - B - C (master)
HEAD
指向C
,索引与C
匹配。
当我们运行git reset --soft B
, master
(以及HEAD
)现在指向B
,但索引仍然有来自C
的更改; git status
会将它们显示为暂存状态。 因此,如果我们在此时运行git commit
,我们将获得一个与C
相同的更改的新提交。
好的,所以从这里开始:
- A - B - C (master)
现在让我们做git reset --mixed B
(注意:-- --mixed
是默认选项)。 再次, master
和HEAD
指向B,但这次索引也被修改为匹配B
如果我们此时运行git commit
,则由于索引与HEAD
匹配,所以不会发生任何事情。 我们仍然在工作目录中进行了更改,但由于它们不在索引中,因此git status
它们显示为未分级。 要提交它们,你会像往常一样git add
然后提交。
最后, --hard
相同--mixed
(它改变了你的HEAD
和索引),不同之处在于--hard
也改变你的工作目录。 如果我们在C
并运行git reset --hard B
,那么C
添加的更改以及您拥有的任何未提交的更改都将被删除,并且工作副本中的文件将与提交B
匹配。 由于您可以通过这种方式永久丢失更改,因此在执行硬重置之前应始终运行git status
以确保您的工作目录是干净的,或者您可以丢失未提交的更改。
最后,一个可视化:
#4楼
在使用3个选项的上下文中简短回答:
要保留代码中的当前更改,但要重写提交历史记录:
-
soft
:你可以一次提交所有内容并创建一个带有新描述的新提交(如果你使用torotise git或任何其他大多数GUI,这是一个使用的,因为你仍然可以在提交中勾选你想要的文件并制作使用不同文件进行多次提交。在Sourcetree中,所有文件都将进行提交。) -
mixed
:在进行提交之前,您必须再次将单个文件添加到索引中(在Sourcetree中,所有已更改的文件都将被取消暂存)
要实际丢失代码中的更改 :
-
hard
:你不仅要重写历史记录,还要在重置之前丢失所有更改
#5楼
在进入这三个选项之前,必须先了解三件事。
1)历史/ HEAD
2)阶段/指数
3)工作目录
reset --soft:历史记录已更改,HEAD已更改,工作目录未更改。
reset --mixed:历史记录已更改,HEAD已更改,工作目录已更改为未分级数据。
reset --hard:历史记录已更改,HEAD已更改,工作目录已更改,数据丢失。
与Git --soft一起使用总是安全的。 在复杂的要求中应该使用其他选项。
#6楼
用最简单的术语来说:
-
--soft
:--soft
提交更改,更改将保持暂存状态( 索引 )。 -
--mixed
(默认值) :--mixed
提交+ unstage更改,更改将保留在工作树中 。 -
--hard
: uncommit + unstage +删除更改,没有留下任何内容。
#7楼
git reset命令的各种选项的基本区别如下。
- --soft:仅将HEAD重置为您选择的提交。 与git checkout基本相同,但不会创建一个独立的头状态。
- --mixed(默认选项):将HEAD重置为您在历史记录中选择的提交,并撤消索引中的更改。
- --hard:将HEAD重置为您在历史记录中选择的提交,撤消索引中的更改,并撤消工作目录中的更改。
#8楼
--soft
:告诉Git将HEAD重置为另一个提交,因此不会以任何方式更改索引和工作目录。 原始HEAD和提交之间更改的所有文件都将被暂存。
--mixed
:就像软件一样,这会将HEAD重置为另一个提交。 它还将重置索引以匹配它,而不会触及工作目录。 所有更改都将保留在工作目录中,并显示为已修改,但不会暂存。
--hard
:这会重置所有内容 - 它会将HEAD重置为另一个提交,重置索引以匹配它,并重置工作目录以匹配它。
--mixed
和--soft
之间的主要区别在于您的索引是否也被修改。 在这里查看更多相关信息。
#9楼
mkarasek的答案很棒,简单来说我们可以说......
-
git reset --soft
:将HEAD
设置为预期的提交,但保持您的更改从上次提交git reset --soft
-
git reset --mixed
:它与git reset --soft
相同但唯一的区别是它从上次提交中取消了你的更改 -
git reset --hard
:在您指定的提交上设置HEAD
并重置上次提交的所有更改,包括未提交的更改。
#10楼
在这些情况下,我喜欢一个可以解释这个问题的视觉效果:
git reset --[hard/mixed/soft]
:
所以每个影响范围都不同
- Hard => WorkingDir + Index + HEAD
- 混合=>索引+ HEAD
- Soft => HEAD only(索引和工作目录不变)。
#11楼
您不必强迫自己记住它们之间的差异。 想想你是如何实际提交的。
1.做一些改变。
2.git添加。
3.gc -m“我做了什么”
软,混合和硬是让您放弃从3到1的操作的方式。
软“假装”永远不会看到你做过“gc -m”。
混合“假装”永远不会看到你做了“git add”。
很难“假装”永远不会看到你做了文件更改。
#12楼
这里有很多答案,对git reset --soft
有误解。 虽然有一个特定的条件, git reset --soft
只会改变HEAD
(从分离的头状态开始),通常(并且用于预期用途), 它会移动您当前已检出的分支引用。 当然,如果你没有检出分支,它就不能这样做(因此git reset --soft
只会改变HEAD
的特定条件)。
我发现这是考虑git reset
的最佳方式。 你不只是移动HEAD
( 一切都这样 ),你也在移动分支ref ,例如master
。 这与运行git commit
(当前分支随HEAD
一起移动)时发生的情况类似,除了创建(并移动到) 新提交,您转移到先前的提交。
这是reset
点,将分支更改为新提交以外的其他内容,而不是更改HEAD
。 您可以在文档示例中看到这一点:
撤消提交,使其成为主题分支
$ git branch topic/wip (1) $ git reset --hard HEAD~3 (2) $ git checkout topic/wip (3)
- 你做了一些提交,但意识到他们还不成熟,不能进入“主”分支。 您想在主题分支中继续抛光它们,因此从当前HEAD创建“topic / wip”分支。
- 倒回master分支以摆脱这三个提交。
- 切换到“topic / wip”分支并继续工作。
这一系列命令有什么意义? 你想移动一个分支 ,这里是master
,所以当你签出master
时,你运行git reset
。
这里最高投票的答案一般都很好,但我想我会添加这个以纠正错误概念的几个答案。
改变你的分支
git reset --soft <ref>
:将当前检出的分支的分支指针重置为指定引用的提交,。 工作目录和索引中的文件不会更改。 从这个阶段开始提交将带您回到git reset
命令之前的位置。
也改变你的索引
git reset --mixed <ref>
或者等价的
git reset <ref>
:
是什么--soft
做AND也重置索引以匹配指定引用的提交。 虽然git reset --soft HEAD
什么都不做(因为它表示将签出的分支移动到签出的分支), git reset --mixed HEAD
,或等效的git reset HEAD
,是一个常见且有用的命令,因为它将索引重置为你上次提交的状态。
也改变你的工作目录
git reset --hard <ref>
:做什么--mixed
做AND也会覆盖你的工作目录。 这个命令类似于git checkout <ref>
,除了(这是关于reset
的关键点) 所有形式的git reset
移动分支ref HEAD
指向。
关于“此类命令移动HEAD”的说明:
说命令移动HEAD
是没有用的。 任何更改您在提交历史记录中的位置的命令都会移动HEAD
。 那是什么HEAD
是 ,一个指向无论你在哪里。 HEAD
就是你 ,所以每当你做的时候都会移动。
#13楼
所有其他答案都很棒,但我发现最好通过将文件分为三类来理解它们: unstaged
, staged
, commit
:
-
--hard
应该易于理解,它可以恢复一切 -
--mixed
(默认) :-
unstaged
文件: 不要更改 -
staged
文件:移至未unstaged
-
commit
文件:移动到未unstaged
-
-
--soft
:-
unstaged
文件: 不要更改 -
staged
文件: 不要'改变 -
commit
文件:移动到staged
-
综上所述:
-
--soft
选项会将所有内容(非unstaged
文件除外)移动到staging area
-
--mixed
选项会将所有内容移动到非unstaged area
更多推荐
所有评论(0)