当前位置: 首页 > 知识库问答 >
问题:

强制“git push”覆盖远程文件

养淇
2023-03-14

我想推送我的本地文件,并将它们放在远程存储库上,而不必处理合并冲突。我只想让我的本地版本优先于远程版本。

我怎样才能用Git做到这一点?

共有3个答案

鲁淇
2023-03-14

另一个选择(为了避免任何对其他贡献者有问题的强制推动)是:

  • 将新提交的内容放入专用分支

这样,您就可以将master推到远程,而无需强制执行任何操作。

贺皓
2023-03-14
匿名用户

你基本上想要做的是强制推送你的本地分支,以覆盖远程分支。

如果您想对以下每个命令进行更详细的解释,请参阅下面的“我的详细信息”部分。使用Git强制推送基本上有4种不同的选择:

git push <remote> <branch> -f
git push origin master -f # Example

git push <remote> -f
git push origin -f # Example

git push -f

git push <remote> <branch> --force-with-lease

如果您想对每个命令进行更详细的解释,请参阅下面我的详细答案部分。

警告:强制推送将用正在推送的分支的状态覆盖远程分支。在使用它之前,确保这是您真正想要做的,否则您可能会覆盖您实际想要保留的提交。

您可以完全指定特定的分支和远程。-f标志是--force的简短版本

git push <remote> <branch> --force
git push <remote> <branch> -f

当分支到推送分支被省略时,Git将根据您的配置设置来解决它。在2.0之后的Git版本中,新的回购将具有默认设置来推送当前签出的分支:

git push <remote> --force

而在2.0之前,新回购协议将具有默认设置,以推送多个本地分支机构。有问题的设置是遥控器。

当省略远程和分支时,只有git推送--force的行为由您的push.defaultGit配置设置决定:

git push --force

>

在Git版本2.0之前,默认设置为匹配,基本上只会将所有本地分支推送到远程上具有相同名称的分支(默认为原点)。

您可以通过阅读git help config或在线版本的git-config(1)手册页面来阅读更多push.default设置。

使用“租约”强制推送允许强制推送失败,前提是远程设备上有您意想不到的新提交(从技术上讲,如果您还没有将它们提取到远程跟踪分支中),如果您不想意外覆盖您甚至还不知道的其他人的提交,这非常有用,你只想覆盖你自己的:

git push <remote> <branch> --force-with-lease

通过阅读以下任一内容,您可以了解有关如何使用<代码>--强制租赁的更多详细信息:

  • git推送留档
  • Git:如何忽略快进并将起源[分支]恢复为早期提交?

汪永春
2023-03-14

您应该能够通过使用

git push -f <remote> <branch>

(例如git push-f源主)。离开

请注意,如果其他人共享此存储库,他们的修订历史将与新存储库冲突。如果在更改点之后有任何本地提交,它们将变得无效。

更新:我想我会添加一个旁注。如果您正在创建其他人将审查的更改,那么创建一个包含这些更改的分支并定期重新设置基址以使其与主开发分支保持同步并不少见。只要让其他开发人员知道这将定期发生,这样他们就知道会发生什么。

更新2:由于越来越多的观众,我想补充一些额外的信息,说明当你的上游遇到强制推送时该怎么做。

假设我已经克隆了您的回购,并添加了一些类似的提交:


            D----E  topic
           /
A----B----C         development

但是后来开发分支被rebase击中,这将导致我在运行git拉取时收到这样的错误:


Unpacking objects: 100% (3/3), done.
From <repo-location>
 * branch            development     -> FETCH_HEAD
Auto-merging <files>
CONFLICT (content): Merge conflict in <locations>
Automatic merge failed; fix conflicts and then commit the result.

在这里,我可以修复冲突和提交,但这会给我留下一个非常丑陋的提交历史:


       C----D----E----F    topic
      /              /
A----B--------------C'  development

使用git pull--force可能看起来很吸引人,但要小心,因为这会让你陷入束手无策的提交:


            D----E   topic

A----B----C'         development

所以最好的选择可能是做一个git拉--rebase。这将需要我像以前一样解决任何冲突,但是对于每一步,而不是提交,我将使用git rebase--继续。最后,提交历史会看起来更好:


            D'---E'  topic
           /
A----B----C'         development

更新3:您也可以使用--force-with-租赁选项作为更安全的强制推送,正如Cupkie在他的回答中提到的:

使用“租约”强制推送允许强制推送失败,前提是远程设备上有您意想不到的新提交(从技术上讲,如果您还没有将它们提取到远程跟踪分支中),如果您不想意外覆盖您甚至还不知道的其他人的提交,这非常有用,你只想覆盖你自己的:

git push <remote> <branch> --force-with-lease

通过阅读以下任一内容,您可以了解有关如何使用<代码>--强制租赁的更多详细信息:

  • git推送留档
  • Git:如何忽略快进并将起源[分支]恢复为早期提交?

 类似资料:
  • 问题内容: 是否可以强制重命名os.rename覆盖另一个文件(如果已经存在)?例如,在下面的代码中,如果文件Tests.csv已经存在,则将其替换为Tests.txt文件(该文件也已重命名为Tests.csv)。 问题答案: 您可以尝试: 或然后:

  • 如何强制覆盖上的本地文件? 场景如下: 一名团队成员正在修改我们正在开发的网站的模板 这是我遇到的错误: 错误:未跟踪的工作树文件“公共/图像/icon.gif”将被合并覆盖 如何强制Git覆盖它们?这个人是设计师——通常,我用手解决所有冲突,所以服务器有最新的版本,他们只需要在他们的计算机上更新。

  • 我正在使用安装我的python代码,使用 当我想要将我的代码的旧分支安装在新分支之上时,我遇到了一些问题:不会覆盖旧文件。一种方法是触摸()所有文件,因此它们必须比安装的文件更新,但这是非常难看的。 我正在寻找的是一个选项,以强制覆盖所有文件,例如。类似于 有什么想法吗?

  • 我得到以下错误: 错误:任务“:ui:进程执行失败”演示机器人测试手册“。java.lang.Runtime异常: 清单合并失败 : uses-sdk:minSdk 版本 1 不能小于在库中声明的版本 7 [com.android.support:回收视图-v7:23.3.0] E:\DHIS2_IN\Android\dhis2-android-new-sdk\ui\build\中间体\分解-aa

  • 我试图找到这个答案,但几乎找不到。我正在进行API测试,在此过程中,我需要从本地计算机调用其余的API。本地机器包含maven项目和调用相应rest API的框架。 我需要检查远程Rest API的代码覆盖率,并根据代码覆盖率形成报告。请帮忙,怎么做? 注意:我发现这个链接很有用,但是它没有详细说明该怎么做? http://eclemma.org/jacoco/trunk/doc/agent.ht

  • 文件已经存在,您可以覆盖它 (“是”按钮),跳过 (“否”按钮),重命名,全部重命名 ,覆盖全部文件 (“全部皆是” 按钮),跳过全部已存在的文件 (“全部皆否”按钮) 或取消 当前的操作。 如果您选择了全部重命名 模式,重命名文件将得到象 'filename(N).txt' 的名字,'filename.txt' 的位置是原始的文件名, 'N' 是数字。