????????事情是这样的,前阵子根据领导要求写了个APP,感觉大部分功能都实现了,于是打算上传至服务器,突然想到貌似这个还没建库。心里突然就忐忑起来了,因为之前合并过一次远程分支的结果是提交记录没了。那是一次设备的适配,代码改的可能不算多,但涉及到的功能及需求的修改非常多。好在本次经过尝试,成功提交代码。因此,简单记录下过程。
????????????????????????????????????????????????
第一步肯定要关联远程分支的
$ git remote add origin?ssh://192.168.1.1:2948/app/family
添加完成,然后要 pull 一下,果然出现了问题
$ git pull origin master From ssh://192.168.1.1:2948/app/family ?* branch ? ? ? ? ? ?master ? ? -> FETCH_HEAD fatal: refusing to merge unrelated histories
译文:拒绝合并不相关的历史
那这意思也就是说本地分支和远程分支还是没在一块儿呗,我就随便试了试,结果出现以下情况
$ git pull origin master -- Display all 44 possibilities? (y or n) --all ? ? ? ? ? ? ? ? ? ? ? ? --ff-only ? ? ? ? ? ? ? ? ? ? --progress ? ? ? ? ? ? ? ? ? ?--signoff --allow-unrelated-histories ? --force ? ? ? ? ? ? ? ? ? ? ? --prune ? ? ? ? ? ? ? ? ? ? ? --squash --append ? ? ? ? ? ? ? ? ? ? ?--gpg-sign ? ? ? ? ? ? ? ? ? ?--quiet ? ? ? ? ? ? ? ? ? ? ? --stat --autostash ? ? ? ? ? ? ? ? ? --ipv4 ? ? ? ? ? ? ? ? ? ? ? ?--rebase ? ? ? ? ? ? ? ? ? ? ?--strategy= --cleanup= ? ? ? ? ? ? ? ? ? ?--ipv6 ? ? ? ? ? ? ? ? ? ? ? ?--recurse-submodules ? ? ? ? ?--strategy-option= --commit ? ? ? ? ? ? ? ? ? ? ?--jobs ? ? ? ? ? ? ? ? ? ? ? ?--refmap= ? ? ? ? ? ? ? ? ? ? --tags --deepen= ? ? ? ? ? ? ? ? ? ? --keep ? ? ? ? ? ? ? ? ? ? ? ?--server-option= ? ? ? ? ? ? ?--unshallow --depth= ? ? ? ? ? ? ? ? ? ? ?--log ? ? ? ? ? ? ? ? ? ? ? ? --set-upstream ? ? ? ? ? ? ? ?--update-shallow --dry-run ? ? ? ? ? ? ? ? ? ? --negotiation-tip= ? ? ? ? ? ?--shallow-exclude= ? ? ? ? ? ?--upload-pack= --edit ? ? ? ? ? ? ? ? ? ? ? ?--no-... ? ? ? ? ? ? ? ? ? ? ?--shallow-since= ? ? ? ? ? ? ?--verbose --ff ? ? ? ? ? ? ? ? ? ? ? ? ?--no-verbose ? ? ? ? ? ? ? ? ?--show-forced-updates ? ? ? ? --verify-signatures
?突然发现后面可以带 --rebase 参数,我们知道
git --rebase会将两个分支融合成一个线性的提交,不会形成新的节点。
?于是大胆尝试,反正我有备份~
然后提示本地有未提交的内容,于是提交一下,在 stash 一下(如果不打算提交可以使用,结束后可以通过 git?stash pop 恢复)
结果居然显示成功了
$ git pull origin master --rebase From ssh://192.168.1.1:2948/app/family ?* branch ? ? ? ? ? ?master ? ? -> FETCH_HEAD Successfully rebased and updated refs/heads/master.
看起来已经好起来了啊兄弟们,那就提交一下试一试
$ git push origin master:refs/for/master Enumerating objects: 414, done. Counting objects: 100% (414/414), done. Delta compression using up to 4 threads Compressing objects: 100% (355/355), done. Writing objects: 100% (413/413), 191.67 KiB | 2.28 MiB/s, done. Total 413 (delta 159), reused 0 (delta 0), pack-reused 0 remote: Resolving deltas: 100% (159/159) remote: Processing changes: refs: 1, done remote: ERROR: commit bd1bd7d: missing Change-Id in message footer remote: remote: Hint: to automatically insert a Change-Id, install the hook: remote: ? gitdir=$(git rev-parse --git-dir); scp -p -P 2418 lichang@192.168.1.1:hooks/commit-msg ${gitdir}/hooks/ remote: and then amend the commit: remote: ? git commit --amend --no-edit remote: Finally, push your changes again remote: Tossh://192.168.1.1:2948/app/family ?! [remote rejected] master -> refs/for/master (commit bd1bd7d: missing Change-Id in message footer) error: failed to push some refs to 'ssh://192.168.1.1:2918/app/family'
?果然还是不行,不过这已经好多了。问了度娘,告诉我说这是因为没有 change-id ,我寻思着我这也是正常的本地提交啊,咋还缺东西了呢。于是又去问了度娘,告诉我 git 本身是不带的,gerrit 特有的。而解决方法也很多,一个是手动解决,还有就是利用 commit-msg hook 自动生成 change-id 。第二方法看起来就很复杂,于是我就用第一种方法试了一下,发现这只能给最近的一次提交记录加上 change-id,这就有点忧伤了。
于是继续浏览发现还可以通过 rebase
格式:git rebase -i [startpoint] [endpoint]
在此,手动感谢
git rebase -i合并多次提交_Hello World ^—^-CSDN博客_git rebase合并多次提交
也就是输入
$ git rebase -i ***
*** 就是远程分支的那次提交 commit id。
然后把 pick 修改为 reword ,然后一路保存 :wq 。
最后提交代码成功。
|