写在2018第一天:编程之路始于Git

git是目前世界上使用最广泛的分布式版本控制系统,由大名鼎鼎的Linus花了两周时间写成,同时在2008年使用给git作为唯一版本库格式托管平台gitHub网站上线,已有众多知名开源项目迁移至github。

git是分布式版本控制系统,与之对应的是集中式版本控制。分布式和集中式最大的不同,分布式并不是提取最新版本的文件快照,而是把代码仓库完整的克隆下来。每一次克隆操作都是对代码仓库的完整备份。所以,如果代码仓库的服务器发生故障,都可以用任何一个本地镜像仓库恢复,整个项目的历史记录都不会丢失。同时Git拥有完善的分支管理系统,可以指定与多个远程代码仓库交互协作开发。

git已经成为软件开发者必须会的技能之一,正确熟练的使用git对团队合作、提高工作效率都是有很大帮助的。很多公司包括硬件工程师都必须要熟练使用git,何况软件工程师呢!

基于git的托管平台除了github还有很多,国内免费也有很多,如码云中国(https://gitee.com);Coding(https://coding.net),国内的git平台下载速度都比较快,也支持一定数量的免费私有项目。

同时git拥有GitHub for Desktop、Source Tree等众多优秀且功能强大的图形化客户端工具。不过本篇主要讲解git命令行操作,因为只有在命令行模式下才能了解学习git的所有命令,这样操作GUI工具也不会存在困难。同时我推荐在熟练使用git后可通过命令行与GUI配合使用的方式提高工作效率。

git项目分为三个工作区域:工作目录、暂存区域、本地仓库及git仓库。其中:

Workspace:工作目录,存放从git仓库的压缩数据库中提取出来的文件,存放在本地磁盘上可修改。

Index:暂存区域,存放的是一个文件,保存了下次将要提交的文件列表信息。

Repository:本地仓库。

Remote:远程仓库,是Git用来保存项目的元数据和对象数据的地方。

git基本工作流程:

1.在工作目录中修改文件

2.暂时文件,将文件的快照放入暂存区域。

3.提交更新,找到暂时区域的文件,将快照永久性的存储到git仓库目录

一、Git安装与配置

1)安装:

Ubuntu系统默认没有安装Git,可通过sudo apt-get install git安装。

Windows下有很多支持Git的图形化工具,推荐安装SourceTree。

2)git配置:

git的配置文件为.gitconfig,它可以在用户主目录下,用于全局配置;也可以在项目的目录下,用于项目配置。所有操作如果添加了--global就是对全局配置文件操作;不加--global同时在项目目录下操作就是操作项目配置文件。

查看git配置信息:git config [--global] --list

编辑git配置文件:git config -e [--global]

修改git默认编辑器:git config [--global] core.editor vi

长期存储密码:git config [-- global] credential.helper store

查看所有账户git config --get-all user.name

设置用户名:git config [--global] user.name

设置邮箱:git config [--global] user.email

二、基本操作1.git init

初始化本地仓库,在当前目录下生成.git目录,该目录为仓库,而当前目录为工作空间。

2.查看信息

查看本地文件夹所有修改的文件

git status

查看当前分支的版本历史

git log

查看暂存区与工作区的差异

git diff

3.git add

添加指定文件到暂存区:

git add ...

添加指定目录到暂存区:

git add

添加当前目录下的所有文件:

git add .

4.git rm

删除工作区文件,且将这次删除放入暂存区

git rm ...

停止跟踪指定文件,但该文件会保留在工作区

git rm --cached

5.git commit

提交暂存区的文件到本地仓库

git commit -m“commit log”

提交暂存区的指定文件到本地仓库

git commit ... -m“commit log”

提交工作区自上次commit之后的变化至仓库区,无需git add

git commit -a

提交时显示所有修改信息

git commit -v

6.git clone

从远程主机克隆一个版本库,该命令会在本地主机生成一个目录,与远程主机的版本库同名。

git clone

示例:git clone https://github.com/espressif/ESP8266_RTOS_SDK

如需指定不同的目录名,可以将目录名作为git clone命令的第二个参数。

git clone

示例:git clone https://github.com/espressif/ESP8266_RTOS_SDK esp8266

在clone版本库的时候,使用的远程主机自动被命名为origin,如需使用其他主机名需使用-o选项。

git clone -o

示例:git clone -o esp https://github.com/espressif/ESP8266_RTOS_SDK

克隆指定分支:

git clone -b

示例:git clone -b 1.4.x https://github.com/espressif/ESP8266_RTOS_SDK

如果git仓库有子模块,可通过克隆命令一次拉取全部子模块。

git clone --recursive 。

示例:ESP32的SDK内有很多第三方开源组件作为子模块,如果不拉取全部,将导致有些功能无法正常编译。git clone --recursive https://github.com/espressif/esp-idf

7.git remote

git要求每个远程主机都必须指定一个主机名,git remote命令就用于管理主机名。

列出已经存在的所有远程主机:

git remote

查看远程主机的网址:

git remote -v

示例:当前有1台主机,主机名为origin

git remote -v

origin https://github.com/espressif/ESP8266_RTOS_SDK (fetch)

origin https://github.com/espressif/ESP8266_RTOS_SDK (push)

添加远程主机:

git remote add

示例:git remote add origin https://github.com/espressif/ESP8266_RTOS_SDK

删除远程主机:

git remote rm

示例:git remote rm origin

更改远程主机名:

git remote rename

示例:git remote rename origin esp

8.git pull

git pull用于拉取远程主机某个分支的更新,再与本地的指定分支合并。

git push :

示例:拉取origin主机的dev分支,与本地的master分支合并。git pull origin dev:master。如远程分支是与当前分支合并,则冒号后面的部分可以省略。

