30分钟了解并学会git的使用(绝对干货)

news/2024/11/29 3:39:41/

概述:

        在programmer行业有一句流传许久的话:不会用git的程序员,不是真的程序员!!

足以看出来git在业界的认可度有多高,所以我们混这行的都应该学会这个由Linux之父林纳斯开发

的第二大发明,下面我用30分钟时间来带你了解它的前世今生,并熟练掌握它的用法。

Git的前世今生(产生背景):

                                                         Linux之父--林纳斯

        1991年,Linux之父林纳斯(Linus)开发出了初版Linux系统并把Linux系统代码开源,之后Linux发展非常的迅速,全球很多热心的程序员都纷纷为Linux系统添砖加瓦,这么多人给Linux系统贡献代码,这些代码如何管理的呢?

        事实上,在2002年之前,这些热心的程序员都是通过diff的方式把源代码文件发送给Linus,最后Linus手动将代码合并起来。这样看来,非常的复杂。那么为什么不把代码放在当时的cvs和svn这些集中式的版本管理系统呢?因为Linus坚决反对这种速度慢,而且还需要联网的版本管理系统。

        不过,在2002年之后,代码实在太多了。Linus也撑不下去了,无奈之下找了一个商业的版本控制系统BitKeeper,BitKeeper的老板一看是Linux之父在使用他们的产品,颇有魄力的直接授权Linus及为Linux贡献代码的热心开发者免费使用他们的系统。

        但是好景不长,在2005年,Linux社区里的一位大牛,开发Samba的Andrew试图去破解BitKeeper的协议,其实不止他一个人这么干过,结果就是被BitKeeper公司发现了,结果可想而知。在此期间,Linus其实是可以挽回的,但是可能由于Linus江湖气息很重,一直没有道歉。

        紧接着,更加出人意料的事情就来了,Linus只是花了两周的时间就用C语言写了一个分布式版本控制系统,它就是Git。一个月之内,Linux的代码就交给了Git来管理!

        截至现在的2023年,Git已经成为了全球范围内影响力和使用率最高的版本管理工具了!

Git介绍:

        Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds(Linux之父)为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。

版本控制:

        版本控制(Revision control)是一种在开发的过程中用于管理我们对文件,目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。简单说就是用于管理多人协同开发项目的技术。    

Git(分布式版本控制,没有中央服务器,可以离线提交)

SVN(集中式版本控制,有中央服务器,不可以离线提交)

Git的下载与安装:

 下载地址:Git

下一步下一步,傻瓜式安装即可

安装完成后在桌面右击会有Git项:

Git Bash:Unix与Linux风格命令行,使用最多,推荐最多

Git CMD: Windows风格命令(这个在安装后的开始菜单Git文件夹下)

Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令

Git配置

配置用户名和邮箱:

当安装Git后首先要做的是设置用户名和邮箱地址这是非常重要的,因为每次Git提交都会使用该信息,它被永远的嵌入到你的提交中:

配置用户名git config --global user.name "your_username"

配置邮箱git config --global user.email "your_username@163.com"

(1)只需要做一次这样的设置,因为传递了--global选项,Git将总是使用该信息来处理你系统中所做的一切操作。但如果你希望在不同的项目中使用不同的用户名和邮箱地址,你可以在该项目中运行上面命令时不加 --global选项。总之--global为全局配置,不加为某个特定项目的配置。

(2)环境变量可以配置也可以不配置,配置环境变量是为了在电脑的任何地方都能使用,如通过cmd进行Git操作,当然软件在我们安装的时候它自己已经帮我们配置了。

列出所有配置项:git config -l

 编辑配置项:git config -e(需要在具体项目里操作)

 编辑用户(全局)配置:git config -e --global

配置项分类:

1、仓库级别 local 【优先级最高】

2、用户级别 global【优先级次之】

3、系统级别 system【优先级最低】

删除配置项:git config [--local|--global|--system] --unset user.email 

Git工作区域:

Git本地有三个工作区域:工作目录(Working Directory),暂存区(Stage/Index),本地资源库(Repository或Git Directory)。如果再加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:

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

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

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

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

备注:以上四个工作区其实跟我们挂钩的只有工作区和远程仓库,暂存区和仓库区我们只需要通过命令操作即可。

Git的工作流程:

1.在工作区中添加,修改文件

2.将需要进行的版本管理的文件放入暂存区域

3.将暂存区域文件提交到本地仓库

4.将本地仓库的代码推送到远程仓库

因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你的项目目录,也可以是空目录,建议不要有中文。

Git常用命令:

一:新建代码

创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。

(1)在当前目录新建一个Git代码库:git init

(2)在当前目录下新建一个目录,并将其初始化为Git代码库:git init [project-name]

(3)克隆远程仓库:git clone [url]

二:增加/删除文件到暂存区

(1)添加指定文件到暂存区:git add [file1] [file2] ...

