951

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

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

4

6 回答 6

1293

您应该能够通过使用强制对远程仓库进行本地修订

git push -f <remote> <branch>

(例如git push -f origin master)。离开<remote>并将<branch>强制推送所有已设置的本地分支--set-upstream

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

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

更新 2:由于观众数量的增加,我想添加一些额外的信息,说明当您upstream遇到强制推送时该怎么做。

假设我已经克隆了您的 repo 并添加了一些提交,如下所示:

            D----E话题
           /
A----B----C开发

但是后来development分支被 a 击中rebase,这将导致我在运行时收到如下错误git pull

拆包对象:100% (3/3),完成。
来自 <repo-location>
 * 分支开发 -> FETCH_HEAD
自动合并 <文件>
CONFLICT(内容):合并 <locations> 中的冲突
自动合并失败;修复冲突,然后提交结果。

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

       C----D----E----F话题
      //
A----B-------------C'发展

使用它可能看起来很诱人,git pull --force但要小心,因为这会让你陷入搁浅的提交:

            D----E话题

A----B----C'发展

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

            D'---E'主题
           /
A----B----C'发展

更新 3:您还可以将该--force-with-lease选项用作“更安全”的强制推送,正如 Cupcake 在他的回答中提到的

如果远程上出现您未预料到的新提交(从技术上讲,如果您尚未将它们提取到远程跟踪分支中),使用“租约”强制推送允许强制推送失败,这在以下情况下很有用您不想意外覆盖您甚至还不知道的其他人的提交,而只想覆盖您自己的:

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

--force-with-lease您可以通过阅读以下任何内容来了解​​有关如何使用的更多详细信息:

于 2012-05-09T05:48:23.470 回答
144

你想强制推送

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

如果您想对以下每个命令进行更详细的说明,请参阅下面的详细信息部分。使用 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 版本中,新的 repo 将具有默认设置来推送当前签出的分支:

git push <remote> --force

而在 2.0 之前,新的 repos 将有默认设置来推送多个本地分支。有问题的设置是remote.<remote>.pushpush.default设置(见下文)。

省略远程和分支

当远程和分支都被省略时,just 的行为git push --force由你的push.defaultGit 配置设置决定:

git push --force
  • 从 Git 2.0 开始,默认设置 ,simple基本上只会将您当前的分支推送到其上游远程对应部分。远程由分支的branch.<remote>.remote设置确定,否则默认为原始存储库。

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

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

用力推更安全--force-with-lease

如果远程上出现您未预料到的新提交(从技术上讲,如果您尚未将它们提取到远程跟踪分支中),使用“租约”强制推送允许强制推送失败,这在以下情况下很有用您不想意外覆盖您甚至还不知道的其他人的提交,而只想覆盖您自己的:

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

--force-with-lease您可以通过阅读以下任何内容来了解​​有关如何使用的更多详细信息:

于 2014-07-15T21:21:01.173 回答
35

另一种选择(避免任何可能对其他贡献者造成问题的强制推送)是:

  • 将您的新提交放在专用分支中
  • 重置你masterorigin/master
  • 将您的专用分支合并到master,始终保留来自专用分支的提交(这意味着在其之上创建新修订master将反映您的专用分支)。
    有关模拟. _git merge --strategy=theirs

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

于 2012-05-09T06:00:57.320 回答
12

为我工作:

git push --set-upstream origin master -f
于 2019-07-30T18:54:04.947 回答
4

git push -f 有点破坏性,因为它会重置团队中其他任何人所做的任何远程更改。更安全的选择是 {git push --force-with-lease}。

{--force-with-lease} 所做的是拒绝更新分支,除非它是我们期望的状态;即没有人更新上游的分支。在实践中,这是通过检查上游 ref 是否符合我们的预期来工作的,因为 ref 是散列,并将父链隐式编码为它们的值。您可以准确地告诉 {--force-with-lease} 要检查的内容,但默认情况下会检查当前的远程参考。这在实践中意味着当 Alice 更新她的分支并将其推送到远程存储库时,分支的 ref 指向头将被更新。现在,除非 Bob 从远程进行拉取操作,否则他对远程的本地引用将过期。当他使用 {--force-with-lease} 进行推送时,git 将根据新远程检查本地 ref 并拒绝强制推送。{--force-with-lease} 仅在没有其他人在此期间将更改推送到远程时才有效地允许您强制推送。系上安全带是 {--force}。

于 2017-07-05T11:32:34.087 回答
-2

使用 tortoisegit 的简单步骤

GIT 提供本地文件提交并推送到 git 存储库。

脚步 :

1) stash 更改 存储名称

2)

3)存储弹出

4)提交 1 个或多个文件并给出提交更改描述集作者和日期

5)

于 2019-09-05T11:12:19.813 回答