我想推送我的本地文件,并将它们放在远程仓库中,而不必处理合并冲突。我只希望我的本地版本优先于远程版本。
我怎样才能用 Git 做到这一点?
git push origin --force
不适合您吗?
config receive.denyNonFastforwards
找出答案。
您应该能够通过使用强制对远程仓库进行本地修订
git push -f <remote> <branch>
(例如 git push -f origin master
)。离开 <remote>
和 <branch>
将强制推送所有已设置 --set-upstream
的本地分支。
请注意,如果其他人共享此存储库,他们的修订历史将与新的冲突。如果他们在更改点之后有任何本地提交,他们将变得无效。
更新:我想我会添加一个旁注。如果您正在创建其他人将查看的更改,那么创建一个包含这些更改的分支并定期 rebase 以使它们与主开发分支保持同步并不少见。只需让其他开发人员知道这将定期发生,这样他们就会知道会发生什么。
更新 2:由于观看者的数量不断增加,我想补充一些额外信息,说明当您的 upstream
确实遇到强制推送时该怎么办。
假设我已经克隆了您的 repo 并添加了一些提交,如下所示:
D----E topic / A----B----C development
但后来 development
分支被 rebase
命中,这将导致我在运行 git pull
时收到如下错误:
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.
在这里我可以修复冲突和 commit
,但这会给我留下一个非常丑陋的提交历史:
C----D----E----F topic / / A----B--------------C' development
使用 git pull --force
可能看起来很诱人,但要小心,因为这会让你陷入搁浅的提交:
D----E topic A----B----C' development
所以可能最好的选择是做一个git pull --rebase
。这将要求我像以前一样解决任何冲突,但对于每个步骤而不是提交,我将使用 git rebase --continue
。最后,提交历史看起来会更好:
D'---E' topic / A----B----C' development
更新 3:您还可以使用 --force-with-lease
选项作为“更安全”的强制推送,as mentioned by Cupcake in his answer:
如果远程上出现您未预料到的新提交(从技术上讲,如果您尚未将它们提取到远程跟踪分支中),使用“租约”强制推送允许强制推送失败,这在以下情况下很有用你不想意外覆盖别人的你甚至不知道的提交,你只想覆盖你自己的: git push
你想强制推送
您基本上想要做的是强制推送您的本地分支,以覆盖远程分支。
如果您想对以下每个命令进行更详细的说明,请参阅下面的详细信息部分。使用 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>.push
和 push.default
设置(见下文)。
省略远程和分支
当远程和分支都被省略时,只有 git push --force
的行为由您的 push.default
Git 配置设置决定:
git push --force
从 Git 2.0 开始,默认设置 simple 基本上只会将您当前的分支推送到其上游远程对应部分。远程由分支的 branch.
在 Git 2.0 版本之前,默认设置,matching,基本上只是将所有本地分支推送到远程(默认为 origin)上具有相同名称的分支。
您可以通过阅读 git help config
或 an online version of the git-config(1) Manual Page 了解更多 push.default
设置。
使用 --force-with-lease 强制推送更安全
如果远程上出现您未预料到的新提交(从技术上讲,如果您尚未将它们提取到远程跟踪分支中),使用“租约”强制推送允许强制推送失败,这在以下情况下很有用您不想意外覆盖您甚至还不知道的其他人的提交,而只想覆盖您自己的:
git push <remote> <branch> --force-with-lease
您可以通过阅读以下任何内容来了解有关如何使用 --force-with-lease
的更多详细信息:
git推送文档
Git:如何忽略快进并将原点 [分支] 恢复到较早的提交?
--force-with-lease
选项 ;)
另一种选择(避免任何可能对其他贡献者造成问题的强制推送)是:
将您的新提交放在专用分支中
在 origin/master 上重置你的主人
将您的专用分支合并到 master,始终保留来自专用分支的提交(这意味着在 master 之上创建将反映您的专用分支的新修订)。有关模拟 git merge --strategy=theirs 的策略,请参阅“使一个分支像另一个分支的 git 命令”。
这样,您可以将 master 推送到远程,而无需强制执行任何操作。
为我工作:
git push --set-upstream origin master -f
git push -f
有点破坏性,因为它会重置团队中其他任何人所做的任何远程更改。更安全的选择是
git push --force-with-lease
--force-with-lease
所做的是拒绝更新分支,除非它是我们期望的状态;即没有人更新上游的分支。在实践中,这是通过检查上游 ref 是否符合我们的预期来工作的,因为 ref 是散列,并将父链隐式编码为它们的值。
您可以准确地告诉 --force-with-lease
要检查的内容,但默认情况下会检查当前的远程 ref。这在实践中意味着当 Alice 更新她的分支并将其推送到远程存储库时,分支的 ref 指向头将被更新。现在,除非 Bob 从远程进行拉取操作,否则他对远程的本地引用将过期。当他使用 --force-with-lease
进行推送时,git 将根据新远程检查本地 ref 并拒绝强制推送。 --force-with-lease
仅在没有其他人在此期间将更改推送到远程时才有效地允许您强制推送。系好安全带是--force
。
-f
标志推送到 OpenShift。本质上是把你的本地 git 放到 OpenShift 上。git push -f
。git push origin some_branch --force
,但它总是返回 Everything is up-to-date 消息。但是,git push origin your_branch:some_branch --force
这就是我所缺少的。希望能帮助到你!