前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Git入门教程分享

Git入门教程分享

作者头像
jwangkun
发布2021-12-27 11:30:37
4530
发布2021-12-27 11:30:37
举报
文章被收录于专栏:John Wong's Blog

简介

Git是一款免费、开源的分布式版本控制系统,GIT之父也是linux之父Linus。linux开源后参与贡献者众多,导致审查及合并、分发代码工作量过大,所以又花了一周时间开发了git。

基本概念解析

工作空间: 指的是你在当前设备存放代码文件的工作目录 本地仓库: 指的是你在当前设备用于存放不同版本代码的本地存储区,一般在工作目录的 .git 目录下 远程仓库: 指的是用于存放不同版本代码的远程网络存储区,一般由代码托管平台提供。主流平台有(github|gitlab|私有化gitlab|私有化gitea|阿里云|腾讯云)等 分支: 指的是从一个开发历史线分离出的另一个开发历史线 快照(commit):指某一时段代码变更的记录,快照组成代码开发历史记录 版本号:使用SHA-1来生成一个40位的十六进制唯一字符串来标识一个代码快照。(注:GIT版本号是无序的,没有一个全局的版本号)

QA

分支能做什么? 分支能够很好的把我们的操作与开发主线进行隔离,为了不让我们的修改影响到主线程序,只有通过审核后的代码才能够合并到主线中去,所以通过使用分支是最理想的方法。

举个例子:我们在一个迭代周期(一般是两周)内计划升级用户管理和商品管理的功能,开发和测试过程中产生了近百个代码提交记录,在最后时刻准备上线,因为某些原因放弃商品管理升级,只保留用户管理,这时候就需要把商品管理的代码剔除,如果一开始就通过合理的规划分支,我们只需合并用户管理分支即可,反之没有合理的分支管理则是一场噩梦。

程序员为什么要学习GIT?

  1. Git是分布式(可离线工作、可多个远程仓库协作、嵌套项目),SVN是集中式(必须联网,单点仓库)
  2. Git分支廉价、速度快、灵活,SVN分支昂贵、慢、重
  3. 共有或私有代码托管平台成熟易用,生态系统丰富、发展势头强劲;代码审核直观方便高效
  4. 掌握GIT可以并行开发,协同开发、轻松应对各种规模的项目和复杂需求
  5. 更容易融入开源社区、参与或发起开源项目
  6. 丰富的命令行可以精确控制代码及更容易对接各种开发工具

GIT有什么缺点? GIT不能对二进制文件做增量提交,导致文件副本过多而撑大仓库体积,解决方法是使用LFS GIT项目管理是独立的且扁平化的,权限只能分项目管理而不是目录,所不能像SVN一样每一个目录都可以当作一个项目来管理 Git学习成本高(主要是功能强大)

主流分支管理方法

业内有很多的分支管理方法,包括著名的GitFlow、TBD以及从他们衍生出来的版本。 GitFlow设计非常全面,考虑到了实际开发过程中的各种问题,都能稳定应对,是非常适合大型项目的代码管理。他的主要理念包括2个主干分支——Master和Develop,1个发布分支——Release,若干个开发分支——Feature,以及HotFix分支。整体实施流程略微复杂,对持续集成不太友好。 TBD(Trunk Based Development)早在svn时代就已经流行,是种比较简单的分支管理模型,他只有一个主干分支,每个人写完代码自测通过后就往主干上面Push,要发布的时候就拉个Release分支,对持续集成友好,但如果临上线前发现有问题,剔除代码比较困难。

GIT分支原理

GIT分支和SVN的分支区别,SVN的分支就是一个目录,是一份代码拷贝,新分支没有过去的历史记录。而GIT分支是一个指向commit对象的指针,差异通过元数据记录在版本库中。GIT中有一个特别的指针名为HEAD,它是一个指向你正在工作中的本地分支的指针,切换分支,本质上就是移动HEAD指针。Git鼓励频繁使用分支。

图解GIT结构

