git是一个分布式的版本控制工具
github是代码托管平台
git有什么用呢?
(1)保存文件的所有修改记录
(2)使用版本号进行区分
(3)随时可浏览历史版本记录
(4)历史版本可以任意还原
(5)可以对比不同版本的文件差异
为什么要用git呢?
(1)多人协作开发一个大型项目
(2)每个人都在代码库下载代码,然后进行修改,把大家不同版本的代码合在一起上传到平台。
(3)公司都有自己的代码托管平台,github是开源的免费学习的项目。
(4)为协作开发而生,学习意义比较大
1、安装git
下载安装包,安装windows版本
下载链接:CNPM Binaries Mirror
1.1 配置本地私钥到远程仓库中
(1)打开git输入:ssh-keygen
(2)然后一直按回车,在C:\Users\T14s Gen 3.ssh目录上会生成一个公钥文件和私钥文件
(3)复制 ~/.ssh/id_ed25519.pub文件的内容
(4)登录 GitHub(gitlab) → Settings → SSH and GPG keys → New SSH key → 粘贴并保存。
验证添加私钥是否成功:ssh -T 远程仓库链接地址
2、常用git指令
1、先进入项目所在的文件夹,打开git 2、git init 3、git add . //添加所有文件 //或 git add 文件名1 文件名2 //添加指定文件 //创建本地用户 4、git config --global user.name "你的名字" 4、git config --global user.email "你的邮箱@example.com" //提交到本地仓库 5、git commit -m "第一次提交:项目初始化" 6、链接远程仓库 git remote add origin git@github.com:magua/9.1-kvstore.git //检查是否成功 git remote -v // 应该显示: // origin https://github.com/你的用户名/仓库名.git (fetch) // origin https://github.com/你的用户名/仓库名.git (push) //将本地仓库推至远程仓库 # 将本地 main/master 分支推送到远程,并建立关联 git push -u origin main # 或 git push -u origin master # -u 参数表示建立跟踪关联,以后可以简写为 git push下面介绍一下git中常用的几种命令:
git config:配置信息
git clone -b magua 链接地址(-b是下载分支代码)
checkout(检出):从本地仓库中检出一个仓库分支然后进行修订
git commit:提交命令
git add:添加文件到缓存命令
git status:查看文件的状态命令
git diff:查看更新的详细信息命令
git fetch(抓取):从远程仓库抓取到本地仓库,不进行任何的合并动作,一般操作的比较少
git pull(拉取):从远程仓库拉到本地库,自动进行合并,然后放到工作区,相当于fetch+merge
git push(推送)
git reset HEAD:取消缓存命令
git rm:删除命令
git mv:移动或重命名命令
我们可以通过git config来配置用户名和邮箱地址,便于我们将代码提交到远程仓库,具体格式如下:
git config --global user.name '你的用户名' git config --global user.email '你的邮箱'git add 命令可将文件添加到缓存,如新项目中,添加所有文件很普遍,可以使用如下命令:
git add .当然我们也可以指定某一类文件,如将java文件添加到缓存中,可以使用如下命令:
git add *.java我们可以使用 git status 命令来查看相关文件的状态,直接执行如下命令:
git status如果有修改的文件,则执行结果如下:
根据上面git status命令的提示内容,我们可以得到三种处理情况:
暂存文件的命令:git add <文件名>
放弃未暂存文件的修改命令:git checkout --<文件名>
将被修改的文件暂存并提交的命令:git commit -a
如果你对Git的各种状态比较熟悉了,也可以使用 git status -s 来查看简写的状态,这种简写的状态和SVN上的差不多 M - 被修改,A - 被添加,D - 被删除,R - 重命名,?? - 未被跟踪 等等。如果有修改的文件,则执行结果如
git diff
执行 git diff 来查看更新的详细信息,与git status不同的是,git status只显示更新的状态,而 git diff 可以显示已写入缓存与已修改但尚未写入缓存的改动的区别具体的详细信息。
尚未缓存的改动:git diff
查看已缓存的改动:git diff --cached
查看已缓存的与未缓存的所有改动:git diff HEAD
显示摘要而非整个 diff:git diff --stat
为常用指令配置别名
打开windows用户目录,创建.bashrc文件,可以在git bash上使用命令创建
touch ~/.bashrc2. 在文件中输入以下内容
#用于输出git提交日志 alias git-log='git log --pretty=oneline --all --graph --abbrev-commit' #用于输出当前目录所有文件及基本信息 alias ll='ls -al'3. 打开git bash执行我们刚刚创建的文件
source ~/.bashrc解决git bash乱码问题
打开git bash执行下面命令
git config --global core.quotepath false2.${git_home}/etc/bash.bashrc文件最后加入下面两行
git_home:git的安装目录
export LANG="zh_CN.UTF-8" export LC_ALL="zh_CN.UTF-8"3、获取本地仓库
要使用Git对我们的代码进行版本控制,首先需要获得本地仓库 1)在电脑的任意位置创建一个空目录(例如test)作为我们的本地Git仓库
2)进入这个目录中,点击右键打开Gitbash窗口
3)执行命令git init
4)如果创建成功后可在文件夹下看到隐藏的.git目录。
4、基础操作指令
Git工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行Git的命令而 发生变化。
本章节主要讲解如何使用命令来控制这些状态之间的转换:
git add(工作区-->本地暂存区)
git commit(本地暂存区-->本地仓库)
-m 后面可以跟注释"注释"
4.1、*查看修改的状态(status)
作用:查看的修改的状态(暂存区、工作区)
命令形式:git status
4.2、*添加工作区到暂存区(add)
作用:添加工作区一个或多个文件的修改到暂存区.
命令形式:git add单个文件名|通配符(.)。将所有修改加入暂存区:git add .
4.3、*提交暂存区到本地仓库(commit)
作用:提交暂存区内容到本地仓库的当前分支
命令形式:git commit -m '注释内容"
4.4、*查看提交日志(log)
在3.1.3中配置的别名git-log就包含了这些参数,所以后续可以直接使用指令git-log
作用:查看提交记录
命令形式:git log [option]
options
--all 显示所有分支
--pretty=oneline 将提交信息显示为一行
--abbrev-commit 使得输出的commitld更简短
--graph以图的形式显示H
4.5、版本回退
作用:版本切换 命令形式:git reset --hard commitID
commitID可以使用git-log或git log指令查看
如何查看已经删除的记录?
git reflog
这个指令可以看到已经删除的提交记录
3.3.6、添加文件至忽略列表
一般我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以在工作目录中创建一个名为gitignore的文件(文件名称固定),列出要忽略的文件模式。下面是一个示例:
1、创建一个.gitigore文件,将不需要管理的文件添加到该文件中,git就会剔除这部分的文件 # no .a files *.a # but do track lib.a, even though you're ignoring .a files above!lib.a # only ignore the ToDo file in the current directory, not subdir/ToDo /TODO # ignore all files in the build/ directory bui1d/ # ignore doc/notes.txt, but not doc/server/arch.txt doc/*.txt # ignore all .pdf files in the doc/ directory doc/**/*.pdf5、基础练习操作
########仓库初始化############################# 创建目录(git_test01)并在目录下打开gitbash略 #初始化git仓库 git init #####################创建文件并提交######################目录下创建文件 fi1e01.txt略 #将修改加入暂存区 git add #将修改提交到本地仓库,提交记录内容为:commit 001git commit --m 'commit 001' #查看日志 git log ###林#林#林##########修改文件并提交#########修改fi1e01的内容为:count=1 略 #将修改加入暂存区 git add ##将修改提交到本地仓库,提交记录内容为:update fi1e01 git commit --m 'update file01' #查看日志 git log # 以精简的方式显示提交记录git-log ###将最后一次修改还原############牛####查看提交记录 git-log # 找到倒数第2次提交的commitID6、git分支管理
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
6.1 查看本地分支
命令:git branch
6.2 创建本地分支
命令:git branch分支名
6.3 *切换分支(checkout)
命令:git checkout 分支名
我们还可以直接切换到一个不存在的分支(创建并切换)
命令:git checkout -b 分支名
6.4 合并分支
一个分支的提交可以合并到另一个分支
命令:git merge 分支名称
6.5 删除分支
不能删除当前分支,只能删除其他分支
git branch -d b1删除分支时,需要做各种检查
git branch -D b1不做任何检查,强制删除
6.6 解决分支冲突
决冲突步骤如下: 当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下:
1.处理文件中冲突的地方
2.将解决完冲突的文件加入暂存区(add)
3.提交到仓库(commit)
冲突部分的内容处理如下所示:
6.7 开发中分支使用原则与流程
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。在开发中,一般有如下分支使用原则与流程:
master(生产)分支 线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;
develop(开发)分支 是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。
feature/xxxx分支 从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并develop分支。
hotfix/xxxx分支, 从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支。 还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等等。
7、git远程仓库
7.1 常用的托管服务[远程仓库]
前面我们已经知道了Git中存在两种类型的仓库,即本地仓库和远程仓库。 那么我们如何搭建Git远程仓库呢? 我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。 gitHub(地址: https://github.com/)是一个面向开源及私有软件项目的托管平台, 因为只支持Git 作为唯一的版本库格式进行托管 ,故名gitHub 码云(地址:https://gitee.com/)是国内的一个代码托管平台,由于服务器在国内, 所以相比于GitHub,码云速度会更快 GitLab (地址:https://about.gitlab.com/)是一个用于仓库管理系统的开源项目, 使用Git作为代码管理工具,并在此基础上搭建起来的web服务, 一般用于在企业、学校等内部网络搭建git私服。7.2 远程仓库添加/查看/推送
添加远程仓库(origin仓库名)
git remote add origin 远程仓库地址查看远程仓库
git remote推送到远程仓库(master远程仓库分支)
git push --set-upstream origin master:master命令:git push [-f] [--set-upstream] [远端名称 [本地分支名] [:远端分支名] ]。
如果远程分支名和本地分支名称相同,则可以只写本地分支
git push origin master:master 将本地的仓库的master分支推送到远程origin仓库的master分分支
--set-upstream 推送到远端的同时并且建立起和远端分支的关联关系。
git push --set-upstream origin master
如果当前分支已经和远端分支关联,则可以省略分支名和远端名。
git push 将master分支推送到已关联的远端分支。
-f 强制覆盖远程分支
查看本地分支和远程分支的对应关系
git branch -vv7.3 从远程仓库中抓取和拉取
远程分支和本地的分支一样,我们可以进行merge操作,只是需要先把远端仓库里的更新都下载到本地,再进行操作。
抓取命令:git fetch [remote name] [branch name]。
抓取指令就是将仓库里的更新都抓取到本地,不会进行合并。
如果不指定远端名称和分支名[则抓取所有分支]。
拉取命令:git pull [remote name] [branch name]
拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge
如果不指定远端名称和分支名,则抓取所有并更新当前分支。
在test01这个本地仓库进行一次提交并推送到远程仓库
7.4 解决远程合并冲突
在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。
A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分支,如下图所示。
在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲突。
远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同,在此不再赘述,需要学员自己练习。
推荐一个零声教育学习教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:链接