社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

【第1520期】 Git项目管理

前端早读课 • 6 年前 • 918 次点击  

前言

小年夜过后,大家年后见。今日早读文章由阿里@罗嗣投稿分享。

正文从这开始~~

认识Git

导读:本小节主要讲解Git是什么,Git有什么用,如何使用Git进行版本管理,大厂的版本管理策略是如何的?可以带着这些问题更有效的阅读本章,使之事半功倍。

一句话理解Git(面试专用)

Git的每个分支的管理类似于链表,每次提交都会产生一个SHA1的唯一标识符。此唯一标识符是引用的指针。后续的增删改查操作都可以基于这个指针进行索引操作。

关键字:分布式,四个分区,链表,SHA1指针

Git管理开发者最关心的几个问题

  • 版本管理策略模型是怎么样的?

  • 怎么理解git的四个区:工作区,暂存区和本地分支和远端分支?

  • 如何修改git的基本信息, 用户名,远端仓库地址?

  • git pull 和 git pull —rebase 有什么区别?

  • 如何删除及忽略git已经提交的资源?

  • git checkout 还有哪些高级用法?

  • git reset 和 git revert有哪些区别?

一张图讲解大厂版本管理策略

master分支:一般会已此分支为主分支(发布分支)。主分支的意思是说开发者不会在主分支上开发, 主分支只接受外分支的合并。合并完之后,验证通过,打tag上线。

develop分支:作为日常开发分支,同时会有多人在上面提交代码,为了保证提交不冲突,尽量保证模块拆解合理,开发没有同时修改同一文件的情况。

feture_a 到 feture_n分支:这些分支是发布之后的bug修复分支,不同开发者产生的Bug,会不同分支上修复bug,最终合并到master分支上上线。

Git核心概念

导读: 本小节主要介绍Git是什么,Git的内部构造及原理是如何的。为什么Git可以取代SVN作为当前最好的版本管理工具(没有之一)。 Git是分布式版本控制系统,与SVN类似的集中化版本控制系统相比。

SVN集中化版本控制系统虽然能够令多个团队成员一起协作开发,但有时如果中央服务器宕机的话,谁也无法在宕机期间提交更新和协同开发。甚至有时,中央服务器磁盘故障,恰巧又没有做备份或备份没及时,那就可能有丢失数据的风险。

Git四个工作区

导读:Git的操作原理都是基于这四个工作区来进行流转,理解操作在什么阶段在什么工作区,对于Git理解和使用就成功了一半

Workspace 工作区:就是你平时存放项目代码的地方

Index / Stage 暂存区:用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息

Repository仓库区(或版本库): 就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

Remote远程仓库: 托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

Git内部构造

要理解Git内部构造的核心,我们应理解三个东西: 实体、引用、 索引。

实体:你提交到一个Git代码仓库中的所有文件,包括每个提交的说明信息(the commit info)都在目录 .git/objects/中存储为实体。一个实体以一个40字符长度的字符串(该实体内容的SHA1哈希值)来标识。

引用:Git中,一个分支(branch)、远程分支(remote branch)或一个标签(tag)(也称为轻量标签)仅是指向一个实体的一个指针,这里的实体通常是一个commit实体。这些引用以文本文件的形式存储在目录.git/refs/中。

索引:索引是一个暂存区,以二进制文件的形式存储为文件.git/index。当git add一个文件,Git将该文件的信息添加到索引中。当git commit,Git仅提交索引文件中列出的文件。

Git初始化

仓库基本操作

git init                      //在当前目录新建一个Git代码库
git init
<project-name>       // 新建一个目录,将其初始化为Git代码库
git clone
<git-hub-url>       // clone git仓库
git clone
-b   // [高阶用法] clone git仓库并且制定分支

Git授权SSH

大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。例如在github或者gitlab上提交代码,我们需要把SSH公钥复制托管到Github的personal setting -> ssh keys

cd ~/.ssh             //进入ssh目录
ssh
-keygen            // 生成ssh公私钥
cat
~/.ssh/id_rsa.pub // 复制ssh公钥

Git忽略不应该跟踪的文件

.gitignore文件显式地指定了哪些文件不应被Git追踪,即被Git忽略掉。例如开发过程中 node_module,.vscode等文件不需要被跟踪和提交,可以在初始化的忽略它们。

// .gitignore 文件
node_module
.vscode

Git基本操作

如何操作一次完整提交流程

当一个文件修改,我们想把他提交到github上面, 一次完整提交路径是从工作区 —> 缓存区 —> 本地仓库区 —> 远端仓库

