Mic*_*nen 691 git version-control
我希望拆分提交,不知道要使用哪个重置选项.
我在看页面你能解释一下"git reset"用简单的英语做什么吗?,但我意识到我并不真正理解git索引或临时区域是什么,因此解释没有帮助.
此答案中的用例--mixed和--soft看起来一样(当你想要修复和重新发送时.)有人可以将其分解吗?我意识到--mixed可能是选择,但我想知道为什么.最后,怎么样--hard?
有人能给我一个如何选择3个选项的工作流程示例吗?
mka*_*sek 1392
修改存储库中的文件时,更改最初是未分级的.为了提交它,你必须暂存 - 也就是说,将它添加到索引使用git add.进行提交时,提交的更改是已添加到索引的更改.
git reset至少改变当前branch(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在执行硬重置之前运行,以确保您的工作目录是干净的,或者您可以丢失未提交的更改.
最后,一个可视化:

小智 153
用最简单的术语来说:
--soft:取消提交更改,更改将保持暂存状态(索引).--mixed (默认值):取消提交+ unstage更改,更改将保留在工作树中.--hard:uncommit + unstage +删除更改,没有任何遗漏.tim*_*c22 68
请注意,这是一个简化的解释,旨在作为寻求理解这一复杂功能的第一步.
对于想要在每个命令之后可视化项目状态的视觉学习者可能会有所帮助:
对于那些使用打开颜色的终端的人(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)你将看到'未分级文件'区域中的B和C的东西准备移动到暂存然后提交
git reset --hard A 而且你将不再在任何地方看到B和C的变化(就好像它们从未存在过一样)
mat*_*att 34
A lot of the existing answers don't seem to answer the actual question. They are about what the commands do, not about what you (the user) want — the use case. But that is what the OP asked about!
It might be more helpful to couch the description in terms of what it is precisely that you regret at the time you give a git reset command. Let's say we have this:
A - B - C - D <- HEAD
Here are some possible regrets and what to do about them:
git reset --soft A. I can now immediately commit and presto, all the changes since A are one commit.
git reset --mixed A. The commits are gone and the index is back at A, but the work area still looks as it did after D. So now I can add-and-commit in a whole different grouping.
Make a new branch otherbranch, and then git reset --hard A. The current branch now ends at A, with otherbranch stemming from it.
(当然,您也可以使用硬重置,因为您希望 B、C 和 D 根本没有发生过。)
Jam*_*ruk 22
以下是TortoiseGit用户的基本说明:
git reset --soft并--mixed保持您的文件不变.
git reset --hard实际上更改您的文件以匹配您重置的提交.
在TortoiseGit,概念指数非常受GUI隐藏.修改文件时,不必运行git add以将更改添加到暂存区/索引.简单地处理对不更改文件名的现有文件的修改,git reset --soft并且--mixed是相同的!如果添加新文件或重命名文件,您只会注意到不同之处.在这种情况下,如果运行git reset --mixed,则必须从Not Versioned Files列表中重新添加文件.  
Tom*_*vid 18
在这些情况下,我喜欢一个可以解释这个问题的视觉效果:
git reset --[hard/mixed/soft] :
所以每个影响范围都不同
qin*_*127 17
您不必强迫自己记住它们之间的差异。想想你实际上是如何进行提交的。
做一些改变。
git add .
git commit -m "I did Something"
Soft、Mixed 和 Hard 是使您能够放弃从 3 到 1 所做的操作的方式。
git commit。git add .Viv*_*aru 16
mkarasek 的答案很棒,简单来说我们可以说......
git reset --soft:设置HEAD为预期的提交,但保留上次提交的更改git reset --mixed:它是相同的git reset --soft,但唯一的区别是它取消了上次提交的更改git reset --hard:设置您HEAD指定的提交并重置上次提交的所有更改,包括未提交的更改。
--soft和--mixed有点相似,唯一的区别是,如果您想保留暂存区域中的更改,请使用--soft,如果您不想在暂存区域中进行更改,请使用--mixed。
Han*_*n W 14
所有其他的答案是伟大的,但我觉得最好将文件分解成三个类别,了解他们:unstaged,staged,commit:
--hard 应该很容易理解,它可以还原一切--mixed (默认):
unstaged文件:不要更改staged 文件:移至 unstagedcommit 文件:移至 unstaged--soft:
unstaged文件:不要更改staged文件:不要更改commit 文件:移至 staged综上所述:
--soft选项会将所有内容(unstaged文件除外)移入staging area--mixed 选项会将所有内容移入 unstaged area小智 10
--mixed vs --soft vs --hard:
--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`.
但是,如果提交已确认到远程存储库,则不建议使用重置命令,我们必须使用 来revert command丢弃远程提交。
在进入这三个选项之前,必须了解三件事。
1) 历史/头部
2) 阶段/索引
3) 工作目录
reset --soft :历史改变,HEAD改变,工作目录没有改变。
reset --mixed :历史已更改,HEAD 已更改,工作目录已更改为未暂存数据。
reset --hard :历史改变,HEAD改变,工作目录因丢失数据而改变。
使用 Git --soft 总是安全的。在复杂的需求中应该使用其他选项。
这里有许多答案对git reset --soft. 虽然有一个特定的条件git reset --soft只会改变HEAD(从分离的头部状态开始),通常(和预期用途),它会移动您当前已检出的分支引用。当然,如果您没有检出分支,则无法执行此操作(因此特定条件 wheregit reset --soft只会更改HEAD)。  
我发现这是思考git reset. 你不只是在移动HEAD(一切都这样做),你也在移动分支 ref,例如,master。这类似于运行时发生的情况git commit(当前分支随 一起移动HEAD),除了不是创建(并移动到)新提交,而是移动到先前的提交。
这就是将分支reset更改为新提交以外的内容,而不是更改. HEAD  您可以在文档示例中看到这一点:
撤消提交,使其成为主题分支
Run Code Online (Sandbox Code Playgroud)$ git branch topic/wip (1) $ git reset --hard HEAD~3 (2) $ git checkout topic/wip (3)
- 您已经进行了一些提交,但意识到它们进入“主”分支还为时过早。您想继续在主题分支中完善它们,因此从当前 HEAD 创建“主题/擦除”分支。
- 回滚主分支以摆脱这三个提交。
- 切换到“topic/wip”分支并继续工作。
这一系列命令的意义何在?您想在此处移动一个分支,master因此在您master签出时,您运行git reset.
这里投票最高的答案通常很好,但我想我会添加这个来纠正几个有误解的答案。
git reset --soft <ref>:将当前检出分支的分支指针重置为指定引用处的提交,<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)分支 ref指向的所有形式的git reset移动HEAD。
说命令移动HEAD. 任何更改您在提交历史记录中的位置的命令都会移动HEAD. 这就是HEAD is,指向您所在位置的指针。HEAD是你,所以你会移动。
| 归档时间: | 
 | 
| 查看次数: | 166252 次 | 
| 最近记录: |