【问题标题】:Undo a git commit + git branch <branchname> -- with a twist撤消 git commit + git branch <branchname> -- 稍作改动
【发布时间】:2011-10-01 22:39:12
【问题描述】:

我正在“事后记录”应用程序开发的历史,方法是移动项目目录树的现有快照(当时通过普通和原始文件夹副本保存,而不是 git 或任何其他版本控制)到 git。

在努力学习 git 的新概念和新术语之后,这个迁移过程似乎进展顺利,突然我发现:“糟糕……我上一个 git commit + git branch &lt;branchname&gt; 跳过了一个快照。 "

由于提交快照的顺序对我来说很重要,我想完全撤消最后一个git commit + git branch &lt;branchname&gt;好像它从未完成过

即“通过修改提交来修复”,如 Git 书籍中 Undoing in Git 章节底部的定义。

一切仍然是本地的(我没有“发布”也没有“推送”任何东西),所以我相信这符合关于“重写历史”的警告。 :)

您能否根据我的理解确认或更正以下所需的步骤?

  1. 清空工作目录(没有 删除.git 子目录, 当然)
  2. git checkout &lt;folder-name&gt; (将工作目录带回 紧随其后的状态 我提交了错误的文件夹和 通过 git 分支标记它)
  3. git branch -D <branchname-of-mistaken-folder-commit>
  4. git commit --amend

此时我希望 git 不再记得最后一个分支和提交已经完成,并且工作目录包含错误的文件夹(我将删除它,完全替换为我跳过的那个)。这是正确的吗?

【问题讨论】:

  • 您似乎混淆了分支和标签。如果要为提交创建永久标记,请使用git tag
  • @svick 当我真正的意思是 时,我错误地犯了将 参数标记为 的罪行。感谢 +1 指出这一点。
  • 在这种情况下,为什么要为每次提交创建新分支?我可以理解为它们创建标签(例如,如果每个快照代表编号版本),但不是分支。
  • @svick 我最近似乎错误地提交了太多...... :) 回答你的问题,我是一个来自多年 CVS 的 git 新手,创建一个新分支是我 @987654331 的方式@-ing 他们。目标是给每个这样的提交一个名称,以便我可以用我当时给它的快照的名称来识别它。我不认为我会分出一个较旧的分支,但到目前为止,这对我来说效果很好。然而,我总是很高兴学习更好的方法。 +1。

标签: git git-branch git-commit


【解决方案1】:

如果你在master 分支上,只删除你刚刚所做的提交,你所要做的就是:

  1. git branch -D &lt;name of the branch&gt;删除分支
  2. git reset --hard HEAD^ 将当前分支重置为上一个提交及其所在的工作目录

之后,你可以正常提交忘记的目录,然后你重置的那个。

【讨论】:

  • 完美。我刚刚验证了这对我来说非常有效,完全符合我的预期。谢谢+1。
  • 有趣的是,我不需要git commit --amend。这是否意味着错误的提交仍然记录在 .git 的某个地方?
  • @WinWin,起初,git 会保存你所做的 all 提交。因此,当您使用git reset --hard 时,提交仍然存在,但使用普通方法无法访问。当使用git commit --amend 时,同样的情况:旧版本仍然存在。要获取旧版本,您可以使用 reflog。在默认设置下,reflog 中的条目会在 90 天后过期。之后,提交将被自动删除(或者您可以使用git gc 手动删除)。
猜你喜欢
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2017-01-08
  • 2011-05-28
  • 1970-01-01
相关资源
最近更新 更多