`git rm --cached`,`git reset --`和`git reset HEAD`与unstage更改有什么实际区别?

时间:2015-10-07 23:36:01

标签: git

我有一个别名unstage,用于从暂存区域中删除更改。

unstage = reset --

我注意到git的帮助建议git reset HEAD。我还注意到git rm --cached会做同样的事情。

除了git rm --cached不会在没有-r的情况下清除整个阶段之外,这些技术之间是否存在实际差异,以便从暂存区域中删除更改?实际上,我的意思是你能展示他们会产生不同结果的场景吗?或者我可以安全地互换使用它们吗?

5 个答案:

答案 0 :(得分:5)

git reset是舞台上正确的方式,现在这就是原因:

首先让我们澄清一些事情: 如果没有提供提交,则git defaults提交给HEAD

git reset == git reset HEAD

至于 - 它需要一条路径。

现在,区别于:

git reset --mixed AND git rm --cached

(重置默认为 - 混合)

git reset --mixed
           Resets the index but not the working tree (i.e., the changed files are preserved but not marked for
           commit) and reports what has not been updated. This is the default action.

git rm --cached
       Use this option to unstage and remove paths only from the index. Working tree files, whether modified or
       not, will be left alone.enter code here

基本上不同之处在于,git rm --cached实际上将指定的文件放入未跟踪的状态,并为下次提交分阶段删除它们。 另一方面,Git重置 - 混合,只需将文件移动到“未分级”,但将其旧版本保留在仓库中。

答案 1 :(得分:1)

差异(不考虑使用引用名称混淆路径名之类的东西)是这样的:

  • git reset [<tree-ish>] path [path...]将取<tree-ish>的值(如果省略则默认为HEAD),并确保指定路径的索引条目看起来与<tree-ish>中记录的完全相同,即:

    • 如果内容记录为blob a398bc837d,索引条目也会引用该blob。
    • 如果不存在该名称的条目,则将从索引中删除该条目。
  • 另一方面,
  • git rm --cached path [path ...] 从索引中删除和匹配path的条目。

正如您所看到的,在这种情况下,差异表现为:

  1. 您的HEAD已包含文件foo.txt的条目。
  2. git add从工作树中更改为foo.txt
  3. 现在

    • git reset [HEAD] foo.txt会将索引中记录的foo.txt内容还原为此文件在HEAD中的内容。
    • git rm --cached foo.txt会从索引中删除foo.txt的条目。
  4. 正如您所看到的,如果您现在提交,下一次提交的内容将具有或不具有foo.txt - 取决于您已完成的工作。

    总而言之,只能通过git reset HEAD进行取消暂存 - 它与git add相反。

    从另一个角度来看:

    • git add pathname添加更改工作树中包含的pathname与其在索引中的状态相比较。如果索引中根本不存在pathname,则首先创建一个条目。你看到了很好的区别吗?
    • git add相反,git reset HEAD会移除 git add添加的更改:如果您git add - 更改了在已存在的索引条目上,其原始内容将在索引中恢复。如果它根本不存在于索引中,它将被删除。

      与此相反,git rm --cached无条件删除条目。所以&#34;取消&#34;仅在git add 创建的情况下git add操作,您使用git rm --cached尝试核对的索引条目。

答案 2 :(得分:1)

const db = require("../models"); const User = db.users; const Adherent = db.adherents; const Address = db.addresses; const Op = db.Sequelize.Op; exports.create = (req, res) => { if (!req.body.user || !req.body.address) { res.status(400).send({ message: "Données incomplètes" }); return; } const address = { AddressFirstLine: req.body.address.addressFirstLine, AddressSecondLine: req.body.address.addressSecondLine, City: req.body.address.city, PostalCode: req.body.address.postalCode }; const user = { FirstName: req.body.user.firstName, LastName: req.body.user.lastName, Password: req.body.user.password, EmailAddress: req.body.user.emailAddress }; Address.create(address) .then(addressData => { User.create(user).then(userData => { Adherent.create({ UserID: userData.UserID, BirthDate: req.body.birthDate, Gender: req.body.gender, RegistrationDate: req.body.registrationDate, Phone1: req.body.phone1, Phone2: req.body.phone2, AddressID: addressData.AddressID }).then(adherentData => { res.send(userData + adherentData + addressData); }).catch(err => { console.log(err); res.status(500).send({ message: err.message || "Une erreur est survenue lors de la création de l'adhérent" }); }) }).catch(err => { console.log(err); res.status(500).send({ message: err.message || "Une erreur est survenue lors de la création de l'utilisateur" }); }) }) .catch(err => { console.log(err); res.status(500).send({ message: err.message || "Une erreur est survenue lors de la création de l'adresse" }); }); }; 取消暂存和取消跟踪(标记为在下次提交时删除)给定文件,而 git rm --cached <file> 只是取消暂存文件

答案 3 :(得分:0)

我将回答git rm --staged <file>git reset HEAD <file>

之间的区别

当有人想要从暂存区域删除文件时,可以使用两者。

使用git rm --staged,一个人可以删除他不希望更改的特定提交的文件。然后在提交git add之后再次提交它。

使用git reset,一个人可以删除对他不希望更改的特定提交的文件所做的更改。然后在提交git add之后再次提交它。

但两者在实际情况方面都有很大不同。

使用git rm --staged some-file,文件将从暂存区域中删除,不再被跟踪。该文件仍将在工作区域中。使用git rm --staged删除要删除的文件来提交更改。使用git add添加文件并再次提交更改。现在回到删除文件的位置,你会发现文件根本没有出现在目录中。它不见了。如果其他代码依赖于此文件,这可能会导致问题。

使用git reset HEAD some-file,自上次提交以来对文件所做的更改将从暂存区域中删除,但文件仍在跟踪中。因此,当您返回到运行git reset HEAD some-file.txt的提交时,文件仍然存在,但更改将不在那里。

要取消暂存文件,应使用git reset HEAD <file>

答案 4 :(得分:0)

简要回答:

要从暂存区取消暂存所有更改,请使用 git reset 命令而不指定任何文件或路径,例如:

 git reset

这会将您的所有更改从暂存区移动到工作区。

我个人经常使用这个命令,因为它很安全。

要取消暂存特定文件,

git reset HEAD <file> 

详细回答 `git reset` 与 `git rm -r --cached` .?

git 重置

`git reset` 是一个 git 命令,可以将你的头重置到最后一次提交。

git reset 有 3 种操作模式:

  1. 柔软
  2. 混合

默认操作模式:git reset --mixed 是默认操作模式。

让我们在此关注其他 modes in reset.mixed 模式。

在这种模式下,引用指针被更新。暂存索引重置为指定提交的状态。已从暂存索引中撤消的任何更改都将移至工作目录。

git rm -r --cached

首先,我们需要了解 git rm 的作用以及它是如何工作的。它从工作目录和索引中删除一个文件,当您提交时,该文件也会从树中删除。

但是,

git rm --cached 会单独从索引中删除文件并将其保留在您的工作副本中

如果您有一些先前已提交的文件,并且您想将它们从当前的暂存区中删除。您还可以使用此命令从当前工作区和索引中删除这些文件,并使它们成为未跟踪的新文件。

git add 用于添加新的(以前未跟踪的)文件时,则 git rm --cachedgit add 正好相反