画图工具: https://www.processon.com/i/54c5c898e4b0c7bde4f2156c

注:git fetch是将远程仓库的更新拉取到本地仓库,不影响工作区。而git pull则是将远程仓库的代码拉到本地仓库并合并到工作区。

GIT安装

从官网下载(网速很慢): https://git-scm.com/ 国内可通过腾讯软件库下载 https://pc.qq.com/search.html#!keyword=git 安装方法:双击安装包一直点下一步即可,这里略过。

辅助工具推荐

Meld是一个功能强大的文件比对工具,支持作为git的插件使用,可用于检查差异和合并代码。

http://meldmerge.org/

meld 安装配置

从官网下载安装,然后打开 git base 执行以下命令配置你的比较工具

代码语言:javascript
复制
git config --global merge.tool meldgit config --global mergetool.meld.path "/c/Program Files (x86)/Meld/Meld.exe" # 这里软件路径改成你自己的安装路径

当代码冲突时,执行 git mergetool 启动三路合并

VSCODE 是微软开发的一款代码编辑工具,里面自带的GIT管理功能非常好用,特别是冲突解决直观高效 TortoiseGit 是一个GIT的GUI工具,操作及界面和TortoiseSVN非常相似(我自己见过没用过)。

新建本地代码库

代码语言:javascript
复制
# 方法一:为当前目录初始化一个Git代码库git init# 方法二:新建一个目录,将其初始化为Git代码库git init [project-name]# 方法三:克隆一个项目git clone [url]cd xxx # 进入目录 # 克隆一份裸版本库再以镜像方式推送服务器git clone --bare [url] && cd xxxgit push –mirror [url]# 查看当前状态git status

注:HTTP 方式需要输入用户名密码,如果输错可通过命令删除 git config —system —unset credential.helper

配置

代码语言:javascript
复制
# 显示当前的Git配置git config --list# 编辑Git配置文件git config -e --global# 设置提交代码时的用户名和邮箱git config --global user.name "[name]"git config --global user.email "[email address]"

查看信息

代码语言:javascript
复制
gitk # git bash 才有git loggit status# 查看当前详细分支信息(可看到当前分支与对应的远程追踪分支):git branch -vv# 查看当前远程仓库信息git remote -vvgit remote -a

增加/删除文件

代码语言:javascript
复制
# 添加当前目录的所有文件到暂存区git add .# 删除工作区文件,并且将这次删除放入暂存区git rm [file1] [file2] ...

代码提交

代码语言:javascript
复制
# 提交暂存区到仓库区git commit -m [message]# 提交工作区自上次commit之后的变化,直接到仓库区git commit -a# 提交时显示所有diff信息git commit -v# 使用一次新的commit,替代上一次提交# 如果代码没有任何新变化,则用来改写上一次commit的提交信息git commit --amend -m [message]# 重做上一次commit,并包括指定文件的新变化git commit --amend [file1] [file2] ...

分支

代码语言:javascript
复制
# 列出所有本地分支git branch# 列出所有远程分支git branch -r# 列出所有本地分支和远程分支git branch -a# 新建一个分支,但依然停留在当前分支git branch [branch-name]# **** 新建一个分支,并切换到该分支 ****git checkout -b [branch]# 新建一个分支,指向指定commitgit branch [branch] [commit]# 新建一个分支,与指定的远程分支建立追踪关系git branch --track [branch] [remote-branch]
代码语言:javascript
复制
# 切换到指定分支,并更新工作区git checkout [branch-name]# 切换到上一个分支git checkout -# 建立追踪关系,在现有分支与指定的远程分支之间git branch --set-upstream [branch] [remote-branch]# 合并指定分支到当前分支git merge [branch] --no-ff# 把某个分支合并到当前工作区,(对完全不同历史的分支进行强制合并)git merge <对应的分支> --allow-unrelated-histories# 选择一个commit,合并进当前分支git cherry-pick [commit]# 删除分支git branch -d [branch-name]# 删除本地的远程分支记录git branch -dr [remote/branch]# 删除远程分支git push origin --delete [branch-name]

