Git LFS 改动:这个奇怪的命令序列到底做了什么

Git LFS alteration: what does this odd sequence of commands really do

有人可以向我解释这一系列命令的实际作用吗?

git rm --cached -r .
git reset --hard
git rm .gitattributes
git reset .
git checkout .

我从an answer to Git error: Encountered 7 file(s) that should have been pointers, but weren't那里拿来的。它做了它应该做的事情,但我想知道它为什么起作用以及它做了什么。盲目地遵循包含 --hard、reset 和 rm...的指令通常感觉超级可怕。

could someone explain to me what this series of commands actually do?

It seems to be a long winded way of writing git reset --hard with most of it effectively doing nothing,但我可能是错的。请参阅此答案的结尾。


我可以解释git reset --hard

当 Git 收银台变脏时,有两个区域需要清理。

  • 工作树(即文件本身)
  • 暂存区(即您 Git 添加的内容)

对于基本 Git,没有 git-lfs,您需要两个命令。

  • git reset --hard(默认为HEAD,当前commit)
  • git clean

git-reset 有点像 git-checkout,但使用了类固醇。它会更改您签出的提交,但您可以控制暂存区和工作树是否随之更改。

git reset --soft 仅对新提交进行更改,您的文件和暂存更改保持不变。 git reset --soft HEAD^ 会将您移动到上一个提交,但提交中的所有更改都将暂存,所有未暂存的更改将保留。如果你想重做一个提交,这很有用,我把它别名为 redo.

git reset --mixed 更改提交并重置暂存区。 git reset --mixed HEAD^ 与上面类似,但所有先前提交的更改都将取消暂存。

git reset --hard 更改提交并重置暂存区和您的文件。这会擦除您的所有更改并让您回到干净的状态。 git reset --hard HEAD 擦除所有更改并将您恢复到当前提交。 git reset --hard HEAD^ 擦除所有更改并恢复到之前的提交;如果您想撤消提交,这很有用,我将其别名为 undo.

您签出的最后一次提交始终是 ORIG_HEAD,因此您始终可以 return 使用 git reset --hard ORIG_HEAD

最后,如果您有任何未跟踪的文件,git clean 将删除它们。

有关更多信息,请参阅 Reset Demystified


What is that answer doing?

  • git rm --cached -r .

这会清除临时区域。没有必要,因为...

  • git 重置 --hard

...这也会清除暂存区并将您移动到当前提交的原始版本,如上所述。

  • git rm .git属性

gitattributes 允许您在存储库中的路径上定义属性。 git-lfs 等工具使用它来标记哪些文件正在使用 LFS。吹走整个东西将重置 all 属性,因此根据您使用的其他工具,这可能不是一个好主意。

  • git 重置 .

这是git reset --mixed HEAD。这将取消他们刚刚所做的 git rm。我不知道你为什么想要那个。

  • git结帐。

这是 git checkout HEAD,它恢复 .gitattributes 使整个练习变得毫无意义。

所以,除非我遗漏了什么,否则就是 git reset --hard HEAD