手动将git分支头重新写入现在分离的提交对象

手动将git分支头重新写入现在分离的提交对象,git,Git,我想重新使用git数据库中的提交对象,该对象当前未连接到任何分支 场景如下:让我们调用我的最后一次提交A。从A开始,我开始对我的工作树进行更改,但很快意识到A中有一个bug需要修复。我修复了bug,并试图修改我的提交,而不添加任何其他更改,从工作树以来的时间 A < /代码>提交。我通过git reset--soft HEAD ^完成了这一点,然后只进行了修复bug所需的步骤。然后,我没有执行git commit-c ORIG_HEAD,而是意外地执行了git commit-a-c ORIG_H

我想重新使用git数据库中的提交对象,该对象当前未连接到任何分支

场景如下:让我们调用我的最后一次提交
A
。从
A
开始,我开始对我的工作树进行更改,但很快意识到
A
中有一个bug需要修复。我修复了bug,并试图修改我的提交,而不添加任何其他更改,从工作树以来的时间<代码> A < /代码>提交。我通过git reset--soft HEAD ^完成了这一点,然后只进行了修复bug所需的步骤。然后,我没有执行
git commit-c ORIG_HEAD
,而是意外地执行了
git commit-a-c ORIG_HEAD
(注意
-a
),因此我最终添加了所有我希望保持未过时状态的其他更改。修改后的提交可以称为
A'
,以区别于原始提交

我有
A
的原始提交对象的SHA1和,所有的blob应该仍然存在,因为这是最近的,我没有标记任何过期的东西。我正在考虑简单地编辑
.git/refs/heads/branch\u name
,让它指向
A
,然后根据需要在我的工作树中分段,并重新修改提交

在这种情况下,这是最好的行动方案吗?或者有更好的方法吗?

您可以重新指定您当前的分支名称,但我发现仅创建一个新的分支名称更容易、更安全:

git branch oops <hash>
git分支oops
现在,您可以手动记住分支名称
oops
。该名称保护提交(及其所有文件,以及可通过该提交及其所有文件访问的所有其他提交)不受垃圾回收器的影响,或多或少与该名称或任何其他名称保持其可访问性一样永久


(reflogs,对于
HEAD
和原始分支名称,默认情况下保持提交活动至少30天,因此您有那么长的时间来创建新名称。)

谢谢——一旦我签出
oops
,那么我会将
A'
中的更改重新设置到
oops
?然后将我的分支指针移动到
oops
,并允许
A'
最终过期?这取决于您:通过为分支创建一个名称(可能比
oops
:-)更优),您可以将所有Git用于所有事情。对于instnace,我对复杂的rebase的实际操作是重命名当前分支以添加数字或日期后缀,然后对从原始tip提交创建的新分支名称进行rebase。我以
feature/foo.0
feature/foo.1
feature/foo.2
。。。加上最新版本的
feature/foo
。如果我搞错了什么东西,我会升级所有的备用版本,直到我运行
git branch-D feature/foo.0
或任何可以抛出一个的东西。