git工作流

  1. 上游分支用merge,下游分支用rebase
    会减少很多无意义的merge,以及保持master分支的树干净。

  2. 原理:凡是不能fast forward 都不能push。
    不能fastforward 就会产生一次合并的提交,这次提交会将远程的终点和本地的终点合并起来作为一个新的终点。所以才有了问题3。

  3. 有两种情况会导致失败或者会导致一次新的无意义的merge


    image.png

一种是上图这种,很奇怪,分支自己合并自己。



一种是上图,毫无意义的merge。

出现上面两种情况的原因是:
第一种是分支上的,例如dev分支,分支做的东西修改了,然后commit了,并且push到了远程分支(也就是origin dev)。 然后执行 rebase master的操作,这时候就会出现这种情况。
会在提交时提示

父节点图

这时候强制提交即可。 git push --force
这种情况 可以参考此链接

第二种情况是再master分支上commit后再pull,这时候因为pull的内容在commit后的,所以需要重新生成一次commit到本地,才能让本地master 知道变化。
可以看到无意义的提交有两个parent commit的


image.png

这种情况可以看链接
链接上有张图

image.png

可以看到 合并后的E,其实他的父节点就是c和d,所以我们看到了上面父节点图的那个父级的由来了。

  1. 总结:
    反正要拉取远程分支的东西,本地的最好要么commit,要么stash掉,保持当前状态为空(没有修改)
    这时候拉取肯定能fast forward了。
  1. 正确流程
    参考链接
    不涉及合并操作时,也就是只在自己分支上提交时,使用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 流程

  1. 切换自己开发分支


    image.png
  2. git commit 提交自己需要上传的修改


    image.png
  3. 如果本地有不需要提交的东西, git stash 这些东西


    image.png

    image.png
  4. 这时候空间干净了

  5. 切换到master

  6. pull master, 拉取master最新更新


    image.png
  7. 切换到自己开发分支

  8. git rebase, 选择master


    image.png
  9. 有冲突就解决


    image.png

    image.png

    对应三种解决冲突方式
    对于二进制类型无法使用vscode解决的,

  • 如果使用我的修改,则用我分支的“Resolve conflict using 'Branch_zrh”
  • 如果用别人的,则使用“Resolve conflict using 'Branch_master”
  • 如果用别人的,建议先把自己的修改后的文件手动复制保存,然后
    “Resolve conflict using 'Branch_master”,然后等rebase 结束后再修改一次这个文档。
  • 如果是代码形式的冲突,直接去vscode中解决,然后回来在Rebase界面使用“Resolved” 解决即可。
    例如以下的txt冲突


    image.png

    image.png

可以看到,Incoming Change 是自己的修改。 HEAD 是别人的(Master上的)修改。
自己看情况是用自己的(Accept Incoming Change)还是别人的(Accept Current Change),还是都是(Accept Both Changes)
解决完之后,“Resolve” 即可。


image.png

(7)master 再拉取一遍,有更新则继续步骤6,无则git merge dev 并commit、push 到远程master


image.png

(8)如果自己Stash 暂存有东西的话,就需要切换到自己分支,Pop Stashs 即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 多种多样的工作流使得在项目中实施Git时变得难以选择。这份教程提供了一个出发点,调查企业团队最常见的Git工作流。...
    JSErik阅读 4,472评论 2 8
  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 3,798评论 0 10
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,721评论 9 163
  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 1,464评论 0 7
  • Git飞行规则(Flight Rules) 前言 英文原版README 翻译可能存在错误或不标准的地方,欢迎大家指...
    骑摩托马斯阅读 1,646评论 0 8