Spy*_*ros 1206 git push git-push git-non-bare-repository
我已经设置了一个远程非裸"主"仓库并将其克隆到我的电脑上.我做了一些本地更改,更新了我的本地存储库,并将更改推送回我的远程仓库.到目前为止,情况还不错.
现在,我不得不改变远程仓库中的东西.然后我在当地的回购中改变了一些东西.我意识到不需要改变远程仓库.所以我尝试git push
从我的本地仓库到我的远程仓库,但我收到的错误如下:
为防止您丢失历史记录,拒绝非快进更新在再次推送之前合并远程更改.有关
git push --help
详细信息,请参阅"关于快进的注意事项"部分.
我以为那可能是一个
git push --force
Run Code Online (Sandbox Code Playgroud)
将强制我的本地副本将更改推送到远程副本并使其相同.它确实强制更新,但当我回到远程仓库并进行提交时,我注意到文件包含过时的更改(主远程仓库以前有过).
[我]尝试强制,但当回到主服务器保存更改时,我得到过时的暂存.因此,当我提交存储库时不一样.当我再次尝试使用git push时,我得到了同样的错误.
我该如何解决这个问题?
Kat*_*tie 2194
做就是了:
git push origin <your_branch_name> --force
Run Code Online (Sandbox Code Playgroud)
或者如果您有特定的回购:
git push https://git.... --force
Run Code Online (Sandbox Code Playgroud)
这将删除您之前的提交并推送您当前的提交.
它可能不合适,但如果有人偶然发现这个页面,他们认为他们可能想要一个简单的解决方案......
另外请注意,-f
是短期的--force
,所以
git push origin <your_branch_name> -f
Run Code Online (Sandbox Code Playgroud)
也会工作.
cre*_*gox 238
如果push --force
不起作用,你可以做到push --delete
.看看这个实例的第二行:
git reset --hard HEAD~3 # reset current branch to 3 commits ago
git push origin master --delete # do a very very bad bad thing
git push origin master # regular push
Run Code Online (Sandbox Code Playgroud)
但要注意......
换一种说法:
force
推动公共存储库.pull
.reset
或有人可能已经撤回rewrite
的回购历史.当然,即使是这个规则也有极少数例外情况,但在大多数情况下,它不需要这样做,它会给其他人带来问题.
并且要小心你推动公共回购.回复:
git revert -n HEAD~3..HEAD # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master # regular push
Run Code Online (Sandbox Code Playgroud)
实际上,两个原始HEAD(来自还原和邪恶重置)都将包含相同的文件.
push --force
另一个问题push --force
可能是当有人在你做之前推动任何东西时,但是在你已经取出之后.如果您现在推动您的重新定版版本,您将替换其他人的工作.
git push --force-with-lease
在git 1.8.5中引入(感谢@VonC对该问题的评论)试图解决这个具体问题.基本上,如果自最近一次获取后远程被修改,它将带来错误并且不会推送.
如果你真的确定push --force
需要它,但仍然希望防止更多问题,这是很好的.我会说它应该是默认push --force
行为.但它仍然远没有成为迫使一个人的借口push
.谁的人获取你的前底垫中仍然有很多的烦恼,可能你已经很容易地避免的恢复来代替.
既然我们在谈论git --push
实例......
@linquize在评论中引入了一个很好的推力示例:敏感数据.你错误地泄露了不应该推送的数据.如果你足够快,你可以通过强制推顶来"修复"*
它.
*
该数据仍然会在遥控器上,除非你也做了垃圾收集,或以某种方式进行清洁.其他已经取得它的人也有明显的潜力传播,但你明白了.
ubi*_*bik 18
首先,我不会直接在"主"回购中进行任何更改.如果你真的想要一个"主要"回购,那么你应该只推动它,永远不要直接改变它.
关于你得到的错误,你有没有尝试过git pull
当地的回购,然后再git push
回到主回购?你目前正在做的事情(如果我理解得很好)是强迫推动,然后在"主"回购中失去你的变化.您应该首先在本地合并更改.
Ice*_*nte 15
如果我在我的本地分支A上,并且我想强制将本地分支B推送到原始分支CI,则可以使用以下语法:
git push --force origin B:C
Run Code Online (Sandbox Code Playgroud)
Jac*_*ana 13
git push --force
会完成这项工作,尽管git push --force-with-lease
这是一个更安全的命令
git push --force
覆盖远程分支,而git push --force-with-lease
仅当本地副本知道远程分支上的所有提交时才覆盖远程分支。这种差异使得破坏其他人\xe2\x80\x99s 对项目的更改变得更加困难。
Von*_*onC 11
我真的建议:
只推送到主回购
确保主仓库是一个裸仓库,以便永远不会遇到主要仓库工作树与其.git
基础不同步的任何问题.请参阅" 如何将本地git存储库推送到另一台计算机? "
如果你必须在main(裸)repo中进行修改,克隆它(在主服务器上),进行修改并推回到它
换句话说,保持可以从主服务器和本地计算机访问裸存储库,以便从/向其提取/拉出单个上游存储库.
小智 10
使用以下命令:
git push -f origin master
Run Code Online (Sandbox Code Playgroud)
小智 10
我也有同样的问题,但最后想通了。您最可能需要做的是运行以下两个 git 命令(用 git 提交修订号替换 hash):
git checkout <hash>
git push -f HEAD:master
Run Code Online (Sandbox Code Playgroud)
小智 6
如果您使用 Github 访问令牌进行身份验证,请尝试以下操作:
git remote set-url origin https://YourTokenNum@github.com/UserName/ProjectName
git push --force --set-upstream origin master
使用--force-with-lease
可能是更好的选择:
git push <remote> <branch> --force-with-lease
Run Code Online (Sandbox Code Playgroud)
它确保在您修改分支之前没有人更新该分支,因此您不会覆盖他们的更改。
这是我们在维护历史记录时替换公司gitHub存储库上的master的解决方案.
push -f
掌握企业存储库通常会被禁用以维护分支历史记录.这个解决方案对我们有用.
git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master
Run Code Online (Sandbox Code Playgroud)
git checkout currentBranch // move to target branch
git merge -s ours master // merge using ours over master
// vim will open for the commit message
git checkout master // move to master
git merge currentBranch // merge resolved changes into master
Run Code Online (Sandbox Code Playgroud)
推动您的分支机构desiredOrigin
并创建PR
归档时间: |
|
查看次数: |
1179763 次 |
最近记录: |