git错误 ! [rejected] master -> master (non-fast-forward)

问题描述

执行: $ git pull origin master:master

当要push代码到git时,出现提示:

 ! [rejected]        master     -> master  (non-fast-forward)
 * [new branch]      master     -> origin/master

分析问题

我们可以这样理解这个问题就是:别人上传到远程仓库后,你没有及时的同步(、拉取)到本地,但是你同时又添加了一些内容(提交),以致于你在提交时,它会检测到你之前从远程仓库拉取的时候的仓库状态和现在的不一样。于是,它为了安全起见拒绝了你的提交(然后就报了这个错误)。

“不能快速前进”的原因是因为路不一样了,变得不好走了;体现在git里面就是提交历史出现分叉,主线不再是一条直线,而是在前端出现了分叉,git不知道该如何前进,所以报错了,让你来觉得走哪条路!说的简单点,就是远程仓库和本地仓库不同步了

解决问题

于是你有2个选择方式:

1.先合并之前的历史,再进行提交——提倡使用

先把git的东西fetch到你本地然后merge后再push,(如果有冲突就要解决冲突后再合并,冲突问题比较复杂,这里就不详细说了),这样就可以使远程仓库和你本地仓库一致了,然后就可以提交修改了。

$ git fetch origin master

$ git merge origin FETCH_HEAD 

提示:这2句命令等价于
$ git pull origin master
但是使用git fetch + git merge 更加安全。

然后执行: git pull --rebase origin master

重定基,可以使得历史更加统一,即提交历史趋向于一条直线。

补充:他们之间的关系

git pull = git fetch + git merge FETCH_HEAD

git pull --rebase = git fetch + git rebase FETCH_HEAD

2.丢弃之前的历史,强推——谨慎使用
强推,即利用强覆盖方式用你本地的代码替代git仓库内的内容,远程仓库的东西会被本地仓库覆盖!!!

$ git push -f 或者 $ git push --force

官方文档提示:This flag disables these checks, and can cause the remote repository to lose commits; use it with care.(即:此标志禁用这些检查,并可能导致远程存储库丢失提交;小心使用。)

俗话说得好:“强扭的瓜不甜”,强制(暴力)执行总会产生一些不好的结果,应慎重考虑是否使用该命令!!!

不仅在此处,在平时使用时,也要非常注意,除非你真的是想覆盖远程仓库(你真的知道自己在干嘛!),不然最好不要强制执行。

你可能感兴趣的:(个人笔记/备忘录,BUG心得,git,node.js)