我正在master分支中处理一些代码,需要切换焦点。我(没有好好考虑)用一个粗俗的分支名称打开了一个新分支,并在那里提交了我的代码。现在我需要使用这个代码。出于职业原因,我不希望这个粗俗的分支名称出现在我的同事和老板可能看到的任何地方。如果我分支我的粗俗分支分支到一个新分支,它们会是我的新分支的历史中的任何东西,还是提交后的主分支,引用粗俗分支名称?我的假设是不使用分支名称,只记录提交历史?
gv8xihay1#
分支名称是(起始)提交散列的“属性”。如果你远程删除分支,hystory会保存提交,但会丢失被删除分支的名称,正如预期的那样。要确保无法通过refs进行远程恢复,应运行远程git gc --aggressive。请记住,GitHub和GitLab会及时自动完成。
git gc --aggressive
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检查错误提交
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
wmtdaxz33#
从安全的Angular 来看,您的根本问题实际上并不只是特定的分支名称,而是您对...的整体使用。我们说些不为公众准备的事在一个最终可能会与公众共享的存储库中。如果该分支的名称已经是一个大问题,那么您可能还使用了...你可能不想与公众分享的措辞在其他地方,例如提交消息、代码注解,甚至函数或变量名。我建议你首先把所有的修改压缩到一个提交中,然后创建一个新的分支,不管你想把它合并到什么地方,挑选那个提交,然后非常小心地检查所有的修改,一行一行在进行任何公关或在任何地方发布它之前。如果你想格外小心:
git rebase -i <last-known-good-commit>
fixup
git log -p -1 > ~/that-commit.diff
cd <someplace-else>
git checkout -b today-is-wednesday
git apply ~/that-commit.diff
patch -p1 < ~/that-commit.diff
git add -i
然后你应该有一个干净的回购,可以安全地推动。虽然Git本身不会直接将分支名称存储在历史记录中,但其他工具(如编辑器)可能会将其存储在您可能想不到的地方。因此,我认为整个存储库都受到了损害,宁愿花额外的时间将补丁复制到一个“干净”的版本-同时仔细审查它们-而不是只希望最好的。如果你在本地分支中有多个提交,并且想保留它们的历史,你可以使用像git format-patch和git am这样的东西。在任何情况下,都要仔细检查,确保它不仅仅是Git历史记录,而且您也没有向实际代码中添加任何您不想共享的内容。
git format-patch
git am
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将提到以前的名字:
--move
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可能仍然会提到分支名称:
HEAD
[…] checkout: moving from vulgar to main
您可以使用以下命令删除HEAD的reflog:
git reflog expire --expire=now
但事后请与git reflog核对
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之后。
git push --delete origin vulgar
4条答案
按热度按时间gv8xihay1#
分支名称是(起始)提交散列的“属性”。
如果你远程删除分支,hystory会保存提交,但会丢失被删除分支的名称,正如预期的那样。
要确保无法通过refs进行远程恢复,应运行远程
git gc --aggressive
。请记住,GitHub和GitLab会及时自动完成。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
检查错误提交wmtdaxz33#
从安全的Angular 来看,您的根本问题实际上并不只是特定的分支名称,而是您对...的整体使用。我们说些不为公众准备的事在一个最终可能会与公众共享的存储库中。
如果该分支的名称已经是一个大问题,那么您可能还使用了...你可能不想与公众分享的措辞在其他地方,例如提交消息、代码注解,甚至函数或变量名。
我建议你首先把所有的修改压缩到一个提交中,然后创建一个新的分支,不管你想把它合并到什么地方,挑选那个提交,然后非常小心地检查所有的修改,一行一行在进行任何公关或在任何地方发布它之前。
如果你想格外小心:
git rebase -i <last-known-good-commit>
到处使用fixup
git log -p -1 > ~/that-commit.diff
cd <someplace-else>
git checkout -b today-is-wednesday
git apply ~/that-commit.diff
或patch -p1 < ~/that-commit.diff
git add -i
然后你应该有一个干净的回购,可以安全地推动。
虽然Git本身不会直接将分支名称存储在历史记录中,但其他工具(如编辑器)可能会将其存储在您可能想不到的地方。
因此,我认为整个存储库都受到了损害,宁愿花额外的时间将补丁复制到一个“干净”的版本-同时仔细审查它们-而不是只希望最好的。
如果你在本地分支中有多个提交,并且想保留它们的历史,你可以使用像
git format-patch
和git am
这样的东西。在任何情况下,都要仔细检查,确保它不仅仅是Git历史记录,而且您也没有向实际代码中添加任何您不想共享的内容。
nwwlzxa74#
分支名称只是一个引用(ref)。[1]如果你只是创建了它并使用了一点,那么它不太可能在任何地方共享。
所以简单的回答是,你不必担心,除非你已经把任何东西推到了任何地方。
本地分支名称
当你创建一个分支名称时,你会创建一个 ref,如果启用了reflog,也会为它创建一个reflog [2]。
例如(三次提交后):
如果你
--move
这个名字,那么reflog将提到以前的名字:如果你删除分支,那么reflog也会被删除:
但是
HEAD
的reflog可能仍然会提到分支名称:您可以使用以下命令删除
HEAD
的reflog:但事后请与
git reflog
核对本地分支名称:合并提交消息
注意默认的合并提交消息:
远程分支名称
只有当您已按下分支时,您才应关注:
如果是这样,你应该删除分支:
遥控器可能启用了reflog。如果是这样的话(根据我在非裸远程的测试),那么粗俗分支名称的reflog仍然会在那里,即使在
git push --delete origin vulgar
之后。注意事项