git会自动在本地分支与远程分支之间建立一种追踪关注。在git clone的时候,所有本地分支默认与远程主机的同名分支建立追踪关系,也就是本地的master分支自动追踪origin/master分支。

如当前分支与远程分支存在追踪关系,可省略远程分支名

示例:git pull origin

如当前分支只有一个追踪分支,可省略远程主机名

示例:git pull

9.git push

git push用于将本地分支更新,推送至远程主机,操作与git pull类同。

git push :

如果当前分支与多个主机存在追踪关系,可以使用-u选项指定一个默认主机,这样后面就不需要加任何参数直接使用git push。git push -u origin master。将本地的master分支推送到origin主机,同事指定origin为默认主机。

强制推送当前分支到远程仓库,即使有冲突;该指令要慎用。

git push --force

推送所有分支到远程仓库

git push --all

10.git branch

分支管理在git里是很有用的的一个功能。

列出所有本地分支

git branch

列出所有远程分支

git branch -r

列出所有本地和远程分支

git branch -a

新建分支,但不切换至新建的分支

git branch

新建分支,同时切换至新建的分支

git checkout -b

拉取远程分支并创建本地分支

git check -b origin/

切换到指定分支

git checkout

删除分支

git branch -d

强制删除分支

git branch -D

删除远程分支

git push --delete origin

合并指定分支到当前分支

git merge

11.文件恢复、重置

分别使用git checkout、git reset指令,使用这些操作后,很多修改的文件将被取消,需慎用。

恢复暂存区的指定文件到工作区

git checkout

恢复指定commit的指定文件到工作区

git checkout

恢复暂存区的所有文件到工作区

git checkout .

重置暂存区的指定文件,与上一次commit保持一致,但工作区不变

git reset

重置暂存区与工作区,与上一次commit保持一致

git reset --hard

12.git tag

列出所有tag

git tag

新建一个tag

git tag

删除本地tag

git tag -d

删除远程tag

git push origin :refs/tags/

查看tag信息

git show

提交指定tag

git push origin

提交所有tag

git push origin --tags

三、实战流程:1.新建仓库

1)初始化本地仓库:git init

2)添加文件至暂存区:

添加指定文件:git add README.md

添加所有文件:git add .

3)提交至本地仓库:

git commit -m“first commit”

4)添加远程主机:

git remote add origin https://github.com/espressif/ESP8266_RTOS_SDK

5)提交至远程主机origin的master分支下:git push -u origin master,并建立跟踪关系。以后提交更新可以直接使用git push。

2.已存在仓库

1)克隆:git clone https://github.com/espressif/ESP8266_RTOS_SDK

2)查看本地文件更新状态:git status

3)查看更新日志:git log

4)拉取更新:git pull

本文来自企鹅号 - 燕十三的嵌入式之旅媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏存储

Xen server虚拟化中虚拟机磁盘文件丢失的处理办法

因服务器突然断电原因导致Xen Server服务器中一台VPS(即Xen Server虚拟机)不可用,虚拟磁盘文件丢失,通过电话联系北亚数据来进行恢复。硬件环...

23070
来自专栏企鹅号快讯

亿万级的 go与C高效混合编程!

今年是 Go 语言诞生的 8 周年,在这个特别的年,Go 语言官方博客发表的纪念刊文称,全球有大约 100 万 Go 开发者,Go 语言在 GitHub 的 2...

36200
来自专栏开发与安全

Mysql数据库学习(二):数据类型(数值类型 日期和时间类型 字符串类型)

数据类型 数值类型 日期和时间类型 字符串类型 ? 一、数值类型 整数 ? tinyint[M] [unsigned] [zerofill]   ...

25000
来自专栏开发与安全

平衡二叉树 AVL 的插入节点后旋转方法分析

平衡二叉树 AVL( 发明者为Adel'son-Vel'skii 和 Landis)是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。 首先我...

28800
来自专栏企鹅号快讯

产品经理必备技能:写SQL

在我们这行,有一个经典的问题:产品经理要不要懂技术? 我的观点是,产品经理懂技术,就像流氓会武术,谁都挡不住。懂技术,进可攻退可守,艺多不压身,当然是多多益善。...

35800
来自专栏高爽的专栏

INSERT ... ON DUPLICATE KEY UPDATE

向数据库插入记录时,有时会有这种需求,当符合某种条件的数据存在时,去修改它,不存在时,则新增,也就是insertOrUpdate操作。这种控制可以放...

32300
来自专栏开发与安全

Mysql数据库学习(三):表的crud操作、完整性约束、select各种查询

一、表的crud操作 指增加(Create)、查询(Retrieve)(重新得到数据)、更新(Update)和删除(Delete) // select 查询后面...

26700
来自专栏企鹅号快讯

五招打造超级微信数据库,让资源为你所用

一、认知微信: 微信不是微商式的方式来玩的,它有自己的生态模式。适应其生态模式,才能用其功效。 微信营销经历多年的爆炒,慢慢形成了它特有的营销通道,就是精细化运...

230100
来自专栏企鹅号快讯

你真的了解微服务吗?

从一体化应用到微服务 首先为大家介绍一下微服务。在谈主题之前我们先回顾一下历史。一开始,使用的是一体化应用,也称为巨石应用,相信大家对于这个模型都非常地熟悉。然...

23100
来自专栏高爽的专栏

服务化架构下的数据一致性如何保证

在系统服务化的过程中,我们不得不面临的一个问题是多个子系统间业务数据的一致性如何保证,解决这个问题有多种方式。 XA 可能很多人首先会想到XA规范中定义的分布式...

29300

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励