我想推送我的本地文件,并将它们放在远程仓库上,而不必处理合并冲突。我只是希望我的本地版本优先于远程版本。
我怎么能用Git做到这一点?
答案 0 :(得分:901)
您应该可以使用
强制对远程仓库进行本地修订git push -f <remote> <branch>
(例如git push -f origin master
)。退出<remote>
和<branch>
将强制推送已设置--set-upstream
的所有本地分支。
请注意,如果其他人共享此存储库,则其修订历史记录将与新版本冲突。如果他们在变更点之后有任何本地提交,他们将无效。
更新:我想我会添加旁注。如果您要创建其他人将要审核的更改,那么创建具有这些更改的分支并定期进行rebase以使其与主开发分支保持同步并不罕见。只是让其他开发者知道这会定期发生,这样他们就会知道会发生什么。
更新2 :由于观看者数量不断增加,我想添加一些有关当upstream
遇到强制推动时该怎么做的其他信息。
说我克隆了您的回购并添加了一些提交,如下:
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 <remote> <branch> --force-with-lease
您可以详细了解如何使用
--force-with-lease
阅读以下任何内容:
答案 1 :(得分:111)
你基本上想要做的是强行推送你的本地分支,以覆盖远程分支。
如果您想要了解以下每个命令的更详细说明,请参阅下面的详细信息部分。你基本上有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会根据您的配置设置找出它。在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.<remote>.remote
设置决定,否则默认为原始仓库。
在Git 2.0版之前,默认设置matching
基本上只是将所有本地分支推送到远程(默认为原点)的同名分支。
您可以阅读push.default
或an online version of the git-config(1) Manual Page来阅读更多git help config
设置。
--force-with-lease
强制推送“租约”允许强制推送失败如果遥控器上有新的提交你没想到(技术上,如果你还没有将它们提取到你的远程跟踪分支中),如果您不想意外覆盖其他人甚至还不知道的提交,并且您只想覆盖自己的提交,则非常有用:
git push <remote> <branch> --force-with-lease
您可以通过阅读以下任何内容了解有关如何使用--force-with-lease
的更多详细信息:
答案 2 :(得分:28)
另一个选择(避免任何可能对其他贡献者造成问题的强制推送)是:
master
origin/master
master
,始终保持专用分支的提交(意味着在master
之上创建新修订,这将修改您的专用分支。)git merge --strategy=theirs
。这样,您可以将主人推送到远程,而不必强迫任何东西。
答案 3 :(得分:3)
git push -f有点破坏性,因为它会重置团队中任何其他人所做的任何远程更改。更安全的选择是{git push --force-with-lease}。
{--force-with-lease}做的是拒绝更新分支,除非它是我们期望的状态;即没有人更新上游分支。在实践中,这通过检查上游引用是我们期望的来工作,因为引用是哈希,并且隐式地将父代链编码为它们的值。 您可以准确地告诉{--force-with-lease}要检查的内容,但默认情况下会检查当前的远程引用。这在实践中意味着当Alice更新她的分支并将其推送到远程存储库时,分支的ref指向头将被更新。现在,除非Bob从遥控器拉出,否则他对遥控器的本地引用将会过时。当他使用{--force-with-lease}进行推送时,git将检查本地引用新远程并拒绝强制推送。 {--force-with-lease}有效地仅允许您强制推送,如果没有其他人在过渡期间将更改推送到远程。安全带上的{--force}。
答案 4 :(得分:2)
为我工作git push --set-upstream原始主站-f
答案 5 :(得分:0)
使用tortoisegit的简单步骤
GIT提交本地文件并推送到git存储库中。
步骤:
1)隐藏更改 藏匿名
2)拉
3)隐藏流行
4)提交 1个或多个文件,并提供提交更改描述集作者和日期
5)推