git分支名称是否会在项目历史中持久化?

ovfsdjhp  于 2023-05-12  发布在  Git
关注(0)|答案(4)|浏览(55)

我正在master分支中处理一些代码,需要切换焦点。我(没有好好考虑)用一个粗俗的分支名称打开了一个新分支,并在那里提交了我的代码。现在我需要使用这个代码。
出于职业原因,我不希望这个粗俗的分支名称出现在我的同事和老板可能看到的任何地方。
如果我分支我的粗俗分支分支到一个新分支,它们会是我的新分支的历史中的任何东西,还是提交后的主分支,引用粗俗分支名称?
我的假设是不使用分支名称,只记录提交历史?

gv8xihay

gv8xihay1#

分支名称是(起始)提交散列的“属性”。
如果你远程删除分支,hystory会保存提交,但会丢失被删除分支的名称,正如预期的那样。
要确保无法通过refs进行远程恢复,应运行远程git gc --aggressive。请记住,GitHub和GitLab会及时自动完成。

hivapdat

hivapdat2#

Git不会直接将分支名称存储到历史中。但是你应该寻找合并提交,因为分支名称是提交消息的一部分。如果您没有此分支的任何合并,则它不会出现在项目历史记录中。在这种情况下,你只是git checkout -b nice && git branch -D bad-name && git push --delete origin bad-name && git push origin nice
您可以使用git log --all --grep bad-name检查错误提交

wmtdaxz3

wmtdaxz33#

从安全的Angular 来看,您的根本问题实际上并不只是特定的分支名称,而是您对...的整体使用。我们说些不为公众准备的事在一个最终可能会与公众共享的存储库中。
如果该分支的名称已经是一个大问题,那么您可能还使用了...你可能不想与公众分享的措辞在其他地方,例如提交消息、代码注解,甚至函数或变量名。
我建议你首先把所有的修改压缩到一个提交中,然后创建一个新的分支,不管你想把它合并到什么地方,挑选那个提交,然后非常小心地检查所有的修改,一行一行进行任何公关或在任何地方发布它之前。
如果你想格外小心:

  • 压缩所有更改:git rebase -i <last-known-good-commit>到处使用fixup
  • 一旦你只有一个commit,导出它:git log -p -1 > ~/that-commit.diff
  • 在其他地方克隆上游存储库。
  • 创建集成分支:cd <someplace-else>git checkout -b today-is-wednesday
  • 应用修补程序git apply ~/that-commit.diffpatch -p1 < ~/that-commit.diff
  • 喝杯咖啡
  • 非常仔细地验证git add -i

然后你应该有一个干净的回购,可以安全地推动。
虽然Git本身不会直接将分支名称存储在历史记录中,但其他工具(如编辑器)可能会将其存储在您可能想不到的地方。
因此,我认为整个存储库都受到了损害,宁愿花额外的时间将补丁复制到一个“干净”的版本-同时仔细审查它们-而不是只希望最好的。
如果你在本地分支中有多个提交,并且想保留它们的历史,你可以使用像git format-patchgit am这样的东西。
在任何情况下,都要仔细检查,确保它不仅仅是Git历史记录,而且您也没有向实际代码中添加任何您不想共享的内容。

nwwlzxa7

nwwlzxa74#

分支名称只是一个引用(ref)。[1]如果你只是创建了它并使用了一点,那么它不太可能在任何地方共享。
所以简单的回答是,你不必担心,除非你已经把任何东西推到了任何地方。

本地分支名称

当你创建一个分支名称时,你会创建一个 ref,如果启用了reflog,也会为它创建一个reflog [2]。
例如(三次提交后):

4a77267 (HEAD -> vulgar) vulgar@{0}: commit: Init
835ca5e vulgar@{1}: commit: Init
4d4cd99 vulgar@{2}: commit: Init
3c45b79 (main) vulgar@{3}: branch: Created from HEAD

如果你--move这个名字,那么reflog将提到以前的名字:

4a77267 (HEAD -> nice-name) nice-name@{0}: Branch: renamed refs/heads/vulgar to refs/heads/nice-name
4a77267 (HEAD -> nice-name) nice-name@{1}: commit: Init
835ca5e nice-name@{2}: commit: Init
4d4cd99 nice-name@{3}: commit: Init
3c45b79 (main) nice-name@{4}: branch: Created from HEAD

如果你删除分支,那么reflog也会被删除:

$ git branch -D vulgar
$ git reflog vulgar
fatal: ambiguous argument 'vulgar': unknown revision or path not in the working tree.

但是HEAD的reflog可能仍然会提到分支名称:

[…] checkout: moving from vulgar to main

您可以使用以下命令删除HEAD的reflog:

git reflog expire --expire=now

但事后请与git reflog核对

本地分支名称:合并提交消息

注意默认的合并提交消息:

Merge branch 'vulgar'

远程分支名称

只有当您已按下分支时,您才应关注:

git push origin vulgar

如果是这样,你应该删除分支:

git push --delete origin vulgar
git remote prune origin

遥控器可能启用了reflog。如果是这样的话(根据我在非裸远程的测试),那么粗俗分支名称的reflog仍然会在那里,即使在git push --delete origin vulgar之后。

注意事项

  1. ref是指向提交的指针。所以除了一个名字就没什么了
  2. reflog是本地的,或者更确切地说是特定于那个仓库的(不像在 pushfetch 上那样在任何地方共享)

相关问题