如何将 HEAD 移回之前的位置? (分离头)和撤消提交

2024-06-24

在 Git 中,我试图做一个squash commit通过合并到另一个分支然后重置HEAD通过以下方式前往上一个地点:

git reset origin/master

但我需要走出这一步。如何将 HEAD 移回之前的位置?

我有 SHA-1 片段(23b6772)我需要将其移至的提交。我怎样才能回到这个提交?


在回答之前,让我们添加一些背景知识,解释一下这是什么HEAD is.

First of all what is HEAD?

HEAD只是对当前分支上的当前提交(最新)的引用。
只能有一个HEAD在任何给定时间(不包括git worktree).

内容为HEAD存储在里面.git/HEAD它包含当前提交的 40 字节 SHA-1。


detached HEAD

如果您不是最新的提交 - 这意味着HEAD指向历史中的先前提交,称为detached HEAD.

在命令行上,它看起来像这样 - SHA-1 而不是分支名称,因为HEAD不指向当前分支的尖端:


关于如何从分离的 HEAD 中恢复的一些选项:


git checkout https://git-scm.com/docs/git-checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits to go back

这将检出指向所需提交的新分支。
此命令将签出给定的提交。
此时,您可以创建一个分支并从此时开始工作。

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog https://git-scm.com/docs/git-reflog

您可以随时使用reflog以及。
git reflog 将显示更新的任何更改HEAD并检查所需的引用日志条目将设置HEAD回到这个提交。

每次修改 HEAD 时,都会在 HEAD 中产生一个新条目reflog

git reflog
git checkout HEAD@{...}

这会让你回到你想要的提交


git reset --hard <commit_id> https://git-scm.com/docs/git-reset

