今天有位同事过来问我说提交git的时候报远端拒绝,是不是我没给开足权限,这可真不怪我啊,我都该给的权限都给了的,于是查查原因吧,发现了一丢丢异常,然后就是这个问题导致的,当然,这里还把另外一个我想到的,但是不是这次的原因的也说明一下。
问题表象
! [remote rejected] master -> refs/for/master (change http://**** closed)
error: failed to push some refs to 'ssh://******'
就是报上面类似的错误了。
可能原因一
查看提示报某次提交已经close的了,远端拒绝,首先想到的就是,是不是changeId和服务端冲突了,原changeId的提交已经closed了?
于是:
git commit --amend
查看changeId是不是有问题,发现没问题,与远端的提交记录并不冲突,然后可以排除这个问题了。
当然这里把这种情况描述一下,可能产生的场景如下:
- 修改代码,push到远端
- 合并此次提交,将该次提交close
- 使用小乌龟选择修改上次提交,或者手动通过
git commit --amend
修改changeId 尝试提交
即报上述问题。
出现问题原因,前面已经说了,changeId被占用并且已经closed了,如果没有closed,相当于修改上次提交。
该情况下,解决办法如下:
git commit --amend
的时候删除changeId 。退出后会自动生成一个新的changeId,再push就没问题。
可能原因二
尝试了前面的可能原因,发现不是这个问题,那就还得找找其他问题啊,查看这个人的提交记录,发现:上一次push之后,其在网页端修改过commit信息,本地git log
和远端对应不起来,这就有点蹊跷了啊,对应不起来,现在推送是不是可以理解为本地的上次提交与远端不一致,做过修改了,所以此次push相当于push上次提交commit信息的修改以及此次代码的修改?
于是让其尝试将本地仓库回退到上次提交的节点,git stash
之后然后pull
最新代码,将git log
内容与远端保持一致,再git stash pop
出来最近的代码修改记录,重新push,果然提交成功了。
这种情况描述上面也基本说明白了,就是本地和远端相同的changeId对应的提交信息不一致了,相当于远端做了一次修改提交,然后本地push的时候相同changeId对应的修改不一致导致的问题。
Tips:为了避免类似问题,推荐不要在远端修改内容,并且完全保证changeId不要乱修改,合并了代码之后就不要使用小乌龟的增订提交了,切记切记。
评论区