当前位置: 首页 > news >正文

代码回到之前版本_代码版本控制及托管:我的最佳实践

作为半个 IT 人,写代码是工作日常,如何进行代码版本控制及托管,本文介绍一下我的最佳实践,其实很容易。

工作或学习过程中写的代码,存在本地的话容易丢失,也不方便与他人进行交流。

我一般把代码托管在 Github 网站上,这样既解决了代码备份问题,又方便与他人进行交流。

有人可能会问,如果我只想托管代码,不愿意让别人看到呢?有办法,Github 上的代码仓库分为公开和私有两种,公开的所有人都可以访问,私有的只有自己才能访问。

之前私有仓库是收费的,需要绑定一张能支付美元的信用卡进行扣费,我记得一年大概是 400 多接近 500 元人民币,这不便宜,也难住了一些没信用卡的用户。

不过自从微软收购 Github 后,私有仓库免费了,感谢微软。

一、基本用法

要利用 Github 来托管代码,就要先学习一下 Git 语法。关于 Git 语法的学习,那真是多了去了,够写几本书。但实际上本人这么多年实践下来,其实最常用的就几个命令。

我的工作流程一般是这样的:

  1. 在 Github 上创建项目仓库:先填写仓库的名字(Repository name*,必须),然后填写项目描述(Description,可选),其次“Add a README file”复选框打钩,点击“Create repository”
  2. 将仓库 clone 到本地,如git clone git@github.com:jianzuoyi/learngit.git
  3. 代码编写,查看工作区状态,git status
  4. 将代码添加到暂存区git add ,是文件名,git add .代表添加当前目录的所有修改到暂存区
  5. 提交修改,git commit -m ,表示给本次提交添加一个注释,最好认真填写,以便将来知道本次提交到底做了什么修改
  6. git push,代码推送到远程仓库,至此就完成了简单的代码版本控制和远程托管,非常简单

可见,git 常用的命令也就是:

git clone
git status
git add
git commit
git push

当代码仓库已经存在于本地,要继续工作时,先git pull将远程仓库的最新版本拉到本地,修改后再git status, git add, git commit, git push

熟练掌握这几个命令,已经能应付 80%的工作需求了,这也符合二八法则,即掌握 20%的命令,完成 80%的工作,其他命令需要时再去查。

下面我们再来简单介绍一下 Git 进行版本控制的三个核心概念:工作区、暂存区和版本库。

  1. 工作区(Working Directory),即工作目录,就是项目文件所在的目录,如 learngit。

  2. 暂存区(stage,或者 index),故名思义,暂存工作区的文件修改,git add 就是将文件提交到暂存区

  3. 版本库(Repository),工作区中一个隐藏的.git目录,即是 Git 版本库,它记录了项目文件的所有修改记录,通过版本库,你可以随时将文件的内容恢复成之前的某个版本

这里解释一下,为什么要在版本库与工作区之间增加一个暂存区呢,其实是有必要的。比如你一个文件修改了一大段内容,下面又要对这一大段内容进行修改,但是你又怕改错,这时候不妨git add 暂存一下,然后继续修改,如果要保存最新的修改结果,则再次git add 覆盖掉暂存区的内容,如果你改错了,则可以把文件恢复到暂存区中的状态。

暂存区的好处就是能够多次暂存,最后一次提交到版本库,这样能保证版本库的整洁,不至于那么混乱,试想你每做一点小的修改,就往版本库中提交一次,没有必要。

理解了工作区、暂存区和版本库的概念,那么平时工作,用到的相应命令也就好理解了。

  1. 本地还没有代码库,从远程仓库克隆一个到本地git clone

  2. 本地已经有代码库,修改代码之前先git pull与远程代码库同步

  3. 当我敲了一会代码,想看下工作区的状态,用git status

  4. 我想看下某个文件修改了哪些内容,git diff ,这个命令用于查看工作区的文件与暂存区的(如果有的话)或版本库中的对比

  5. 当我觉得需要暂存一下工作内容了,用git add

  6. 完成了修改,用git commit提交到代码库

  7. 我想查看现在的版本库情况,git reflog,或者git log --pretty=oneline

二、版本回退

以上介绍的都是工作一帆风顺的情形,但是有些时候,我们发现文件修改错了,想退回到修改前的版本,这要分多情况。

情况 1:工作区修改了,还没 add 到暂存区,需要放弃修改,直接恢复为版本库中的版本

git checkout -- 

情况 2:工作区修改了,已经 add 到暂存区,又再次修改了,需要恢复成暂存区的版本

git checkout --  # 将工作区的内容恢复为最近的版本:暂存区的(如果有的话)或版本库中的

情况 3:工作区修改了,已经 add 到暂存区,还没 commit,需要恢复成版本库中的版本

git restore --staged 
git checkout -- # 分两步,先撤销暂存,再回到最新版本。如果不先撤销暂存,只checkout,则只会恢复成用暂存区

情况 4:工作区修改了,已经 commit 到版本库,需要恢复成 commit 前的版本

