Tre*_*ris 997
您应该能够使用强制对远程仓库进行本地修订
git push -f <remote> <branch>
Run Code Online (Sandbox Code Playgroud)
(例如git push -f origin master).娅<remote>和<branch>将力推已设定的所有地方分公司--set-upstream.
请注意,如果其他人共享此存储库,则其修订历史记录将与新存储库冲突.如果他们在变更点之后有任何本地提交,他们将变为无效.
更新:我想我会添加一个旁注.如果您要创建其他人将要审核的更改,那么创建具有这些更改的分支并定期进行rebase以使其与主开发分支保持同步并不罕见.只是让其他开发者知道这会定期发生,所以他们会知道会发生什么.
更新2:由于观众人数不断增加,我想添加一些额外的信息,告诉他们在您upstream遇到强制推动时该怎么做.
假设我已经克隆了您的仓库,并添加了一些提交,如下所示:
D----E topic
/
A----B----C development
但后来development分支被a命中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选项作为"更安全"的推力,正如Cupcake在他的回答中所提到的:
使用"租约"强制推送允许强制推送失败如果遥控器上有新的提交你没想到(技术上,如果你还没有将它们提取到你的远程跟踪分支中),这很有用你不想意外地覆盖别人甚至还不知道的提交,你只想覆盖自己的:
Run Code Online (Sandbox Code Playgroud)git push <remote> <branch> --force-with-lease您可以
--force-with-lease通过阅读以下任何内容了解有关如何使用的更多详细信息:
小智 122
您基本上想要做的是强制推送您的本地分支,以覆盖远程分支.
如果您想要对以下每个命令进行更详细的说明,请参阅下面的详细信息部分.你基本上有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
Run Code Online (Sandbox Code Playgroud)
如果您想要更详细地解释每个命令,请参阅下面的长答案部分.
警告:强制推送将使用您正在推送的分支的状态覆盖远程分支.在使用它之前,请确保这是您真正想要做的事情,否则您可能会覆盖您实际想要保留的提交.
您可以完全指定特定分支和远程.该-f标志是短版--force
git push <remote> <branch> --force
git push <remote> <branch> -f
Run Code Online (Sandbox Code Playgroud)
当省略分支推送分支时,Git将根据您的配置设置找出它.在2.0之后的Git版本中,新的repo将具有默认设置来推送当前签出的分支:
git push <remote> --force
Run Code Online (Sandbox Code Playgroud)
在2.0之前,新的repos将具有推送多个本地分支的默认设置.有问题的设置是remote.<remote>.push和push.default设置(见下文).
当省略remote和branch时,just的行为git push --force由你的push.defaultGit配置设置决定:
git push --force
Run Code Online (Sandbox Code Playgroud)
从Git 2.0开始,默认设置simple基本上只是将当前分支推送到其上游远程对应部分.遥控器由分支的branch.<remote>.remote设置决定,否则默认为原始仓库.
在Git 2.0版之前,默认设置,matching基本上只是将所有本地分支推送到远程(默认为原点)的同名分支.
你可以阅读更多push.default的阅读设置git help config或git的-配置(1)手册的在线版本.
--force-with-lease使用"租约"强制推送允许强制推送失败如果遥控器上有新的提交你没想到(技术上,如果你还没有将它们提取到你的远程跟踪分支中),这很有用你不想意外地覆盖别人甚至还不知道的提交,你只想覆盖自己的:
git push <remote> <branch> --force-with-lease
Run Code Online (Sandbox Code Playgroud)
您可以--force-with-lease通过阅读以下任何内容了解有关如何使用的更多详细信息:
Von*_*onC 29
另一种选择(避免任何可能对其他贡献者造成问题的强制推送)是:
master的origin/mastermaster,始终保持提交从专用分支(意为创造之上的新修订master,这将反映竭诚为您分支).git merge --strategy=theirs.这样,你可以将master推送到远程,而不必强迫任何东西.
Jit*_*P N 23
对我有用:
git push --set-upstream <remote> <branch> -f
Run Code Online (Sandbox Code Playgroud)
小智 13
git push -f有点破坏性,因为它会重置团队中其他任何人所做的任何远程更改。更安全的选择是
git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)
所做--force-with-lease的就是拒绝更新分支,除非它是我们期望的状态;即没有人更新上游分支。在实践中,这是通过检查上游引用是否是我们所期望的来实现的,因为引用是哈希值,并且将父链隐式编码为其值。
您可以--force-with-lease确切地知道要检查什么,但默认情况下将检查当前的远程引用。这在实践中意味着,当 Alice 更新她的分支并将其推送到远程存储库时,分支的 ref 指向头将被更新。现在,除非 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
Run Code Online (Sandbox Code Playgroud)
附:接受的答案对我不起作用。不知道是不是Git版本的问题。