解决Git推送拒绝问题后,执行命令导致README.md消失求助
问题原因与解决办法
为啥README.md没了?
你最后一步用git push -f origin main是核心问题——强制推送会直接用本地分支覆盖远程分支。而你之前的merge、rebase操作没把本地新增的README.md正确合并到包含远程最新提交的分支里,导致本地main分支其实没有这个文件(或者你的本地提交被远程内容覆盖了),强制推送后远程main反过来覆盖了你的本地仓库,自然README.md就消失了。
拆解你操作里的问题点:
git merge main:你刚fetch了远程main,但本地main分支没更新,这步合并的是你自己本地的main分支,等于没合并任何远程新内容,完全没用。git rebase tmp:如果这时候你没切换到本地main分支,或者tmp分支(远程拉下来的)比本地main新,rebase会把你的本地提交放到tmp后面;如果过程中出了冲突你没处理,rebase会中断,你以为没生效,其实分支状态已经乱了。- 最后强制推送时,你的本地main要么没包含README.md,要么被远程分支内容覆盖,导致文件丢失。
怎么找回README.md?
- 先查Git提交历史,找到包含README.md的那笔提交:
git log --all -- README.md
- 拿到对应的提交哈希后,把文件恢复到本地:
git checkout <提交哈希> -- README.md
- 重新正确处理远程分支冲突:
- 拉远程最新内容:
git fetch origin main - 切回本地main分支:
git checkout main - 推荐用rebase合并(提交记录更干净):
git rebase origin/main,遇到冲突就解决,然后git add README.md,再git rebase --continue - 也可以用merge:
git merge origin/main,解决冲突后提交 - 最后正常推送:
git push origin main
- 拉远程最新内容:
以后遇到「! [rejected] main -> main (fetch first)」该怎么做?
- 别上来就强制推送,先执行
git fetch origin main拉取远程最新内容 - 要么用
git rebase origin/main把本地提交放到远程提交之后,解决冲突再推送;要么用git merge origin/main合并后推送 - 只有你确定自己分支内容绝对正确,且必须覆盖远程时,再用
git push -f,这步一定要谨慎,会丢远程的提交记录。
内容的提问来源于stack exchange,提问作者user19816368
相关产品推荐
相关产品推荐

