我有一个别名unstage
,用于从暂存区域中删除更改。
unstage = reset --
我注意到git的帮助建议git reset HEAD
。我还注意到git rm --cached
会做同样的事情。
除了git rm --cached
不会在没有-r
的情况下清除整个阶段之外,这些技术之间是否存在实际差异,以便从暂存区域中删除更改?实际上,我的意思是你能展示他们会产生不同结果的场景吗?或者我可以安全地互换使用它们吗?
答案 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>
中记录的完全相同,即:
a398bc837d
,索引条目也会引用该blob。 git rm --cached path [path ...]
从索引中删除和匹配path
的条目。
正如您所看到的,在这种情况下,差异表现为:
HEAD
已包含文件foo.txt
的条目。git add
从工作树中更改为foo.txt
。现在
git reset [HEAD] foo.txt
会将索引中记录的foo.txt
内容还原为此文件在HEAD
中的内容。git rm --cached foo.txt
会从索引中删除foo.txt
的条目。正如您所看到的,如果您现在提交,下一次提交的内容将具有或不具有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
有 3 种操作模式:
默认操作模式:git reset --mixed
是默认操作模式。
让我们在此关注其他 modes in reset. 的 mixed
模式。
在这种模式下,引用指针被更新。暂存索引重置为指定提交的状态。已从暂存索引中撤消的任何更改都将移至工作目录。
首先,我们需要了解 git rm
的作用以及它是如何工作的。它从工作目录和索引中删除一个文件,当您提交时,该文件也会从树中删除。
git rm --cached
会单独从索引中删除文件并将其保留在您的工作副本中。
如果您有一些先前已提交的文件,并且您想将它们从当前的暂存区中删除。您还可以使用此命令从当前工作区和索引中删除这些文件,并使它们成为未跟踪的新文件。
当 git add
用于添加新的(以前未跟踪的)文件时,则 git rm --cached
与 git add
正好相反