git - 永久修复分支名称和提交哈希之间的歧义

标签 git

所以我有一些 git 存储库:

git init
echo "Recipes" > README
git add README

然后我创建了一个名为“beef”的分支来存储我所有的牛排食谱:

git checkout -b beef

一段时间过去了,然后有人做出了提交:

GIT_AUTHOR_DATE='Tue Jan 1 00:00:00 2019 -0400' \
GIT_COMMITTER_DATE='Tue Jan 1 00:00:00 2019 -0400' \
GIT_COMMITTER_NAME='Chef' \
GIT_COMMITTER_EMAIL='<chef@localhost>' \
GIT_AUTHOR_NAME='Chef' \
GIT_AUTHOR_EMAIL='<chef@localhost>' \
git commit -m "New recipe:00100011000001010000000010100000"
git checkout -b master

呃哦...提交哈希以 beef 开头! [1] 现在,每次我想切换到我的牛肉分支时,我都会收到这条烦人的消息:warning: refname 'beef' is ambiguous.

更糟糕的是,如果我在其他地方克隆存储库并尝试第一次检查牛肉分支,我最终会在牛肉提交上得到一个分离的头!当然,我可以通过 git checkout --track origin/beef 而不是仅仅 git checkout beef 来解决这个问题,但现在我需要告诉所有使用我的项目的人特殊解决方法。

所以,长话短说,我的问题是:我有一个带有 git commit 前缀的分支。当我说 beef 时,我如何一劳永逸地告诉 git 我总是想引用分支,而不是提交?理想情况下,这应该适用于下载存储库的任何人,但即使是只在本地工作的修复也很好。

限制:

  • 我无法重命名/删除分支。其他人使用这个项目,他们希望分支在那里并命名为 beef。
  • 我无法修改/删除有问题的提交,因为它已被推送到共享仓库中的 master。
  • 我真的不想要像 this question 中提到的那样的临时解决方法每次使用牛肉分支时我都必须输入,我想要一种方法来一劳永逸地解决这个问题。

[1] 我花了太长时间试图让那个提交有一个以 beef 开头的可重现的散列......但是,是的,这是从我在真实存储库中看到的一个例子派生的(分支名称被更改以保护无辜者)。

最佳答案

目前似乎没有简单的解决办法。

我已经检查了设置 core.abbrev到更高的数字(例如 8 或 10 或...超过您的分支名称长度)不会阻止警告。

可能是 Git 2.23 命令 git switch 将缓解这个问题,因为它只切换 分支 (而 git restore 将恢复 tree content ,因此仍然会受到影响,因为树可以被提交或引用一个分支)

我刚刚对其进行了测试:该警告仍然存在,但至少,您只能切换到分支,因此不会造成混淆。


注意:正如我在“How would Git handle a SHA-1 collision on a blob?”中提到的,您可以使用bradfitz/gitbrute强制提交特定的 SHA1 前缀

关于git - 永久修复分支名称和提交哈希之间的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57504500/

相关文章:

macos - Git 差异 : Write output and exit instead of interactive mode

bash - 提示中的 Git 分支名称

ruby-on-rails - Rails GIT 忽略哪些文件

git - 检测到 Cygwin/Git 错误 cygheap base mismatch

git - 将书签存储在 Markdown 文件中,如何对标签进行编码?

Git - 如何更改子模块的 url/路径

git:从某个提交开始发布,将早期历史保密,但可证明

git - 如何在 rebase 后解决冲突并推送它们

gitk:如何告诉它 "stop, don' t 加载更多提交”?

git - 根据特定条件自动拒绝提交