(2)添加指定目录到暂存区,包括子目录:git add [dir]

(3)加当前目录的所有文件到暂存区:git add .

(4)删除工作区文件,并且将这次删除放入暂存区:git rm [file1] [file2] ...

(5)停止追踪指定文件,但该文件会保留在工作区:git rm --cached [file]

(6)改名文件,并且将这个改名放入暂存区:git mv [file-original] [file-renamed]

三:代码提交

(1)提交暂存区到本地仓库:git commit -m [message]

(2)提交暂存区的指定文件到本地仓库区:git commit [file1] [file2] ... -m [message]

(3)提交工作区自上次commit之后的变化,直接到仓库:git commit -a

(4)提交时显示所有diff信息:git commit -v

(5)使用一次新的commit,替代上一次提交,如果代码没有任何新变化,则用来改写上一次commit的提交信息:git commit --amend -m [message]

(6)重做上一次commit,并包括指定文件的新变化:git commit --amend   ...

四:分支与分支合并

(1)列出所有本地分支:git branch

(2)列出所有远程分支:git branch -r

(3)列出所有本地分支和远程分支:git branch -a

(4)新建一个分支,但依然停留在当前分支:git branch [branch-name]

(5)切换分支并更新工作区:git checkout [branch-name]

(6)新建一个分支,与指定的远程分支建立追踪关系:

git branch --track [branch] [remote-branch]

(7)建立追踪关系,在现有分支与指定的远程分支之间

git branch --set-upstream [branch] [remote-branch]

(8)合并指定分支到当前分支:git merge [branch]

合并新建分支代码到主分支的操作流程

git branch test    # 新建test分支

git checkout test  # 切换到test分支

git commit -m 'test branch commit'   # 修改完test分支代码后提交到暂存区

git push -u origin test      # 推送代码到test分支

git checkout master         # 切换到主分支

git merge test                   # 合并test分支到主分支

git push -u origin master   # 把test分支代码合并推送到主分支

(9)选择一个commit,合并进当前分支:git cherry-pick [commit]

(10)删除本地分支:git branch -d test

(11) 删除远程分支:git push -u origin -d test

五:标签

(1)列出所有tag:git tag

(2)新建一个本地tag号:git tag [tag]

(3)查看tag信息:git show [tag]

(4)提交指定tag到远程仓库:git push origin [tag]

提交所有tag: git push origin --tags

六:查看信息

(1)显示有变更的文件:git status

(2)显示当前分支的版本历史:git log

(3)显示commit历史,以及每次commit发生变更的文件:git log --stat

(4)显示某个文件的版本历史,包括文件改名:

git log --follow [file]

git whatchanged [file]

(5)显示指定文件相关的每一次diff:git log -p [file]

(6)显示指定文件是什么人在什么时间修改过:git blame [file]

(7)显示暂存区和工作区的差异:git diff

(8)显示暂存区和上一个commit的差异:git diff --cached []

(9)显示工作区与当前分支最新commit之间的差异:git diff HEAD

(10)显示两次提交之间的差异:git diff [first-branch]...[second-branch]

(11)显示某次提交的元数据和内容变化:git show [commit]

(12)显示某次提交发生变化的文件:git show --name-only [commit]

(13)显示某次提交时,某个文件的内容:git show [commit]:[filename]

(14)显示当前分支的最近几次提交:git reflog

七:远程同步

(1)下载远程仓库的所有变动:git fetch [remote]

(2)显示所有远程仓库:git remote -v

(3)显示某个远程仓库的信息:git remote show [remote]

(4)增加一个新的远程仓库,并命名:git remote add [shortname] [url]

(5)取回远程仓库的变化,并与本地分支合并:git pull [remote] [branch]

(6)上传本地指定分支到远程仓库:git push [remote] [branch]

(7)强行推送当前分支到远程仓库,即使有冲突:git push [remote] --force(慎用)

(8)推送所有分支到远程仓库:git push [remote] --all

(9)恢复暂存区的指定文件到工作区:git checkout [file]

(10)恢复某个commit的指定文件到工作区:git checkout [commit] [file]

(11)恢复上一个commit的所有文件到工作区:git checkout .

(12)重置暂存区的指定文件,与上一次commit保持一致,但工作区不变:git reset [file]

(13)重置暂存区与工作区,与上一次commit保持一致:git reset --hard

(14)重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变:git reset [commit]

(15)重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致:git reset --hard [commit]

(16)重置当前HEAD为指定commit,但保持暂存区和工作区不变:git reset --keep [commit]

(17)新建一个commit,用来撤销指定commit,后者的所有变化都将被前者抵消,并且应用到当前分支:git revert [commit]

八:忽略文件.gitignore

有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等

在主目录下建立“.gitignore”文件,此文件有如下规则:

1.忽略文件中的空行或以井号(# )开始的行将会被忽略。

2.可以使用Linux通配符。例如∶星号(*)代表任意多个字符,问号(﹖)代表一个字符,方括号([abc] )代表可选字符范围,大括号( {string1,string2……})代表可选的字符串等。

3.如果名称的最前面有一个感叹号( !),表示例外规则,将不被忽略。

4.如果名称的最前面是一个路径分隔符(/ ),表示要忽略的文件在此目录下,而子目录中的文件不忽略。

5.如果名称的最后面是一个路径分隔符(/ ),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。

例子:

*.txt   #忽略所有的.txt结尾的文件

!lib.txt  #但lib.txt除外

/temp  #进忽略项目根目录下的TODO文件,不包括其他目录temp

bulid/  #忽略bulid目录下的所有文件

doc/*.txt #会忽略doc/notes.txt 但是不包括doc/sever/arch.txt

九:readme.md规则

README应该是介绍项目整体的一个概览。其实这个静态文件是有约定成俗的规范,这个规范也就是众多开源开发者相互磨合所形成的。

项目名称与项目介绍

代码实现了什么功能?

项目如何使用? 如何部署?如何运行?(系统环境参数,部署要素,操作说明等)

代码组织架构是什么样的?(目录结构说明等)

版本更新内容摘要(这个非常重要)

第一次提交代码操作流程:

(1)在gitlab等代码仓库上新建代码仓库例如test111

(2)打开项目目录git bash here

 

 (3)自定义并初始化代码库 git init 自定义项目名称

 

 

 (4)cd 到项目里,会看到有.git目录,git add . 添加当前目录所有文件到暂存区

 (5)git stutus 查看暂存区的文件和状态

 (6)git commit -m ‘备注信息’ 提交代码到本地仓库

 (7)git remote add origin  远程仓库地址

如果没有同步远程代码库需要执行:判断获取远程仓库的变化,并参与本地分支合并

git pull --rebase origin master  把远程库中代码合并到本地,–rebase的作用是取消掉本地库中之前的提交

 (8)git push -u origin master 推送最终代码

 (9)代码提交成功


http://www.ppmy.cn/news/350424.html

相关文章

信号都是如何产生的,干货满满

目录 一、哪三大阶段 二、产生信号 1、通过键盘产生信号 2、系统调用 3、软件条件产生信号 4、硬件异常产生信号 三、Term和core是什么 一、信号一生三大阶段 1、产生信号:由通过键盘、系统调用、软件条件、硬件异常产生这几种方法产生信号。 2、信号储存&a…

C语言编译成DLL文件,给其他程序调用。C语言编译成EXE文件,执行简单功能。HEX文件合并

文章目录 一、简介二、步骤1. 先编写c语言文件。用CRC8举例。crc8_2f.c crc8_2f.h2. 编译成DLL文件3. 给上位机调用(1)C#(2) 易语言 三、编译成EXE1. 编写一个c文件。 merge_hex.c(例:hex文件合并)2. 编译文件3. 合并脚…

300字总结计算机flash,flash实训报告心得(共10篇).docx

flash实训报告心得(共10篇) 实训心得  一个星期的实训使我们对FLASH的学习有了更深入的了解,这次没有进行分组,所以难度加大了。经过几天的思考确定了自己要做的东西是什么,难度的加大对自己也是个锻炼的机会,自己要去发现问题&…

网页设计(一)

网页设计 提示:这里有基础内容,也有中级内容 例如:网页设计div布局 网页设计 网页设计前言一、什么是网页二、使用网页编辑软件(一)、初学者的网页制作软件(二)、中级网页制作软件(…

HTML5+CSS期末大作业:篮球明星个人网站设计——篮球明星介绍(6页) 简单的学生DW网页设计作业成品 web课程设计网页规划与设计 简单个人网页设计作业 静态HTML旅行主题网页作业 DW

HTML5CSS期末大作业:篮球明星个人网站设计——篮球明星介绍(6页) 简单个人网页设计作业 静态HTML旅行主题网页作业 DW个人网站模板下载 大学生简单个人网页作品代码 常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、…

计算机专业毕业设计题目大全 (各类型系统设计大全)

计算机专业毕业设计题目大全 毕设论文答辩通关法则,看这一篇,源码都在下面了!写在前面,尽管论文方法和毕设源码都有,但还是要看课自己敲完完善好。做好充分准备面对答辩。 1.网络留言薄 2.客户管理系统 3.多媒体积件管…

nand flash制备

1、晶圆wafer wafer 即为图片所示的晶圆,由纯硅(Si)构成。一般分为6英寸、8英寸、12英寸规格不等,晶片就是基于这个wafer上生产出来的。Wafer上的一个小块,就是一个晶片晶圆体,学名die,封装后就…

FLASH

最近一直在致力于基于ARM920T的FLASH的读写,虽然这部分一般没有多少人屑于研究,认为比较简单(U-boot和VIVI中都有现成的支持程序),但对于初学的我,还是尽心尽力地学习一下,目的在于自己编写一个…