【问题标题】:Git push commits without updating remote branch refGit推送提交而不更新远程分支参考
【发布时间】:2021-03-14 11:02:22
【问题描述】:

我正在处理一些提交,如果我的硬盘崩溃,我不想丢失它们。但是,我需要在完成之前更改它们(rebase、squash、reorder 等),所以我不能只将分支推送到远程,因为这需要我稍后强制推送,而我不想这样做做。

所以...我可以只上传提交而不更新远程分支标签。这样,我就可以下载 repo,找到我的提交,并在我的硬盘崩溃时继续工作。

问题是,我不知道该怎么做。我已经阅读了refspec parameter specification,它只是显示了指定要更新哪个参考的不同方法,但我不想更新任何参考。谷歌搜索也没有帮助,我看到的只是关于“樱桃采摘”之类的教程,我不想要。

从分离的头部推送也不起作用,它说使用git push origin HEAD:<name-of-remote-branch>,但我不想指定任何分支名称。

是否有一种(简单的)方法可以只上传提交而不更新任何参考? (不,无论如何推入一个分支,然后立即强制将该分支推回刚才的位置并不是一个好主意。)

【问题讨论】:

  • 如果您没有它们的命名引用,则无法保证远程存储库将它们保留很长时间,因为未引用的提交可能会被垃圾收集。此外,如果不添加命名引用,您可能无法“下载它们”。为什么不想在自己的分支上使用强制推送?
  • "你为什么不想在你自己的分支上使用强制推送?"因为有人可以将他们的分支基于它,当我稍后强制推送时,这将是非常糟糕的。
  • 在一个团队中,没有人应该将他们的新分支建立在其他正在进行的分支之上,除非已经决定并且这些分支上的开发人员正在沟通等。所以 应该 安全。我假设您不是直接针对 master 或 development(ment),而是针对功能分支,在这种情况下它应该是安全的。如果不是,您可能需要与您的团队讨论以确保它变得安全。
  • 要回答您的问题,而不是分支,请使用标签,并将其命名为您的姓名和正在进行的工作。如果您团队中的其他人以此为基础,并且在您完成工作时不准备清理,那么您可能想与他们认真讨论如何做事。但是,您可以只使用具有这种名称的分支来代替,让您自己更轻松,以便您在推送时仍然有一个向前移动的分支。

标签: git git-push


【解决方案1】:

恕我直言,最简单的方法是使用@flyingdutchman 的回答:推送到另一个分支。

你可以选择任何你想要的名字,例如:kajacx/dontreadthis/backups/20201202,或者任何适合你的名字,并且清楚地表明“这个分支是我的,并且是临时的”。


就 refspecs 而言:如果您提供的名称实际上是一个完整的 ref 名称(以 refs/... 开头),那么您可以推送到不会与常规分支一起列出的内容(分支只是 refs以refs/heads/... 开头)。

你可以试试:

git push origin HEAD:refs/kajacx/backups/20201202

不过,服务器可能有拒绝推送到此类引用的设置,所以 YMMV。

如果推送被接受:此引用将在git ls-remote origin 中列出。

一旦不再需要它们,您还必须清理“私人参考”。

【讨论】:

  • 谢谢,这可能是最接近我想要的。但我必须同意,只创建另一个名为“feature-WIP”的分支可能会更容易。
【解决方案2】:

第一个想法: 也许我在您的问题中错过了这个潜在的解决方案。如果没有,请按照this SO question 中的说明推送到不同的分支。

第二个想法: 为您当前的远程状态创建标签,推送标签或通过 Gitlab/Github 远程创建标签,然后强制推送您的新状态。该标签可确保保留您之前的提交。

【讨论】:

  • “只是推送到不同的分支”,然后另一个分支将有垃圾提交。不理想。 “为您当前的状态创建一个标签,然后强制推送。”以前没用过标签。你是什​​么意思“然后强制推动”?你的意思是我无论如何都应该推入分支并创建一个标签,这样我就不会忘记它在哪里?这和以前有同样的问题 - 我正在更新分支远程参考。
  • 但如果我没记错的话,您的目标是不丢失数据。关于额外的分支:分支不需要任何费用,您可以在不再需要它们后将其删除。那么你为什么不喜欢一个额外的分支呢?关于标签,我认为SO question 表明了我的意思。该标签将指向您的远程状态。第二个想法最终要求你使用强制推送。我明白你不希望那样。但如果其他人知道,这实际上是有风险的。
【解决方案3】:

创建一个不同的遥控器,将任何你喜欢的东西推送到它。在 GitHub 上,这通常是通过分叉原始存储库来完成的。如果您想保密,请在 U 盘上创建它(使用 git clone --bare ... 创建没有工作副本的克隆)。

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 2018-12-22
    • 1970-01-01
    • 2011-09-10
    • 2016-07-08
    • 2011-01-28
    • 2017-02-24
    • 2020-06-27
    • 2015-08-14
    相关资源
    最近更新 更多