我想推送我的本地文件到远程仓库,并且不必处理合并冲突。我只希望我的本地版本优先于远程版本。
如何使用Git实现这一目标?
git push -f <remote> <branch>
(例如git push -f origin master
)。省略<remote>
和<branch>
将强制推送所有已设置--set-upstream
的本地分支。
请注意,如果其他人共享此存储库,则其修订历史记录将与新修订冲突。如果他们在更改点之后有任何本地提交,这些提交将变为无效。
更新:我想补充一下。如果您正在创建其他人将要审查的更改,则创建一个包含这些更改的分支并定期进行变基以使其与主开发分支保持同步不是常见的情况。只需让其他开发人员知道这将定期发生,这样他们就会知道预期发生什么。
更新2:由于观看者数量越来越多,我想添加一些关于在upstream
遇到强制推送时该怎么做的额外信息。
假设我已经克隆了您的存储库,并添加了一些提交,如下所示:
D----E 主题 / A----B----C 开发
但是后来开发
分支被rebase
影响,当我运行git pull
时,将收到以下错误:
正在解包对象:100%(3/3),完成。 来自<repo-location> * 分支 开发 -> FETCH_HEAD 正在自动合并<files> 冲突(内容):<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
:
-f
标志将本地代码推送到OpenShift,从而实现将本地的git推送到OpenShift上。 - Wadegit push -f
。 - Michaelgit push origin some_branch --force
,但它总是返回“Everything is up-to-date”消息。但是,git push origin your_branch:some_branch --force
才是我缺少的部分。希望这可以帮到你! - Akhilremote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
- vtsimpremote: 请参阅https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls以获取有关当前推荐的身份验证方式的信息。
- vtsimp你基本上想要做的是强制推送你的本地分支,以覆盖远程分支。
如果你想要更详细地了解以下每个命令的解释,请参考下面的详细部分。你基本上有4个不同的选项来使用Git进行强制推送:
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
git push <remote> <branch> --force
git push <remote> <branch> -f
git push <remote> --force
在2.0之前,新的存储库将具有默认设置以推送多个本地分支。所涉及的设置是remote.<remote>.push
和push.default
设置(见下文)。
当远程和分支都被省略时,只有git push --force
的行为由您的push.default
Git配置设置决定:
git push --force
git push <remote> <branch> --force-with-lease
你可以通过阅读以下任何一篇文章来了解更多关于如何使用--force-with-lease
的详细信息:
git push
文档}}--force-with-lease
选项 ;)
- user456814另一种避免强制推送可能会对其他贡献者造成问题的选项是:
master
重置为origin/master
master
,始终保留来自专用分支的提交(意味着在master
顶部创建新修订,这些修订将镜像您的专用分支)。git merge --strategy=theirs
的策略。这样,您可以将主分支推送到远程而无需强制任何操作。
适用于我:
git push --set-upstream <remote> <branch> -f
git push -f
有一定的破坏性,因为它会重置团队中其他成员所做的任何远程更改。一个更安全的选项是
git push --force-with-lease
--force-with-lease
的作用是只有当分支处于预期状态时才更新它,也就是说没有人在上游更新过该分支。实际上,这是通过检查上游引用是否符合我们的期望来实现的,因为引用是哈希值,并隐式地将其父节点链编码为值。
您可以告诉--force-with-lease
要检查什么,但默认情况下将检查当前的远程引用。实际上,这意味着当Alice更新她的分支并将其推送到远程存储库时,指向该分支头的引用将被更新。现在,除非Bob从远程进行拉取,否则他本地对远程的参考将过时。当他使用--force-with-lease
进行推送时,Git将检查本地引用与新的远程引用,并拒绝强制推送。 --force-with-lease
实际上只允许您强制推送,如果在此期间没有其他人向远程推送更改。它相当于带着安全带的--force
。
// make sure your local branch is up to date
git checkout fix-build
git pull origin fix-build
// push your local branch to overwrite remote branch 'main'
git push -f origin fix-build:main
提示:对我来说,被接受的答案不起作用。我不确定是由于Git版本的原因。
config receive.denyNonFastforwards
查找。 - Frank Ngit push origin some_branch --force
,但它总是返回“Everything is up-to-date”消息。但是,git push origin your_branch:some_branch --force
才是我缺少的部分。希望这可以帮到你! - Akhil