将您的 HEAD“移”回所需的提交。

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • Note: (从 Git 2.7 开始 https://github.com/git/git/blob/master/Documentation/RelNotes/2.7.0.txt)您还可以使用git rebase --no-autostash以及。

git revert <sha-1> https://git-scm.com/docs/git-revert

“撤消”给定的提交或提交范围。
恢复命令将“撤消”给定提交中所做的任何更改。
将提交带有撤消补丁的新提交,同时原始提交也将保留在历史记录中。

# Add a new commit with the undo of the original one.
# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>

此架构说明了哪个命令执行什么操作。
正如你所见,reset && checkout修改HEAD.

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

如何将 HEAD 移回之前的位置? (分离头)和撤消提交 的相关文章

  • 如何恢复已删除的文件[重复]

    这个问题在这里已经有答案了 可能的重复 在 Git 存储库中恢复已删除的文件 https stackoverflow com questions 953481 restore a deleted file in a git repo 如何恢
  • 当我所做的只是压缩提交时,为什么 git-rebase 会给我带来合并冲突?

    我们有一个包含 400 多个提交的 Git 存储库 其中前几十个提交需要大量的反复试验 我们希望通过将许多提交压缩为单个提交来清理这些提交 当然 git rebase 似乎是最佳选择 我的问题是它最终会产生合并冲突 而且这些冲突并不容易解决
  • Git:从远程获取特定对象

    在工作中我们必须应对一个非常庞大的 git 存储库 90Go 在尝试调整本地副本上的一些内容后 我的包文件出现错误 尝试解压它 我可能删除了一些目标文件 例如 gt git GC 错误 无法读取 af9ed8 snip 致命 坏树对象 af
  • Git 粒度——解决一行内的差异

    git 基于行的粒度或 diff 粒度是否可以增加到单词 字母分辨率 每行多条语句或使用 git 编写纯文本是值得的 根据评论重新阅读问题时 我想我明白了您最初的意思 所以我将给出一个真正的答案 与伊斯梅尔 巴达维的一行评论 https s
  • git:推送单个提交

    假设我进行了多次提交 并希望挑选哪些提交到远程存储库 我该怎么做 在ascii中 C1 gt C2 gt C3 gt C4 我想推C2和C4 通过变基 重置 推送然后重置进行重新排序是否有效 C1 gt C2 gt C3 gt C4 gt
  • 从 svn 到 git,移动了主干

    我正在尝试将 svn 存储库切换到 git 这是一个旧的存储库 以前的维护者之一为每个新版本移动了主干 例如 以前的存储库位于 svn ssh svn mycompany com project release 1 trunk 现在 我们当
  • 有没有办法显示 Visual Studio 执行的 Git 命令? [复制]

    这个问题在这里已经有答案了 在 Visual Studio Code 中 有一个 显示 Git 输出 菜单项 显示最近运行的 Git 命令 有关其外观的示例 请参阅3 35 在这个视频中 https code visualstudio co
  • 使用可通过 FTP 访问的 Web 服务器进行 Git 托管?

    我运行一个 糟糕的 网站 托管在第三方网络服务器上 我可以通过 FTP 访问我的 Web 服务器 据推测 Git 本身具有通过 FTP 推送 拉取的能力 由于我的 Web 服务器已经可以随处访问 我希望将其用作集中式 Git 存储库 我可以
  • AngularJs:显示来自 git 或 Bower 的版本号

    我创建了一个 Angular 应用程序 我想在屏幕上显示应用程序的当前版本号 目前我已将其实现为常量 application constant constants VERSION 1 1 2 但这需要我在每个新版本上更新常量 我使用 Bow
  • 获得干净的 git 沙箱的最有效方法是什么?

    对于我的持续集成构建 我想确保我的 git 沙箱中没有存放任何杂散文件 并且没有任何文件被无意中更改 我知道关于git reset hard HEAD 这解决了部分问题 但我想我想做的是删除所有未跟踪和忽略的文件 我可以用蛮力的方式做到这一
  • 运行 npm install - 如何配置不使用 SSH(端口被防火墙阻止)

    当我跑步时npm install大多数模块配置正确 然而 至少有人想击中ssh 拉取模块的地址 不幸的是 我的公司有一项政策 不允许内部网络之外的 SSH 连接 我收到的具体错误是 Error while executing npm ERR
  • Heroku——从多台计算机部署?

    我有两台计算机 我希望它们都能够从 github 上的同一个存储库拉取 推送 并部署到 heroku 上的同一个应用程序 我知道 Heroku 允许您在另一台计算机上克隆其 git 存储库 以便它也可以链接起来 但我不希望第二台计算机克隆
  • git fetch 失败“refs/remotes/origin/pr/34 同时跟踪两者”

    我是 git 新手 我被困在 git fetch 上 我在 TFS 和 SVN 上有更多经验 所以欢迎任何类比 所以我在 Github 上找到了一个我分叉的项目 源项目 Xpose 有色状态栏 https github com Mohamm
  • git 压缩并保留上次提交的时间戳

    考虑我有提交 A B C 如果我使用git rebase i将所有三个提交压缩为一个 我们可以 pick A squash B squash C 我看到结果提交A有其原始时间戳 如何让它继承提交的时间戳C 最后一个 我能想到的是git co
  • 如何从 git 镜像克隆中排除拉取请求

    我想将一个 Bitbucket 存储库镜像克隆到另一个 Bitbucket 存储库 我使用 shell 脚本来管理它 该脚本执行以下操作 git clone mirror
  • 如何 git reset --hard 子目录

    UPDATE 在 Git 2 23 2019 年 8 月 中 有一个新命令git restore这样做的 请参阅接受的答案 https stackoverflow com a 15404733 946850 UPDATE 从 Git 1 8
  • 在VSO或VS2015中创建Git分支标签

    有没有办法在 vso 中创建分支标签 另外 我尝试在 VS2015 中创建标签并将更改提交推送到 vso 但我在 vso 中没有看到该标签 只是想知道 VS2015 VSO 标记功能是否到位 您在 VS2015 中创建的标签位于本地存储库中
  • 如何在不修改 git 历史记录的情况下在我的源代码上运行代码格式化程序?

    我正在尝试使用代码格式化工具格式化整个存储库 这样做时 我想保留有关谁提交了哪一行的信息 以便像这样的命令git blame仍然显示正确的信息 我的意思是它应该显示作者之前编辑过每一行 在格式化之前 git filter branch 命令
  • 如何撤消 git pull?

    由于远程源上不需要的提交 我想撤消 git pull 但我不知道必须重置回哪个版本 我怎样才能回到在远程源上执行 git pull 之前的状态 或者使其比其他答案更明确 git pull whoops git reset keep HEAD
  • 如何防止 Git 对象被垃圾回收?

    据我了解 任何对象在没有任何对象时都会被垃圾收集refs 防止收集我们想要保留在数据库中的对象的最佳方法是什么 一个用例是 当在拉取请求中进行更改 可能根据代码审查 并且以前的提交变得分离时 它们不会合并到存储库中but它们应该始终可用 以

随机推荐