这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。学习Git的基本知识,将项目代码管理在github上,实现多人合作开发项目。
一、什么是Git?
1.版本控制
| 版本控制类型 | 代表性工具 | 解决的问题 |
|---|---|---|
| 本地版本控制 | RCS | 本地代码的版本控制 |
| 集中式版本控制 | SVN | 提供一个远端服务器来维护代码版本,本地不保存代码版本,解决多人写作问题 |
| 分布式版本控制 | Git | 每个仓库都能记录版本历史,解决只有一个服务器保存版本的问题 |
2.分布式版本控制
Git:
基本原理:1.每个库都存有完整的提交历史,可以直接在本地进行代码提交
2.每次提交都有完整的文件快照,而不是记录增量
3.通过Push等操作来完成和远端代码的同步
二、Git的使用
1.Git的安装与配置
1.1 安装
下载地址,双击安装。右键电脑目录,出现git相关选项即为安装成功。
备注:Git GUI:Git提供的图形界面工具
Git Bash:Git提供的命令行工具
1.2设置用户信息
打开Git Bash,设置用户信息,每次Git提交都会使用该用户信息,以标识此次操作(如提交代码)是哪位用户提供的,也即对项目做出修改时,声明是谁做出的修改(用户名)以及联系方式(邮箱):
git config --global user.name “itcast”
git config --global user.email “hello@163.com”
#注:config --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。
#查看配置信息
git config --global user.name
git config --global user.emai
备注:此用户名和邮箱与代码托管网站的用户名和邮箱可以不同。
1.3配置远程连接
以github为例,先注册github账号。由于我们的本地Git仓库和github仓库之间的传输是通过SSH加密的,所以需要一点设置。
在设置之前,我们先理解为什么需要SSH秘钥。
从代码托管网站的角度来说,我们注册的时候,提供了我们邮箱,用户名,并设定了密码,因此代码托管网站只能通过用户名口令来认证是否真的是我们这个账户的拥有者在操作。所以,如果用https的方式,就不用产生什么密钥对了,但是,每次都输入密码,不方便。
SSH方式,本地产生密钥对,然后把公钥加入到代码托管网站的秘钥允许列表里面。这样操作,网站承认这样一个事实:用这个密钥对访问我,等同于提供了密码。密钥对保存在某台机器上,这样从这台机器上访问网站就不需要密码了,因为这台机器上能找到秘钥来替代口令进行认证。
对于公钥私钥,目前的Key的类型有4种,分别是dsa,rsa,ecdsa,ed25519,目前默认使用的是rsa。由于安全问题,最新版的windows不允许使用dsa和rsa,优先推荐使用ed25519.
第一步,生成本地SSH公钥。右键此电脑的文件夹,打开git bash:
ssh-keygen -t rsa -C "name@email.com"
#将rsa改成其他即可改用其他方式
#-C参数,给产生的秘钥对加一个注释
秘钥默认存放路径在C盘用户文件夹下的.ssh中。其中,id_rsa是私钥,id_rsa.pub是公钥。
第二步,将生成的公钥加入github的SSH and GPG keys
打开id_rsa.pub,复制粘贴到github ssh key中。
2.Git仓库
2.1本地仓库
或称之为版本库,repository。可以简单的理解为一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。
2.1.1初始化
右键打开git bash,输入git init,即可初始化一个项目。
参数:
--init-branch #初始化的分支
--bare #创建一个裸仓库(纯Git目录,没有工作目录),在服务器上一般加此参数,本地一般直接git init即可
--template #可以通过模板来创建预先构建好的自定义git目录
2.1.2 git目录
初始化后,.git目录即为仓库/版本库。里面有如下文件或者文件夹:
HEAD:指明了本地的分支结果,如果本地分支时master,那么HEAD就指向master
Config:配置文件
hooks:实现的功能是与响应git动作相关
objects :文件信息
refs:分支信息
2.2远程仓库
github新建仓库(remote repository),按步骤添加,填写相关信息即可。
2.3关联
将本地创建的仓库和远程的仓库进行关联,在本地的仓库执行:
git remote add origin address
#address可以去github复制,包括ssh和https
然后就可以使两个仓库同步,执行push等命令。
3.版本控制
在步骤2中创建好仓库之后,就可以开始实际的工作。
3.1修改文件、提交
3.1.1添加文件
把文件添加到版本库中。需要明确的是,所有的版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成2kb,但是到底改了啥,版本控制也不知道。
3.1.2 git add
添加文件后,git add xxx,将文件添加到暂存区。
3.1.3 git commit
提交:git commit -m xxx,告诉Git,文件提交到仓库。
使用 git status命令查看是否还有文件未提交。
若修改未提交,可以用git diff xxx 命令查看做了什么修改。
3.2版本回退
git log命令显示从最近到最远的显示日志>
git reset --hard:版本回退操作
#回退到上一版本
git reset --hard HEAD^
#回退到上上版本
git reset --hard HEAD^^
#以此类推...
#回退到前100个版本
git reset --hard HEAD~100
回退或恢复到指定版本:
#查看版本号对应的操作
git reflog
#指定版本
git reset --hard 版本号
4.常用命令
-
clone(克隆): 从远程仓库中克隆代码到本地仓库
-
checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
-
add(添加): 在提交前先将代码提交到暂存区
-
commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
-
fetch (抓取) : 将远端某些分支最新代码拉取到本地,不进行任何的合并动作,一般操作比较少。
-
pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于 fetch+merge,可能存在冲突
-
push(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
一般使用
git push origin master即可第一次推送master分支时,加上-u参数,
git push -u origin master,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
5.版本冲突
首先,可以试图用git push origin branch-name推送自己的修改,如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并。如果合并