git 重置 与 git 重置 HEAD

2023-12-26

每次暂存文件时,如果您需要取消暂存文件,Git 都会提供有用的说明:

(use "git reset HEAD <file>..." to unstage)

不过体面的Atlassian 的 Git 教程 https://www.atlassian.com/git/tutorials/undoing-changes/git-reset简单地说:

git reset <file>

这看起来更简单,那么为什么会有区别呢?


没有区别(从git reset手册页 http://git-scm.com/docs/git-reset)就默认参数而言:

The <tree-ish>/<commit>默认为HEAD以各种形式。

该消息最初是not包括头部:提交 3c1eb9c,2007 年 1 月,git 1.5.0-rc1 https://github.com/git/git/commit/3c1eb9cb2d57769f770ddc36fd6b49706608ebb7,但由于默认是not总是已知的,帮助消息清楚地表明您应该重置哪个提交。

HEAD出现在提交 367c988,2007 年 11 月,Git 1.5.4 https://github.com/git/git/commit/367c98866c340bc9cf5cfa88c3b69f027165fc44:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)

torek https://stackoverflow.com/users/1256452/torek指出实际差异在评论中 https://stackoverflow.com/questions/33849704/git-reset-vs-git-reset-head/33849726#comment55470127_33849726:

通过指定HEAD,你保证后面的第一个单词HEAD被视为路径名。
例如,假设您运行git reset zorg. Is zorg树状结构,例如标签名称,或者是路径名称,./zorg?
Git 的答案是:这是一个树状的 ifgit rev-parse http://git-scm.com/docs/git-rev-parse可以把它变成树ID,否则就是路径。
你可以写git reset -- zorg or git reset HEAD zorg确保 git 将其视为路径。

查看有关双连字符语法的更多信息 (-- ) in "删除命名错误的 git 分支 https://stackoverflow.com/a/1192194/6309".




The OP skube https://stackoverflow.com/users/572747/skube adds 在评论中 https://stackoverflow.com/questions/33849704/git-reset-vs-git-reset-head/33849726?noredirect=1#comment55559254_33849726:

顺便说一句,他们确实建议放弃工作目录中的更改
(i.e git checkout -- <file>).
只是看起来不符合git reset HEAD <file>.

While git reset手册页 http://git-scm.com/docs/git-reset清楚地表明缺乏树状结构git reset <tree-ish> -- <paths>表示 HEAD,但情况并非如此git checkout <tree-ish> -- <paths> http://git-scm.com/docs/git-checkout.

git checkout <tree-ish> -- <pathspec>

When <paths>给出,git checkout不切换分支。
它从索引文件更新工作树中的命名路径或来自指定的<tree-ish>(最常见的是提交)。

这意味着git checkout -- path将用已经上演的内容覆盖工作树(git add'ed).
While git reset -- PATH(是 git reset 的混合形式)将重置索引与 HEAD 包含的内容(有效地取消暂存添加的内容)

git reset and git checkout不要使用相同的默认值,并且:

  • 您可以代表默认树git reset <tree-ish> <file>: HEAD.
    Hence git reset HEAD <file>;
  • 但是当您不提供树时,您无法表示默认参数git checkout: 就是索引。
    Hence git checkout -- file.

The --必须用在git checkout情况下,由于只有一个参数,需要明确参数代表files.

注意git checkout HEAD files是不同的:torek https://stackoverflow.com/users/1256452/torek提及在评论中 https://stackoverflow.com/questions/33849704/git-reset-vs-git-reset-head/33849726?noredirect=1#comment55559254_33849726

git checkout HEAD path副本来自HEAD将(树状)提交到索引,然后提交到工作目录。


注意:对于 2019 年 8 月的 Git 2.23+,您可以使用git restore https://stackoverflow.com/a/57066072/6309 instead

See 例子 https://git-scm.com/docs/git-restore#_examples:

恢复索引中的文件以匹配 HEAD 中的版本(这与使用相同git-reset)

$ git restore --staged hello.c

手册页:

git restore --staged hello.c不指定源,仅恢复索引(--staged https://git-scm.com/docs/git-restore#Documentation/git-restore.txt--W):它使用 HEAD 作为源来执行此操作(默认情况下)。

默认情况下,恢复sources工作树和索引分别是索引和HEAD。
--source可用于指定一个提交作为恢复源。

其他例子:

您可以恢复索引和工作树(这与使用git-checkout)

$ git restore --source=HEAD --staged --worktree hello.c

或者更实用但可读性较差的简短形式:

$ git restore -s@ -SW hello.c

git restore是一个更自然的命令名称,并且没有歧义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git 重置 与 git 重置 HEAD 的相关文章

  • 如何修复树与树之间的 Git 错误断开链接?

    我的事务被中断 当我再次尝试时 我遇到了空或损坏的对象错误 在另一个问题之后 我删除了所有空文件 当我运行时 git fsck full 我收到这个错误 Checking object directories 100 256 256 don
  • 使用 TFS 个人访问令牌克隆 Git 存储库

    我正在尝试以编程方式克隆 git 存储库 我的 ASP NET MVC 应用程序正在创建并启动一个进程 处理进程的代码工作正常 但是当尝试使用本地 TFS PAT 克隆 git 存储库时 身份验证失败 我无法使用 NTLM 或要求用户输入凭
  • git 预提交钩子格式代码 - Intellij/Android Studio

    本要点展示了如何在预提交时使用 Eclipse 格式化程序自动格式化 Java 代码 Source https gist github com ktoso 708972 https gist github com ktoso 708972
  • 相当于“svn update -r”的 git 是什么?

    我是最近的 git 转换者 能够使用 git svn 将我的分支保留在本地而不干扰 svn 服务器真是太棒了 最新版本的代码中存在一个错误 我想确定一个它起作用的时间 以便我可以使用 git bisect 我找不到正确的命令来及时返回 谢谢
  • 无法使用 git 配置文件进行 ssh

    我知道它被问了很多次 但我无法得到我的问题的答案 我正在尝试使用配置文件 ssh 到系统 配置文件是 Host qa HostName 10 218 70 345 User user IdentityFile C Users bean ss
  • git diff 在尖括号中显示 unicode 符号

    我有一个带有 unicode 符号 俄语文本 的文件 当我修复一些拼写错误时 我使用git diff color words 看看我所做的改变 如果是 unicode 西里尔文 符号 尖括号会造成一些混乱 如下所示 cat p1 cat p
  • git diff - 只显示哪些目录发生了变化

    有没有办法只列出已更改的目录 如果我在 git root 的话 project 我更改的文件是 project subtool file1 project subtool file2 project subtool3 file1 我只是想
  • git pull,忽略深度,如何不拉取整个历史记录?

    我们有一个巨大的多 GB git 存储库 主要是二进制对象 克隆需要几天时间 实际的主分支 没有历史记录 只有大约 20MB 所以我想 深度为 1 的 git 克隆就是解决办法 然而 现在我需要将某人的更新拉到主服务器 我们没有分支 当我拉
  • 如何 git grep 仅一组文件扩展名

    如何执行 git grep 并将检查的文件限制为一组文件 我希望能够 grep cpp 和 h 文件的内容来查找 MyFunc 例如 git grep MyFunc hc 但是 这也匹配 c 文件和 cs 文件 Use git grep M
  • 有谁知道类似于 SVN Time-Lapse View 的 Git 工具 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 SVN Time Lapse View 是一个跨平台查看器 可以下载文件的所有修订版本 并允许您通过拖
  • 我可以直接从我的谷歌云端硬盘在线推送/拉取吗?

    有一些方法可以通过谷歌驱动器同步 Windows 应用程序将我的本地 git 存储库同步到我的谷歌驱动器 但我想知道我是否可以完全绕过它的需要 Fro eg git remote add origin https drive google
  • git 日志历史记录图,每次提交一行,彩色,带有日期

    我需要的格式如下 git log decorate graph oneline date order 但我也需要它 包含日期 短 具有相同的颜色 I tried git log decorate graph oneline date ord
  • git 认为文件已更改

    我在一台机器上对一个项目做了一些工作 然后推送到 github 在另一台机器上克隆并做了一些工作 然后推送 然后我回到第一台机器并做了一个pull 现在 第一台机器认为项目中最初的所有文件都已更改 我试过了 git checkout f a
  • 如何使用 AWS Lambda 安装 Git?

    我在代码提交存储库中有代码 我正在编写一个 lambda 函数来为代码提交存储库的每个签入 事件 构建代码 我无法安装 git 因此无法克隆存储库 我该怎么办呢 正如其他人提到的 在 lambda 上安装 git 要么非常困难 要么完全不可
  • Git 2.2.x 无缘无故更新旧包文件的时间戳

    Git 2 2 0 和 2 2 1 似乎修改了旧的时间戳 git objects pack pack pack偶尔会无缘无故地文件 它只是改变时间戳 内容是相同的 调试这一点很困难 因为它似乎很少进行更改 我在 2 2 0 之前的任何 Gi
  • Git 到 TFS 源代码管理迁移

    我想看看 TFS 如何为我的命令工作 所以我想将我们当前的 GIT 存储库移动到 TFS 数据库 我们使用 GIT 来获得普遍的分支支持 因此我想使用 TFS 2010 来解决该问题 现在的问题是 如何将 GIT 存储库导出到 TFS 显然
  • 无法通过 Git Bash 克隆 git 存储库

    在尝试使用克隆存储库时git clone 它显示以下错误 致命 无法访问 https github com microsoft c9 python getting started git https github com microsoft
  • git reflog 和 log 有什么区别?

    手册页说 log 显示提交日志 reflog 管理 reflog 信息 reflog 信息到底是什么 它有哪些日志没有的信息 日志看起来更详细 git log显示当前的 HEAD 及其祖先 也就是说 它打印提交 HEAD 指向的提交 然后打
  • 为什么 Git 无法将文件更改与修改后的父级/主控合并?

    我有一个文件 里面只有一行 我创建一个分支并向同一文件添加第二行 保存并提交到分支 我切换回主人 并向文件中添加不同的第二行 保存并提交给master 现在总共有 3 条独特的线路 如果我现在尝试将分支合并回主分支 则会遇到合并冲突 为什么
  • 仅使用 Git grep 的文件名

    我只想查看文本中包含特定单词的不同文件 current directory git grep word 显示文件中具有匹配单词的每一行 所以我尝试了这个 current directory git grep word files with

随机推荐