vi readme.md              // 修改readme文件,文件在工作区
git add readme
. md         // 文件进入缓存区,缓存区的文件可以被checkout移除到工作区
git commit
'add readme'   // 文件进入提交分支,但还是在本地
git push origin master    
// 提交分支 push 到远端分支

如何操作一次完整更新流程
当多人合作开发过程,开发者需要更新别人的提交代码,我们就需要更新本地代码。本小节会介绍如何更新本地代码, 如何使用 git pullgit fetch, git pull --rebase等命令,以及他们之间有哪些细微的区别。

  • git pull : git fetch + git merge

  • git pull —rebase: git fetch + git rebase


Git配置

修改用户信息

git config --list                                   // 配置信息列表
git config
--global user.name "John Doe"            // 设置用户名
git config
--global user.email johndoe@example.com  // 设置邮箱

设置不同的仓库源

git remote --help               // 查看帮助
git remote                      
// 查看不同源
git remote add
[name] [url]     // 添加不同地址的源,并取一个别名
git remote remove
[name]        // 删除一个源
分支管理

本小节介绍如何创建一个分支,如何删除一个分支。注意:本地分支删除了,并不代表远端分支删除。如何定期清理远端分支。

git checkout -b daily/0.0.1       // 已当前分支为基础,创建daily/0.0.1分支
git branch
-la                    // 查看本地分支及远端分支
git branch
-D [branchName]        // 强制删除本地分支
git branch
-d [branchName]        // 删除已经Merge过的分支
git checkout
-b daily/0.0.1       // 创建一个分支
// 如何删除远端多余分支
git push
-delete // 大多数情况remote_name为origin
Git提交信息检查
git diff                              // 查看当前工作区改动点
git diff commit_hash1 commit_hash2    
// 提交hash1和hash2的差异
git diff branch_a branch_b            
// 分支a和b的差异
git status                            
// 当前改动文件
git log                              
// 查看提交历史
git log
--pretty=oneline              // 提交历史缩减一行查看,主要是提交Hash值

Git高阶操作(黑科技)

如何使用merge, cherry-pick和patch

多人协同开发中我们需要合并别人的代码,使本地代码保持最新状态,git提供了三种合并的方式。对于初学者很少有人知道这些差别。下图就列举了三种操作的使用场景。

如何删除git缓存文件

情况:有些情况开发者把原有不需要提交的代码提交到了远端仓库,再使用.gitignore忽略文件不生效。哪怕我们删除后再提交也没有办法忽略。这种情况下我们应该怎么解决?

方法:我们可以使用git rm —cache 删除原来git跟踪的文件缓存,再在.gitignore里面添加忽略文件

## 当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用
git rm file_path
## 当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以使用
git rm
--cached file_path       // PS: file_path 为文件路径
如何强制提交

情况:对于多人同时开发,有些时候我们会遇到版本管理混乱的情况,远端版本错误了,但本地版本是正确的。 如何才能让强制更新远端版本,保持和本地工作区环境一样?

方法:强制push本地正确的版本,但是慎用。因为它是不可逆转的。

git push origin master --force // 强制更新,慎用
如何使版本信息回退到某次提交?revert 和 reset有什么区别?

情况:有些时候开发者需要退回到某次正确的提交记录,有些时候开发者的commit错误了,这时候可以使用 git revert 和 git reset。

  • git revert: 撤销某次操作,此次操作之前的commit都会被保留。

  • git reset : 撤销某次提交,但是此次之后的修改都会被退回到暂存区。


## 强制回退到某次提交,且需要强制提交
git reset
——hard commit_hash
git push origin master
--force
## 回退到某提提交,保存提交commit记录, 重新commit
git revert commit_hash git add
.
git commit
-m "revert"
git push origin master
如何创建Tag,如何以某个Tag创建分支
## 创建tag
git tag
-a daily/0.0.1 -m "add develop file" // 创建标注标签
git tag daily
/0.0.1 // 简单创建tag
## 分享tag到远端
git push origin
[ tagname]
git push origin
--tags
## 如何已某个tag创建分支
git checkout
-b

关于本文
作者:@罗嗣
原文:https://www.yuque.com/docs/share/cc5f2761-c72b-420e-bd26-448d645691ef

最后,为你推荐


【第1347期】15分钟成为GIT专家


【第1213期】优雅的提交你的 GitCommit Message


他曾分享过


【第1483期】前端如何去设计架构能力 - 双十二在星巴克消息开放从点到面的思考实践


【第1486期】手淘千牛前端消息开放融合 - 双十一在星巴克消息开放项目的思考实践


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/dKFAJz2nqd
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/28423
 
918 次点击