keyipatience:个人主页作者简介C/C后端开发学习者专栏传送门《c》《linux》《c高阶数据结构》《c数据结构与算法》《前端学习》《Git》⭐️patience is key in lifeGit 多人协作核心规范master 主分支尽量不直接修改保持稳定新功能全部在 dev 开发分支上做多人在dev 协作前期准备模拟两个开发者两个人都git clone同一个远程仓库到本地Linux、Windows 模拟两个人远程仓库先在网页上新建远程分支dev起点是 master本地拉取远程最新信息拿到这个新的 dev 分支git pull # 获取远程新分支信息 git branch -r # 查看所有远程分支能看到 origin/dev git checkout -b dev origin/dev # 创建本地dev并关联远程origin/dev执行完后再git branch -vv,可以看到本地dev已经和远程origin/dev建立了关联如果没有建立关联单单只创建了本地分支可以用//单独建立关联 git branch -u origin/dev dev //或直接push 的时候一次性绑定 git push -u origin dev此时两个人本地都有 dev并且和远程 dev 建立追踪关系以后就在 dev 上写代码。单人在 dev 开发、推送到远程# 1. 修改文件 vim file.txt # 2. 暂存、提交 git add file.txt git commit -m first function # 3. 推送到远程dev分支 git push origin dev推送成功远程 dev 更新别人后面 pull 就能拿到你的代码多人修改同一个分支dev冲突场景场景A直接改代码 → commit → push 问题根源开工一开始本地就已经落后远程从一开始版本就不对。 一 push 直接报错分叉。B (Linux版本) / A --- \ C (Windows版本)具体过程1.windows在file.txt新添 windows coding,然后push2.Linux没有事先pull而是同样在file.txt新添linux codingpush报错因为远程有新东西本地版本落后并且你自己也写了新提交分叉了必须先 pull 合并才能 push。3.执行pull3种方式推荐方式1merge合并## git config pull.rebase false 简写git pull --no-rebase 永久设置设置完之后以后直接敲 git pull 就自动 merge不再报这个错 git config pull.rebase false逻辑做合并merge把远程分支合并进本地提交历史会新增一条专门的合并 commit历史分叉保留能看清两边各自做了什么## git config pull.rebase true rebase 变基 命令简写git pull --rebase逻辑不合并把你本地自己的提交摘下来放到远程最新提交的后面提交历史不会产生合并 commit历史是一条直线## git config pull.ff only 仅快进 命令简写git pull --ff-only只允许「快进更新」一旦发现分叉直接拒绝 pull啥也不干报错退出不会 merge、不会 rebase这里我们推荐第一种方式merge合并4.执行git config pull.rebase false后再git pull可以看到file.txt文件已经有冲突了说明pull成功了5.vim file.txt 手动解决冲突保留我们想要的代码6.三板斧场景B事先pull下来了再在此基础上修改先拉取远程最新代码到本地合并git pull第一种最常见无分叉。远程有新代码你本地没有自己新的提交。 直接快进更新Fast-forward成功没有冲突也不会弹nano页面。 拉完本地和远程一模一样你放心写代码。第二种远程没有任何更新。 git pull 啥都不干直接提示Already up to date意思已经是最新的。第三种 远程有新代码你本地也有上次遗留的 commit上次写了没 push两边分叉了。→ C 远程Windows刚推上去的 B → D 你Linux本地上次commit但是没push的具体过程1.windows创建file3.txtadd-commit-push2.linux创建file2.txtadd-commit(没有push3.此时linux执行git pull简单流程CtrlO敲回车CtrlX做完之后合并提交就生成好了回到命令行。其实刚刚上面演示的是无冲突分叉分叉也可以分为2种有冲突和无冲突1.文件没有冲突Git 能自动把文件合并好准备好一条合并提交打开 nano 让你确认提交信息。即这个界面2.有冲突(要我们自己vim并决定保留哪些代码 Git 发现file.txt两边改了同一处它不知道怎么合并自动合并失败暂停下来。 合并提交还没有生成它等着你手动改文件、解决冲突 →git add→ 再git commit-git push弹这个界面pull0Already up to date1没有分叉直接fast-forward2无冲突分叉弹nano3有冲突分叉vim手动保留总结还没写代码优先先 pull再开发好习惯已经改完、已经 commit 了只能 pull 合并处理分叉冲突功能全部开发完成dev 合并回 master上线切到 master拉取最新 master保证本地 master 是最新git checkout master git pull切回 dev把 master 合并进 dev提前在 dev 解决 master 和 dev 之间的冲突git checkout dev git merge master # 这里如果有冲突在dev解决完、提交切回 master把 dev 合并进 mastergit checkout master git merge dev把合并后的 master 推送到远程git push origin master收尾删除没用的 dev 分支dev 的功能已经合并进 master任务完成可以删掉分支网页端直接在 Gitee/GitHub 页面删除远程 dev 分支命令行删除远程分支git push origin -d dev补充git branch -r只看远程分支git branch -a:看远程和本地全部分支git branch -vv:看远程分支和本地分支的关联关系追踪分支git checkout -b dev origin/dev建立关联之后 pull/push 不用每次写远端地址Feature 分支多人协作核心范式主分支 master 保持稳定每个需求单独开 feature 分支开发互相隔离做完再合并回 master两个人各自新建自己的 feature 分支你 feature-1小伙伴 feature-2# 查看本地分支 git branch # 新建分支并且直接切换进去 git checkout -b feature-1然后写代码、提交、推远程vim function1 # 写需求代码 git add function1 git commit -m add function1 git push origin feature-1 # 只推送feature-1这个分支不碰master小伙伴那边同样操作git checkout -b feature-2 vim function2 git add function2 git commit -m add function2 git push origin feature-2在本地你看不见他的 function2他看不见你的 function1推送各自分支互不冲突查看两个分支各自独立的提交记录feature-1 分支只存在function1文件这条分支领先 master 1 个提交feature-2 分支只存在function2文件这条分支领先 master 1 个提交这就是分支隔离 切换到哪个分支工作区就加载哪个分支对应的全部文件。 切 feature1 → 看到 function1切 feature2 → 看到 function2切 master → 两个文件都没有。正常开发节奏两个人在自己分支安心写需求互不影响直到开发完成准备合并。现在小伙伴没法继续写了你要接手帮他在 feature-2 上面继续开发# 拉取远程所有分支的信息 git pull执行完远程的origin/feature-2信息已经被本地 Git 知道了# 查看所有分支本地远程追踪分支 git branch -a # 会列出 remotes/origin/feature-2remotes/origin/feature-2代表远程上的 feature-2 分支只是一个追踪标记你还没有本地 feature-2 分支。# 新建本地feature-2分支并且直接绑定上游远程origin/feature-2 git checkout -b feature-2 origin/feature-2在 feature-1 看到 function2.txt是pull 合并过来的结果切到 feature-2 看到 function2.txt是这个分支原生就创建了这个文件属于 feature-2 自己的提交切换成功ls 可以看到 function2 文件现在你就在小伙伴的分支上了可以接手开发vim function2 # 修改代码 git add function2 git commit -m modify function2 git push origin feature-2 # 推送到远程feature-2分支小伙伴回来拉取你帮他更新后的 feature-2。然后小伙伴就可以接着开发了git pull //没有绑定远程的话再 git branch --set-upstream-toorigin/feature-2 feature-2现在功能开发完毕把 feature 分支合并回 master 主分支。合并前先把 master 最新代码合并进自己的 feature 分支冲突在 feature 分支解决不要在 master 上解决冲突小伙伴先合并 feature-2 进 master# 1、切回master拉最新master保证本地master和远程master一致 git checkout master git pull # 2、切回自己的feature-2分支把master合并进feature-2先同步主线最新代码 git checkout feature-2 git merge master # 3、切回master合并feature-2 git checkout master git merge feature-2 # 4、push master到远程 git push origin master合并完成远程 master 现在带上了 function2 文件轮到你合并 feature-1 到 master因为现在 master 已经被小伙伴更新了里面有 function2 了你不能直接合并必须先把 master 的新代码同步到你的 feature-1# 步骤1切master拉取最新master拿到小伙伴合并进去的function2 git checkout master git pull现在本地 master里面已经有 function2# 步骤2切回你的feature-1分支把master合并进feature-1 git checkout feature-1 git merge master页面里面这次没有冲突自动合并成功ls 你会看到 feature-1 里面同时有 function1、function2# 步骤3把同步好master的feature-1推送到远程feature-1 git push origin feature-1 //其实上一步把 master 的更新合并进本地 feature-1这一步执行完你的本地 feature-1 分支历史已经变了和远程 origin/feature-1 不一样了为什么还要 push feature-1实际开发中 master 很多时候是网页 PR 合并不是本地 merge要保证远程 feature 分支是最新、已经和主线同步好的状态方便评审。# 步骤4切回master合并feature-1分支 git checkout master git merge feature-1# 步骤5推送master到远程 git push origin master推送后远程 master 同时拥有 function1、function2 两个文件两个需求全部上线到主线。收尾feature-1、feature-2 需求已经全部合并进 master分支使命结束可以删除本地 远程都可以删