我想推送我的本地文件,并将它们放在远程仓库中,而不必处理合并冲突。我只希望我的本地版本优先于远程版本。
如何使用Git做到这一点?
config receive.denyNonFastforwards
查找。
我想推送我的本地文件,并将它们放在远程仓库中,而不必处理合并冲突。我只希望我的本地版本优先于远程版本。
如何使用Git做到这一点?
config receive.denyNonFastforwards
查找。
Answers:
您应该可以使用以下命令将本地修订版本强制为远程仓库
git push -f <remote> <branch>
(例如git push -f origin master
)。离开<remote>
并<branch>
强制推动已建立的所有当地分支机构--set-upstream
。
请注意,如果其他人共享此存储库,他们的修订历史将与新的存储库发生冲突。并且如果它们在更改点之后有任何本地提交,则它们将变为无效。
更新:我想加个旁注。如果您要创建其他人可以查看的更改,那么创建具有这些更改的分支并定期重新设置基础以使它们与主要开发分支保持最新状态并不少见。只是让其他开发人员知道这会定期发生,以便他们知道会发生什么。
更新2:由于观众人数的增加,我想添加一些有关您upstream
遇到强行推举时该怎么做的信息。
假设我已经克隆了您的仓库,并添加了一些提交,如下所示:
D ---- E主题 / A ---- B ---- C发展
但是稍后用development
击中分支rebase
,这将导致我在运行时收到如下错误git pull
:
拆箱:完成100%(3/3)。 从<重新定位位置> *分支开发-> FETCH_HEAD 自动合并<文件> 冲突(内容):在<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。
您基本上想要做的就是强制推送本地分支,以覆盖远程分支。
如果要对以下每个命令进行更详细的说明,请参阅下面的“我的详细信息”部分。基本上,您可以使用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
如果省略了分支到push分支,Git将根据您的配置设置将其找出来。在2.0之后的Git版本中,新的仓库将具有默认设置以推送当前已签出的分支:
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开始,默认设置simple
基本上只会将当前分支推送到其上游远程对等部分。遥控器由分支机构的branch.<remote>.remote
设置确定,否则默认为原始存储库。
在Git 2.0版之前,默认设置matching
基本上只是将您的所有本地分支推送到遥控器上具有相同名称的分支(默认为起源)。
您可以push.default
通过阅读git help config
或在线版本的git-config(1)手册页来阅读更多设置。
--force-with-lease
如果使用“租用”强制推送,则如果遥控器上有您不期望的新提交(从技术上讲,如果尚未将其提取到远程跟踪分支中),则强制推送失败。您不想意外覆盖您甚至不知道的其他人的提交,而只想覆盖自己的提交:
git push <remote> <branch> --force-with-lease
您可以--force-with-lease
通过阅读以下任何内容来了解有关使用方法的更多详细信息:
另一个选择(避免任何可能对其他贡献者造成问题的强行推送)是:
master
的origin/master
master
,始终保留专用分支的提交(这意味着在其顶部创建新修订master
将反映您的专用分支)。git merge --strategy=theirs
。这样,您可以将master推送到远程,而无需强制执行任何操作。
git push -f有点破坏性,因为它会重置团队中其他任何人所做的任何远程更改。一个更安全的选择是{git push --force-with-lease}。
{--force-with-lease}所做的是拒绝更新分支,除非它是我们期望的状态。即没有人更新上游分支。在实践中,这是通过检查上游ref是否符合我们的期望来实现的,因为ref是散列,并将父链隐式地编码为其值。您可以确切地告诉{--force-with-lease}要检查的内容,但是默认情况下会检查当前的远程引用。实际上,这意味着当Alice更新其分支并将其推送到远程存储库时,分支的ref指向头将被更新。现在,除非Bob从遥控器上拉出,否则他对遥控器的本地引用将是过时的。当他使用{--force-with-lease}进行推送时,git将对照新的远程服务器检查本地引用,并拒绝强制进行推送。{--force-with-lease}仅在没有其他人在过渡期间将更改推到远程的情况下才有效地强制推入。系上安全带可以{--force}。
git push origin --force
为你工作吗?