远程同步

代码语言:javascript
复制
# 下载远程仓库的所有变动git fetch [remote]# 显示所有远程仓库git remote -v# 显示某个远程仓库的信息git remote show [remote]# 增加一个新的远程仓库,并命名git remote add [shortname] [url]# 取回远程仓库的变化,并与本地分支合并git pull [remote] [branch]# 上传本地指定分支到远程仓库git push [remote] [branch]# 强行推送当前分支到远程仓库,即使有冲突git push [remote] --force# 推送所有分支到远程仓库git push [remote] --all

撤销

代码语言:javascript
复制
# 恢复暂存区的指定文件到工作区git checkout [file]# 恢复某个commit的指定文件到暂存区和工作区git checkout [commit] [file]# 恢复暂存区的所有文件到工作区git checkout .# 清理未纳入版本管理的文件和目录git clean -df# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变git reset [file]# 重置暂存区与工作区,与上一次commit保持一致git reset --hard# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变git reset [commit]# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致git reset --hard [commit]# 重置当前HEAD为指定commit,但保持暂存区和工作区不变git reset --keep [commit]# 新建一个commit,用来撤销指定commit# 后者的所有变化都将被前者抵消,并且应用到当前分支git revert [commit]# 暂时将未提交的变化移除,稍后再移入git stashgit stash pop

子模块 submodule

代码语言:javascript
复制
# 添加子模块git submodule add [url] [path]# 子模块批量操作git submodule foreach [git status]

常用命令

添加忽略文件或目录

git忽略文件需要提交一个隐藏文件“.gitignore”,在此文件中定义忽略文件的规则;可以通过git bash命令行新建这个文件

代码语言:javascript
复制
touch .gitignore

配置语法: 以斜杠“/”开头表示目录; 以星号“*”通配多个字符; 以问号“?”通配单个字符 以方括号“[]”包含单个字符的匹配列表; 以叹号“!”表示不忽略(跟足宗)匹配到的文件或目录; git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;

相关知识

markdown

Markdown是Aaron Swartz 跟John Gruber共同设计的排版语言,Markdown 的目标是实现「易读易写」。

readme

用于描述项目的文件,采用Markdown语法编写,文件名普遍使用 “README.md”,md其实就是Markdown缩写。

github

Github是运用Git思想来工作的一个商业网站,拥有超过2400万的开发者在上面开源自己的项目,这2400万用户几乎涵盖了这个世界上所有最优秀的开发者。在Github上面获得fork或star,都意味着其它工程师对这个项目的认可。

gitlab

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务,可以用gitlab来搭建一个类似github那样的网站。

躺坑记录

git有可以创建4096长度的文件名,然而在windows最多是260,因为git用了旧版本的windows api,为此踩了个坑。

解决: git config —global core.longpaths true

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
    • 基本概念解析
      • QA
        • 主流分支管理方法
        • GIT分支原理
          • 图解GIT结构
            • GIT安装
              • 辅助工具推荐
            • http://meldmerge.org/
              • 新建本地代码库
              • 配置
              • 查看信息
              • 增加/删除文件
              • 代码提交
              • 分支
              • 远程同步
              • 撤销
              • 子模块 submodule
              • 添加忽略文件或目录
              • 相关知识
              • 躺坑记录
          相关产品与服务
          TAPD 敏捷项目管理
          TAPD(Tencent Agile Product Development)是源自于腾讯的敏捷研发协作平台,提供贯穿敏捷研发生命周期的一站式服务。覆盖从产品概念形成、产品规划、需求分析、项目规划和跟踪、质量测试到构建发布、用户反馈跟踪的产品研发全生命周期,提供了灵活的可定制化应用和强大的集成能力,帮助研发团队有效地管理需求、资源、进度和质量,规范和改进产品研发过程,提高研发效率和产品质量。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档