gpt4 book ai didi

git - 重置 --soft 和 --mixed 之间的区别

转载 作者:太空狗 更新时间:2023-10-29 13:30:46 26 4
gpt4 key购买 nike

我是 GIT 的新手,正在尝试了解 git reset --softgit reset --mixed 之间的区别。我知道后者会重置索引,而前者不会,但我想了解实质性区别是什么:我什么时候使用一个而不是另一个?

我读过 this Stack Overflow post ,这似乎表明 mixed 适合在重新提交之前进行一些更改,而 soft 适合立即重新提交。我正在使用 SourceTree,关闭了暂存 Pane ,并且正在努力了解为什么会这样;我这辈子都看不到任何实际的真正差异。

我能看到的唯一区别是,我重置的新添加文件显示为使用软重置添加,但混合时则不然。但无论哪种情况,我都可以成功地对新添加的文件进行更改,然后重新提交。当然,我对现有文件所做的任何新更改都会无缝添加到我当前未提交的更改中,准备提交。

我是否必须使用带有源代码树的暂存 Pane 才能看到任何实际差异,或者我只是遗漏了什么?需要明确的是,根据我现在设置工具的方式,我看到了未提交的更改,这些更改是一步提交的。

最佳答案

首先,阅读上面@Ant P 建议的链接。

Whats the difference between git reset --mixed, --soft, and --hard?

让我用一些正在发生的事情的模型来补充这一点。

“git reset”适用于三种不同的东西。

  1. HEAD 引用。这表示引用点。这有多种用途,但在这里与您最相关的可能是这将成为您下一次提交的父项(假设您不再更改它)。
  2. 你的工作树。
  3. 索引。 (SourceTree 中的“暂存” Pane )。这就是 git 用来构建下一次提交的内容。它实际上并不是直接从您的工作树创建提交。这就是您需要执行“git add”的原因。

因此,如果您创建一个包含两个文件 foo.txt 和 bar.txt 的 git 存储库。

在您的第一个修订版中,将“v1”放入每个文件中。在您的第二次修订中,将“v2”放入每个文件中。现在,在每个中放入“v3”,然后执行“git add foo.txt”。

此时,您改变主意,决定重新设置为第一个修订版。你希望最终达到什么状态?

  • 'git reset --hard HEAD^':重置所有内容。您的树返回到第一次修订,没有更改排队到索引。
  • 'git reset --soft HEAD^':只是重置 HEAD 指针。索引仍具有重置前的状态。这意味着第二次提交中的所有更改,加上您已经添加的任何内容。因此它具有您放入 foo.txt 中的“v3”,以及您在第二次提交时第一次尝试时提交的“v2”。
  • 'git reset --mixed HEAD^':这只是重置索引,用当前版本填充它。实际上,它正在撤消您可能已经完成的任何“git add”(或“git rm”)。

那么为什么要执行 git reset --soft?

假设您创建了一个提交,但决定没有做对,并希望在推送之前修复它。 (重要!一旦你 push ,你要将提交视为永久性的,否则你会给其他人带来困难)

您可以进行更改,然后执行“git commit --amend”。但这只适用于最后一次提交。或者您可以执行“git rebase --interactive”,并对特定提交、 merge 提交等进行更改。

或者您可以执行“git reset --soft”、添加、更改、rm 或重置任何文件,直到您获得新提交所需的状态,然后将其作为新提交提交。

'git reset --mixed'(或不带 --mixed;这是默认设置)仅用于撤消 'git add' 或 'git rm'。

底线是,在我看来,您可能不想在交互式使用中使用 --soft。使用它没有任何问题,但“git commit --amend”或“git rebase --interactive”可能是获得所需内容的更直观的方式。

'git reset --mixed' 你会用到很多。

关于git - 重置 --soft 和 --mixed 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24224489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com