上游分支用merge,下游分支用rebase
会减少很多无意义的merge,以及保持master分支的树干净。原理:凡是不能fast forward 都不能push。
不能fastforward 就会产生一次合并的提交,这次提交会将远程的终点和本地的终点合并起来作为一个新的终点。所以才有了问题3。-
有两种情况会导致失败或者会导致一次新的无意义的merge
一种是上图这种,很奇怪,分支自己合并自己。
一种是上图,毫无意义的merge。
出现上面两种情况的原因是:
第一种是分支上的,例如dev分支,分支做的东西修改了,然后commit了,并且push到了远程分支(也就是origin dev)。 然后执行 rebase master的操作,这时候就会出现这种情况。
会在提交时提示
这时候强制提交即可。 git push --force
这种情况 可以参考此链接
第二种情况是再master分支上commit后再pull,这时候因为pull的内容在commit后的,所以需要重新生成一次commit到本地,才能让本地master 知道变化。
可以看到无意义的提交有两个parent commit的
这种情况可以看链接
链接上有张图
可以看到 合并后的E,其实他的父节点就是c和d,所以我们看到了上面父节点图的那个父级的由来了。
- 总结:
反正要拉取远程分支的东西,本地的最好要么commit,要么stash掉,保持当前状态为空(没有修改)
这时候拉取肯定能fast forward了。
- 正确流程
参考链接
不涉及合并操作时,也就是只在自己分支上提交时,使用sourcetree,其他使用git,更清楚到底用了什么命令导致。
然后正确的流程:
(1)分支都commit完到自己分支,(需要备份的可以push)
git add .
git commit -m "???"
(2)然后master 拉取最新
git checkout master
git pull origin master
(3)切换到分支,git rebase master
git checkout dev_zrh
git rebase master
(4) 有冲突解决,并add ,并继续 git rebase --continue, 重复本步骤,直到所有都解决
https://www.cnblogs.com/sinojelly/archive/2011/08/07/2130172.html
git checkout FILE --ours{--theirs}
git rm FILE
git add FILE
(5) 如果不想rebase了 git rebase —abort
(6)都解决完,commit
(7)master 再拉取一遍,有更新则继续步骤3,无则git merge dev 并commit、push 到远程master
git checkout master
git pull origin master
git merge zrh_dev
git push origin master
(8)dev push 到远程dev (需要备份的使用此步骤)
===================
ToitorseGit 流程
-
切换自己开发分支
-
git commit 提交自己需要上传的修改
-
如果本地有不需要提交的东西, git stash 这些东西
这时候空间干净了
切换到master
-
pull master, 拉取master最新更新
切换到自己开发分支
-
git rebase, 选择master
-
有冲突就解决
对应三种解决冲突方式
对于二进制类型无法使用vscode解决的,
- 如果使用我的修改,则用我分支的“Resolve conflict using 'Branch_zrh”
- 如果用别人的,则使用“Resolve conflict using 'Branch_master”
- 如果用别人的,建议先把自己的修改后的文件手动复制保存,然后
“Resolve conflict using 'Branch_master”,然后等rebase 结束后再修改一次这个文档。 -
如果是代码形式的冲突,直接去vscode中解决,然后回来在Rebase界面使用“Resolved” 解决即可。
例如以下的txt冲突
可以看到,Incoming Change 是自己的修改。 HEAD 是别人的(Master上的)修改。
自己看情况是用自己的(Accept Incoming Change)还是别人的(Accept Current Change),还是都是(Accept Both Changes)
解决完之后,“Resolve” 即可。
(7)master 再拉取一遍,有更新则继续步骤6,无则git merge dev 并commit、push 到远程master
(8)如果自己Stash 暂存有东西的话,就需要切换到自己分支,Pop Stashs 即可。