【问题标题】:Are Git Commits that are not part of a branch pushed?是否推送了不属于分支的 Git 提交?
【发布时间】:2020-10-19 18:50:42
【问题描述】:

今天我正在处理我的项目,我尝试了一种效果不佳的新算法。因此,我不想将它包含在项目中,但我想对存储库中的代码进行提交,以防我以后想参考它。这是我所做的:

git add .

git commit -m "Lorem ipsum..."

在我的笔记本中记下提交哈希并附上一些注释。

git reset HEAD^

所以现在,那个提交不是分支历史的一部分,但是如果将来我需要这个提交,我可以简单地使用提交哈希来检查它。但这是我的问题:

这个提交会被推送到远程吗?或者它会永远只保留在我的本地机器上吗?显然,这会很糟糕,因为如果我不得不移动机器等,我会在重新克隆时丢失这个提交。

【问题讨论】:

  • 一种天真的方法可能是对您刚刚提交的提交执行git revert - 这样提交将被推送到远程但它不会在HEAD
  • 这听起来很可怕!更好的方法是创建个人 WIP 分支并将其推送到远程,如果远程具有相关的问题跟踪系统,则连同 WIP PR/MR。不要让每个人都用未完成的垃圾堵塞master 或任何真正的分支。
  • 您可以有一个 WIP 分支,您可以在其中连续应用,然后还原每个变体,然后推送它。这样所有的提交都会被保留,但每个提交都基于原始代码。如果混乱不会进入“实时”分支,那也没关系。而且绝对比在没有上下文的情况下漂浮在以太中的孤立、神秘、不直观的提交更可取,即使这是可能的!
  • 请注意,如果您的重置提交没有分支或标签或其他永久名称,最终将被git gc 丢弃。只要它具有 一些 可查找的名称(包括 reflog 条目),它就会保留在您的存储库中,这对于此特定目的很重要。但是,Reflog 条目最终会过期并被清除。一旦它的唯一名称是它的哈希 ID,它就有资格进行 GC。
  • reflog 条目的默认生命周期为 30 或 90 天。 30 天的生命周期适用于这种特殊情况。之后,git gc 运行的 git reflog expire 将删除 reflog 条目,然后 git gc 运行的 git prune 将删除提交。 git gc 运行的确切时间很难预测:各种命令为您运行 git gc --auto--auto 模式检查 Git 是否认为 gc 会好。如果没有,auto-gc 会立即退出而不做任何事情,但如果是这样,它会在后台运行其余的日常工作。

标签: git


【解决方案1】:

当您推送到远程时,您通常会推送一个分支:

git push <remote> <local branch>:<remote branch>

如果当你推送你的分支时,你的提交不存在,它将不会被推送。

刚刚找到更深入的答案:Is it possible to push a commit which is not in any branch in git?

【讨论】:

    【解决方案2】:

    不,不会推送该提交。只有您正在推送的分支上的“活动”提交才会进入远程仓库。

    我的 2 条建议已经在 cmets 中了:

    1. 创建一个单独的分支。我更喜欢命名约定user/first.last/some-branch,它可以是您(或其他人)将来可能想要查看的提交的个人备份。我通常有一堆这种类型的树枝,我会每隔几个月清理一次垃圾。
    2. 提交更改,还原更改,然后在您推送时将历史记录保留在您的分支上。

    我几乎总是更喜欢 #1 而不是 #2。

    请注意,有一些方法可以推送与分支无关的提交,但我不推荐这样做,因为它们以后更难找到,并且如果没有分支或标签指向,最终可能会被垃圾收集它。 (详情请参阅this comment from torek。)

    【讨论】:

      猜你喜欢
      • 2013-04-26
      • 2019-08-03
      • 2021-05-31
      • 2020-10-08
      • 2017-02-24
      • 1970-01-01
      • 2020-07-23
      • 2021-03-14
      • 2012-10-22
      相关资源
      最近更新 更多