git reset HEAD^ # 将上一个版本库中的内容放入暂存区
git checkout -- # 从暂存区恢复到工作区

情况 5:在版本之间切换

git reset --hard HEAD^	# HEAD^, HEAD^^, HEAD~3
git reset --hard commit_id # 在任意版本之间切换

HEAD 指向的版本就是当前版本,Git 允许在任意版本之间切换

三、远程仓库

版本管理的最佳实践就是先创建远程仓库,再克隆到本地进行修改,然后 push 到远程仓库。

但是有些时候代码已经存在本地了,需要将其推送到远程仓库,我通常是这样做的:

  1. 在 Github 上创建项目仓库:先填写仓库的名字(Repository name*,必须),然后填写项目描述(Description,可选),点击“Create repository”,注意”Initialize this repository with:“下面的几个复选框都不要选,直接点“Create repository”

  2. 这样会在弹出的页面中显示如下命令

 echo "# learngit" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:jianzuoyi/learngit.git
git push -u origin main
  1. 切换到本地的代码目录,运行上述命令,就可以在当前目录创建代码仓库,并与远程仓库进行关联

四、分支管理

分支的作用:当一个功能还没开发完成时就提交代码,不完整的代码库会导致程序不能正常工作。如果等完成了再提交,又存在丢失每天进度的风险。

有了分支,就可以等开发完毕后一次性合并到原来的分支上。

查看分支:git branch

创建分支:git branch

切换分支:git switch 或者git checkout

创建+切换分支:git switch -c 或者git checkout -b

合并某分支到当前分支:git merge

删除分支:git branch -d

查看分支合并图:git log --graph --pretty=oneline --abbrev-commit

五、解决冲突

有时候从远程库 pull 时,可能会存在冲突,因为 Git 是一个分布式管理系统,你在公司电脑上有一份克隆,修改提交后 push 到了 Github,然后你家里电脑也有一份克隆,当你要继续进行工作时,需要先运行git pull命令同步 Github 的最新版本,发现本地仓库已经有了更新,这时可能就会出现合并冲突。

这时你可以:

git stash,暂时清空工作区
git pull,执行合并
git stash pop,弹出暂存的工作区内容
git status,查看工作区状态
git diff ,查看具体文件的修改,从而决定是否用新版本,如果要保存新版本,则执行`git add, git commit`流程
git checkout -- ,如果要放弃文件的修改,则执行此命令

掌握以上这些命令,基本上就够用了。


4b9cb5ceb62d6bf9765309bacbeac253.png

如果你喜欢这篇文章,请点个“赞”吧!或者点击“在看”让更多朋友看到,点击“

相关文章:

  • springboot处理参数再转发请求_springBoot PUT请求接收不了参数的解决办法
  • 如何在EDUIS中导出ETL字幕模板_教大家Edius如何设置导出mp4格式视频
  • r语言和metawin_【R语言】关于ggcor包消息的更新
  • git maven 一键部署_Docker+Jenkins+Git+Maven实现Springboot项目自动化部署
  • 添加删除元素_蔡司:CALYPSO高级应用 | 指数交换与添加删除循环
  • 初中物理凸透镜成像动态图_只要看一眼,就能立刻知道凸透镜成像特点,中考物理必考送分题...
  • html5窗口最顶层_快速开发基于 HTML5 网络拓扑图应用——入门篇(一)
  • mime插件 node_【Node.js基础篇】(五)使用mime模块来响应css、js文件的请求
  • react前端封装接口弹出错误_在react项目中用es6封装ajax请求,组件中调用总是报错,求解?...
  • mysql5.7不能存储中文_解决Mysql5.7中文乱码的问题
  • mysql取字段中间字符串_sql 如何截取一个字段里某一字符串中间的字符?
  • mysql分区技术_高性能的MySQL(7)分区技术
  • mysql7.6.8安装教程_Centos7安装mysql8教程
  • rhel8安装配置mysql_Linux下Mysql8.0.19安装配置图文详解(Redhat centos 6.8)
  • mybatis中 if test 写在select后面_手写一个简易版的Mybatis,带你深入领略它的魅力...
  • ----------
  • Android单元测试 - 几个重要问题
  • angular2 简述
  • CSS魔法堂:Absolute Positioning就这个样
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • passportjs 源码分析
  • Redis 中的布隆过滤器
  • uni-app项目数字滚动
  • 安装python包到指定虚拟环境
  • 服务器之间,相同帐号,实现免密钥登录
  • 算法---两个栈实现一个队列
  • 我建了一个叫Hello World的项目
  • 无服务器化是企业 IT 架构的未来吗?
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • Spring第一个helloWorld
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ###项目技术发展史
  • #includecmath
  • #pragma预处理命令
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (pojstep1.1.2)2654(直叙式模拟)
  • (ZT)出版业改革:该死的死,该生的生
  • (二)hibernate配置管理
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)插入排序
  • ******IT公司面试题汇总+优秀技术博客汇总
  • **PHP分步表单提交思路(分页表单提交)
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET Framework杂记
  • .NET 表达式计算:Expression Evaluator
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .Net中的设计模式——Factory Method模式