• 6.git的fork开发模式


    一、Git简介

    1. Git与SVN的主要区别

    • Git是分布式仓库,与SVN等中心仓库相比最明显的区别是:
    • SVN采用集中式的版本控制,由一个集中管理的服务端保存所有修改历史记录;客户端只需下载出最新或指定提交的文件,不包据完整的历史记录。

    2. git的开发模式

    1. fork 开发模式:Fork 开发模式是一种社交编程,是利用群体的智慧来进行合作编程的一种工作模式,采用派生/合并请求方式,让任何一个开发者都可以方便的向开源项目贡献代码。
    2. 分支开发模式:分支开发模式是采用直接 clone 源项目中心仓的方式,由新建分支向目标分支发起合并请求提交代码,让任何一个开发者都可以方便的向开源项目贡献代码。这种模式没有代码评审的机制,使得开发者之间的协作与交流变得少而且不顺畅,这样就不能很好的保证中心仓的代码质量。这种模式比较适合几个人的小团队,对于较大的团队,建议使用fork 开发模式。
    3. Omega 开发模式:集中式的代码仓库管理

    二、fork开发模式

    1.fork

    Fork一个项目时,可以选择项目 Fork 到组织还是个人名下。点击·Fork·按钮后,根据页面弹出窗口提示选择相应组织名还是个人名下即可。

    1. 主干仓是Public 类型, fork 后的仓库是Public ,fork 仓可以更改类型;Public、Internal、Private;
    2. 主干仓是Internal 类型,fork 后的仓库是Internal ,fork 仓可以更改类型;Private、Internal;
    3. 主干仓是Private 类型,fork 后的仓库是Private ,fork 仓不能更改类型;

    2.git clone

    (1)方式:1:使用 TortoiseGit 进行 clone

    1. 在本地文件夹空白处右击 -> 选择Git Clone
    2. 将刚刚copy的git仓地址,添加到URL处,确认无误后点击“OK”进行克隆

    (2)方式2:使用 git bash 进行 clone

    1. 在本地文件夹空白处右击 -> 选择Git Bash Here
    2. 执行克隆命令:git clone xxxxxx.git

    3.本地修改代码、提交代码

    本地修改的代码需要提交并push到平台

    (1)方式1:使用 TortoiseGit 提交、push代码

    1. 在本地项目根目录下,右键选择Git Commit -> “masterXX”…
    2. 在Message栏填写提交信息->勾选需要提交的文件->点击“OK”
    3. 完成commit之后会出现提示框,点击Push将本次提交推送到远端

    (2)方式2:使用 git bash 提交、push代码

    1. 查看当前代码的修改状态,git status
    2. 将修改的文件提交到本地暂存区,git add filename或者将所有修改过的工作文件提交暂存区,执行命令:git add .
    3. 将暂存区的修改文件提交到本地git库中,git commit后输入commit message,或者git commit -m "引号内输入commit message"
    4. 将提交的修改推送到远端,git push origin master(例子中使用的是默认的远端origin,分支master)

    注意:将新创建的分支推送到远端仓:git push origin 分支名

    4.创建合并请求

    当fork库更改了内容,需要合并到主库,需要向主库发起 “合并请求”。

    点击 “Compare branches and continue” 按钮出现如下界面:

    5.代码检视

    提交MR 后,进行代码检视

    6.合并MR

    注意:如果此合并请求有冲突,需要解决合并冲突。首先要把远程仓库的最新数据拉到本地仓库,再从本地仓库的分支合并,解决冲突。

    7.总结

    常用命令:

    分支:
    git branch // 显示分支列表,左侧有*的表示当前所在的分支
    git branch 新分支名称 // 创建新分支
    git checkout 分支名称 // 切换分支
    git branch + git checkout test = git checkout -b //创建分支并切换到test分支
    git branch --delete --force <branchName> // 删除本地分支,或者使用选项-D作为简写:git branch -D
    git push origin --delete <branchName> // 删除远程分支
    合并分支:
    git merge 合并分支名称:现在在A分支上,输入git merge B,就会把B分支合并到A分支上,合并后的结果会存储在A分支上,整个过程对B分支没有影响。
    查看分支:
    git log --graph:以图表形式查看分支
    
    提交:
    git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE”  // 编辑最近一次的提交信息,但是你必须确保没有对当前的代码库(working copy)做修改,否则这些修改也会随之一起提交。
    git commit --amend // 如果commit注释写错了,只是想改一下注释,此时会进入默认vim编辑器,修改注释完毕后保存就好了。
    git push <remote> <branch> --force // 假如你已经将代码提交(git commit)推送(git push)到了远程分支,那么你需要通过下面的命令强制推送这次的代码提交。
    git push -u origin 本地分支名:要创建的新分支名称 //在远程仓库创建新分支
    注意:本地分支名和远程新分支名可以不一样,但中间一定要注意加":"(冒号)
    git checkout -b 本地仓库新建分支名称 远程仓库名称/要取回的远程分支名称 // 完成远程分支取回本地的操作
    举例:git checkout -b A origin/B 的执行结果是以名为origin的远程仓库(默认远程仓库)的B分支为来源,在本地仓库中创建分支A。
    git pull 远程仓库名称 远程分支名称 // 从远程仓库取回最新版本的分支
    
    远程仓库:
    git remote -v:查看远程仓库(有远程仓库remoteService,本地仓库origin)
    
    暂时不提交:
    git stash // 把当前进度保存起来
    git stash pop // 恢复最新的进度到工作区
    
    回溯版本:如果在更新代码之后,忘记更新前应该创建个分支,可以使用如下操作
    git log:查看以当前状态为终点的历史日志
    git reset --hard 目标时间点哈希值:回溯历史版本
    git relog:查看全部时间下的历史日志,不受当前状态影响
    git reset --hard 最新版本分支:回退到想更新后的分支
    现在我们的master分支又回到了开始的最新版本,而以master分支的历史版本为基础的B分支也成功建立了,又可以继续开始多路并行作业了。
    
    撤销:
    git reset <文件名> // 往暂存区(staging area)中加入了一些错误的文件,但是还没有提交代码。如果只需要移除一个文件
    git reset // 从暂存区移除所有没有提交的修改
    1. 在本地修改与远程代码无冲突的情况下,优先使用:pull->commit->push
    2. 在本地修改与远程代码有冲突的情况下,优先使用:commit->pull->push

    7.1 忽略本地修改,强制拉取远程到本地

    主要是项目中的文档目录,看的时候可能多了些标注,现在远程文档更新,本地的版本已无用,可以强拉

    git fetch --all
    git reset --hard origin/dev
    git pull
    

    7.2 未commit先pull,视本地修改量选择revert或stash(pull commit push)

    应用场景:同事有新提交

    我 没有pull,修改了文件 -> pull -> 提示有冲突

    (1)本地修改量小

    方法:如果本地修改量小,例如只修改了一行,可以按照以下流程

    -> revert(把自己的代码取消) -> 重新pull -> 在最新代码上修改 -> [pull确认最新] -> commit&push

    (2)本地修改量大,冲突较多

    方法1:-> stash save(把自己的代码隐藏存起来) -> 重新pull -> stash pop(把存起来的隐藏的代码取回来 ) -> 代码文件会显示冲突 -> 右键选择edit conficts,解决后点击编辑页面的 mark as resolved->  commit&push

    方法2:-> stash save(把自己的代码隐藏存起来) -> 重新pull -> stash pop(把存起来的隐藏的代码取回来 ) -> 代码文件会显示冲突 -> 右键选择resolve conflict -> 打开文件解决冲突 ->commit&push

    7.3 已commit未push,视本地修改量选择reset或直接merge(commit pull push)

    (1)修改量小,直接回退到未提交的版本(可选择是否保存本地修改)

    应用场景:同事有新提交

    我 没有pull -> 修改了文件 -> commit -> pull -> 提示有冲突

    方法:如果本地修改量小,例如只修改了一行,可以按照以下流程

    -> reset(回退到未修改之前,选hard模式,把自己的更改取消) -> 重新pull -> 在最新代码上修改 -> [pull确认最新] -> commit&push

    (2)修改量大,直接merge,再提交(目前常用)

    方法:-> commit后pull显示冲突 -> 手动merge解决冲突 -> 重新commit -> push

    第一种方式:
    
    git add + 要提交的文件名
    git commit:在vim中添加TicketNo
    git push origin master:将本地仓库的master分支提交到fork的个人项目
    在gitlab的本地仓库中新增merge request(MR),点提交的时候如果有冲突执行步骤5,如果没有冲突,则提交成功
    git fetch remoteService:查看远程仓库的代码是否有更新
    git merge remoteService/master:将远程仓库的代码与本地仓库代码合并,并解决冲突,再执行步骤1,2,3
    第二种方式:
    
    git add + 要提交的文件名
    git commit:在vim中添加TicketNo
    git push origin master:将本地仓库的master分支提交到fork的个人项目
    在gitlab的本地仓库中新增merge request(MR),点提交的时候如果有冲突执行步骤5,如果没有冲突,则提交成功
    git pull remoteService master // 取回远程仓库的变化,并与本地master分支合并,解决冲突,执行步骤1,2,3
    第三种方式:
    
    git fetch remoteService:将远程仓库的代码下载到本地仓库
    git merge remoteService/master:将远程仓库的代码与本地仓库代码合并,解决冲突
    git add + 要提交的文件名
    git commit:在vim中添加TicketNo
    git push origin master:将本地仓库的master分支提交到fork的个人项目
    在gitlab的本地仓库中新增merge request(MR)

    8. 开发错分支

    (1)代码未提交时

    使用以下命令即可解决。

    1. git add .    (把所有改动暂存)
    2. git stash     (把暂存的文件提交到git的暂存栈)
    3. git checkout 本该提交代码的分支 
    4. git stash pop (将暂存栈中的代码放出来)

    (2)代码已提交

    1. git  checkout  不该提交代码提交了代码的分支
    2. git reset HEAD~1  (最近一次提交放回暂存区, 并取消此次提交)
    3. git stash                (把暂存的文件提交到git的暂存栈)
    4. git checkout 应该提交代码的分支
    5. git stash pop
    6. git  checkout  不该提交代码提交了代码的分支 (等你把代码提交到了正确的分支后,再次切到刚刚错的分支)
    7. git push origin 错误的分支 -f  (把不该上去的文件回退掉)

    参考文献:

    【1】Git Branch —— 实现多路并行作业 - 简书

    【2】七个你必须重视的 Git 使用技巧 – 码农网

    【3】IDEA遇到 git pull 冲突的几种解决方法_小名同学-CSDN博客

    【4】git修改/添加/删除远程仓库_阳水平的博客-CSDN博客_git删除远程仓库

  • 相关阅读:
    Go语言基础(四)
    Go语言基础(一)
    Go语言简介和开发环境搭建
    数据分析(四)数据可视化之Matplotlib
    数据分析(三)Pandas
    git简介与基本操作
    drf框架之三大认证之频率类源码分析
    数据分析(二)numpy
    换零钱问题的非递归解法 SICP 1.2.2中的一个问题
    # Java中的代理类
  • 原文地址:https://www.cnblogs.com/nxf-rabbit75/p/13531822.html
Copyright © 2020-2023  润新知