我希望推送本地文件,并将它们放在远程回购上,而不必处理合并冲突。我只是想让我的本地版本优先于远程版本。
我如何用Git做到这一点?
我希望推送本地文件,并将它们放在远程回购上,而不必处理合并冲突。我只是想让我的本地版本优先于远程版本。
我如何用Git做到这一点?
当前回答
另一种选择(避免任何可能给其他贡献者带来问题的强制推送)是:
把你的新提交放到一个专用的分支中 在原点/主节点上重置主节点 合并你的专用分支到master,始终保持来自专用分支的提交(意味着在master之上创建新的修订,这将镜像你的专用分支)。 参见“git command for making one branch like another”,了解模拟git merge的策略——strategy=their。
这样,你就可以把master推到远程,而不需要强制任何东西。
其他回答
你要用力推
你基本上要做的是强制推送本地分支,以便覆盖远程分支。
如果您想了解以下每个命令的更详细解释,请参阅下面的详细信息部分。你基本上有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
如果您想要每个命令的更详细解释,请参阅下面的“长回答”部分。
警告:强制推送将用您正在推送的分支的状态覆盖远程分支。在使用它之前,请确保这是您真正想要做的,否则您可能会覆盖您实际想要保留的提交。
力推细节
指定远程和分支
您可以完全指定特定的分支和远程。-f标志是——force的缩写
git push <remote> <branch> --force
git push <remote> <branch> -f
省略分支
当要推送分支的分支被省略时,Git将根据您的配置设置找出它。在Git 2.0之后的版本中,一个新的repo将有默认设置来推送当前签出的分支:
git push <remote> --force
而在2.0之前,新的回购将有默认设置来推送多个本地分支。所讨论的设置是remote.<remote>。Push和Push .default设置(见下文)。
省略遥控器和分支
当remote和branch都被忽略时,just git push——force的行为由你的push.default git配置设置决定:
git push --force
从Git 2.0开始,默认设置很简单,基本上只是将当前分支推到上游的远程对应部分。远程由分支的分支决定。远程设置,否则默认为原点回购。 在Git 2.0版本之前,默认设置匹配基本上只是将所有本地分支推到远程上具有相同名称的分支(默认为origin)。
你可以通过阅读git帮助配置或在线版本的git-config(1)手册页来阅读更多的push.default设置。
强力推进更安全,强力租赁
带“lease”的强制推送允许强制推送失败,如果远程上有你没有预料到的新提交(技术上来说,如果你还没有将它们获取到远程跟踪分支中),如果你不想意外地覆盖别人的提交,你甚至还不知道,而你只是想覆盖你自己的提交,这是很有用的:
git push <remote> <branch> --force-with-lease
你可以通过阅读以下任何一篇文章来了解关于如何使用——force-with-lease的更多细节:
Git推送文档 Git:如何忽略快进和恢复原点[分支]到更早的提交?
另一种选择(避免任何可能给其他贡献者带来问题的强制推送)是:
把你的新提交放到一个专用的分支中 在原点/主节点上重置主节点 合并你的专用分支到master,始终保持来自专用分支的提交(意味着在master之上创建新的修订,这将镜像你的专用分支)。 参见“git command for making one branch like another”,了解模拟git merge的策略——strategy=their。
这样,你就可以把master推到远程,而不需要强制任何东西。
您应该能够通过使用将本地修订强制到远程回购
git push -f <remote> <branch>
(例如git push -f origin master)。关闭<remote>和<branch>将强制推送所有设置了set- set-upstream的本地分支。
请注意,如果其他人正在共享这个存储库,那么他们的修订历史将与新的存储库冲突。如果它们在更改点之后有任何本地提交,它们将变得无效。
更新:我想我应该加上一个旁注。如果您正在创建其他人将检查的更改,那么使用这些更改创建一个分支并定期重新建立基础以使它们与主开发分支保持最新是很常见的。让其他开发人员知道这种情况会定期发生,这样他们就知道会发生什么。
更新2:由于观众越来越多,我想补充一些关于上游遇到外力时该怎么做的额外信息。
假设我克隆了你的回购,并添加了一些提交,如下所示:
D----E topic / A----B----C 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.
在这里,我可以修复冲突并提交,但这会留下一个非常丑陋的提交历史:
C----D----E----F topic / / A----B--------------C' development
使用git pull——force可能看起来很诱人,但要小心,因为这会让你陷入提交搁浅:
D----E topic A----B----C' development
所以可能最好的选择是做一个git拉,rebase。这将需要我像以前一样解决任何冲突,但对于每一步,而不是提交,我将使用git rebase -continue。最后,提交历史将看起来更好:
D'---E' topic / A----B----C' development
更新3:您还可以使用——force-with-lease选项作为“更安全”的强制 就像小蛋糕在他的 答:
Force pushing with a "lease" allows the force push to fail if there are new commits on the remote that you didn't expect (technically, if you haven't fetched them into your remote-tracking branch yet), which is useful if you don't want to accidentally overwrite someone else's commits that you didn't even know about yet, and you just want to overwrite your own: git push <remote> <branch> --force-with-lease You can learn more details about how to use --force-with-lease by reading any of the following: git push documentation Git: How to ignore fast forward and revert origin [branch] to earlier commit?
对我有用:
git push --set-upstream <remote> <branch> -f
Git push -f有点破坏性,因为它会重置团队中其他人所做的任何远程更改。更安全的选择是
git push --force-with-lease
——force-with-lease所做的是拒绝更新分支,除非它是我们所期望的状态;也就是说,没有人更新上游的分支。在实践中,这是通过检查上游的ref是否是我们所期望的,因为ref是哈希值,并隐式地将父链编码到它们的值中。
You can tell --force-with-lease exactly what to check for, but by default will check the current remote ref. What this means in practice is that when Alice updates her branch and pushes it up to the remote repository, the ref pointing head of the branch will be updated. Now, unless Bob does a pull from the remote, his local reference to the remote will be out of date. When he goes to push using --force-with-lease, git will check the local ref against the new remote and refuse to force the push. --force-with-lease effectively only allows you to force-push if no-one else has pushed changes up to the remote in the interim. It's --force with the seatbelt on.