使用Git底层命令手动创建提交失败的原因排查
手动创建Git提交:差最后一步就搞定啦!
嘿,你已经把手动创建提交的核心流程走通了,就差一个关键的小步骤——把你的master分支指向刚生成的提交对象!让我帮你把整个逻辑理清楚:
先复盘下你已经做对的事
你完成了Git底层提交的大部分核心环节:
- 初始化仓库:
git init - 把文件内容打包成blob对象:
echo "I'm an apple" > apple.txt+git hash-object -w apple.txt(得到哈希2d1b0d728be34bfd5e0df0c11b01d61c77ccdc14) - 通过缓存信息把blob以
orange.txt的名义加入暂存区:git update-index --add --cacheinfo 100644 2d1b0d728be34bfd5e0df0c11b01d61c77ccdc14 orange.txt - 生成tree对象(我猜你执行了
git write-tree,得到了一个tree哈希,比如假设是a1b2c3...) - 用
git commit-tree a1b2c3 -m "My manual commit"生成了提交对象,得到了一个commit哈希(比如d4e5f6...)
问题出在哪?
Git的分支本质就是一个指向提交对象的引用文件,存放在.git/refs/heads/目录下。当你用git commit命令时,Git会自动帮你更新当前分支的引用,让它指向新生成的提交。但你用底层命令手动创建提交时,这个步骤需要你自己来做!
补上遗漏的步骤
执行下面的命令,把master分支指向你刚生成的commit哈希(把d4e5f6...替换成你实际得到的commit哈希值):
git update-ref refs/heads/master d4e5f6...
或者更直观的写法:
git branch -f master d4e5f6...
现在再验证看看
做完这步后,你再执行:
git status:会显示工作区干净,没有异常状态git log:能正常看到你手动创建的提交记录git show master:可以看到提交里包含orange.txt,内容就是你最初写的"I'm an apple"
另外提一句:之前git status显示异常,是因为暂存区里有orange.txt,但你的工作区并没有这个文件,Git会提示它被"删除"了,这是手动操作底层命令的正常现象,等分支引用更新后,这个状态就会消失啦。
内容的提问来源于stack exchange,提问作者Grégoire Borel
相关产品推荐
相关产品推荐

