| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> 一文带你看清Git所有功能 -> 正文阅读 |
|
[开发工具]一文带你看清Git所有功能 |
Git 历史和现状 Git 是 Linux 作者 Linus 的另一个作品。2002 年他还在使用 Bitkeeper 作为 Linux 内核的版本管理,但因为它是 Copyright 有版权的软件备受质疑,然后 Andrew Tridgell 对 Bitkeeper 进行逆向工程,导致 BitMover 要回收 Linux 开发者的 Bitkeeper 的免费使用权,Linus 一怒之下花了 10 天写出了 Git。 名字的意思是:egotistical bastard 如今 Git 已经成为绝大多数开发者的选择, Tom Preston-Werner、Chris Wanstrath 和 PJ Hyett 在 2007 年 10 月推出的 Github 已经成为了全球最大的开发者网站,我们厂在上面也是贡献颇多。
集中式版本管理和分布式版本管理 Git 和 SVN 是从设计理念上就不一样的版本工具,SVN 将代码进行中心化管理,拥有更好的稳定性和安全性,但是去中心化的 Git 却是从 Linux 操作系统的开发需求而来,更加适合多人协作的开源项目,可以以任何一个点为 remote 将他的代码与本地代码合并,随着时间发展,还衍生出了更多强大功能和一整套操纵流程,让它也可以适应了商业软件的开发。
SVN 的代码历史相对比较简单,因为它是中心化的,所有人的代码都直接提交到某个 repository 上,所以它的 Reversion ID 号是一个按顺序增加的数字类型,一般情况下不能在两个数字之间插入别的 reversion。
我更愿意把分支、Tag、Remote 想象成不同的平行宇宙,因为某些机缘导致产生了分裂,走向了不同的历史,也可能因为某些机缘又合并到了一起,变得更加强大。
Workspace:当前工作区,修改的的最初状态。
PS: 图中没有提到 rebase 和 cherry-pick 命令,这两个命令也非常强大,后面有提到,有时间可以关注一下。
之前有提到过,补丁是 Git/SVN 代码版本管理的基础概念,它其实是以行为单位的文件修改历史,增加行以 + 号开头 ,删除行以 - 号开头,而修改一行,就是先 - 后 +。 在 Git 里可以通过 git diff 或者 Linux/Mac/Conemu 中,也可以通过 diff -Naur 来生成文件对比结果,有点类似下图。 这是整个代码管理的基础概念,所有的分支、Tag、Remote 都是在此基础上衍生的。
1. 克隆代码到本地开发环境 - Clone $ git clone [REPOSITORY_URL] 2. 更新代码 - Status/Commit/Log 刚有提到过 Git 的四种场景,其中前两种场景需要通过 $ git status $ git log 3. Branch 和 Tag 如刚从所说,Branch 和 Tag 都可以看成是补丁的时序化集合,branch 可以互相合并,在 clone 完 repository 后有一个主线分支叫做 master。而 Tag 用于发布后标记版本,这两个只是从名字上不一样,功能(我感觉实现上)并没有太大区别。 和 SVN 不同, SVN 的 Branch 和 Tag 都是把 Trunk 整个代码库拷贝出来,Git 只是将补丁引用重新对当前代码应用一下,所以 Git 的 Branch/Tag 都非常轻量,切换起来非常轻松,使用 Git 要尽量多使用它的分支来提高开发效率,一会儿提到 Git flow 时会描述一下如果用分支进行代码功能开发管理。 3.1 新建分支的两种办法 $ git checkout -b [BRANCH_NAME] # 在当前版本切换并新建分支 $ git checkout [BRANCH_NAME] $ git merge [BRANCH_NAME] # 将另外一个分支的代码,打到当前分支之后。 对于已经推到 remote repository 的 commit,是不建议 rebase 的,因为一旦 rebase 了,别人再 pull 就会出一大堆的冲突 conflict,而且基本没法修,通常情况下还是建议用 merge 稳妥一些。 PS: rebase 还有一个强大的功能是配合 --interactive 参数修改之前的补丁,具体自己查一下,但是改完了 push --force 上去,别人再 pull 回来出 conflict 是必然的,但是这招是修改 Github 上的 Pull request(后面有提到)必备技能。 3.4 删除分支 $ git branch -d [BRANCH_NAME] # 已经合并到 master 3.5 取消修改 git stash # 取消全部修改,很强大的是它可以恢复过来,具体自己查一下 推送代码是为了跟别人一起合作,命令行非常简单 $ git push [REMOTE] [BRANCH] 郑重警告:**永远不要对主线 master 分支执行 —force ** 获取远程分支更新 $ git pull # 把代码更新到 ?workspace Clone 之后会有一个默认的远程仓库为 origin,但如果还要增加别的远程仓库,就需要用到下面命令了: $ git remote add [REMOTE_NAME] [URL] # 添加原创仓库 Github 在 Git Remote 的基础上为了方便大家参与开源项目,衍生出的一套机制,目前常规开源项目的参与流程是,先注册一个 Github 账号,然后将感兴趣的开源项目 Fork 一份到自己的 namespace 下,然后拆分分支进行修改,然后提交到自己的 Github repository 下,再发起一个 Pull Request,让项目维护者来合并你的代码(Pull request 名副其实),在这个过程中,项目维护者会对你的代码进行 Review 和点评,你得按照维护者要求进行修改(这里 rebase 会用得很勤),修改通过,维护者同意后,就有他将代码合并进项目中。 具体流程自己走一圈就明白了,Gitlab 的 Merge Request 原理是一模一样的。 PS: 范例图片在 PPT 的第 22 页起 Git flow Git flow 本来应该是本文的重点内容的,它是在 Git branch 的基础上实现了一套简单的功能模块化开发流程,主要思想是把分支分成了上下游几个层级,然后通过一套命令行工具进行维护。 master 分支 - 与线上版本保持一致,当发生线上问题后可以很轻松地修复。
? Git flow
$ git flow init # 初始化 git flow 分支模型 其它内容 有兴趣可以继续看一下别的相关内容,非常有意思: git svn - Git 可以以 svn 为代码后端,通过 Giit 来对 SVN 里的代码进行版本管理。
? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:24:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |