事情是这样的,前阵子根据领导要求写了个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 。
最后提交代码成功。