在开发过程中,我们有时候会出现代码未保存或者丢失等情况,我们这时候就需要用一个对自己的代码进行版本管理控制的工具—Git,他的存在可以让我们在编程过程中对版本控制有更好的管理,并且,我们可以通过创建分支的形式在团队开发中进行合作编码,不会彼此影响,可以极大的提高在团队开发中的效率,这里也只是我在b站上学习对Git工具的一个基本使用介绍,但用于个人编码的使用,基本上没有什么打问题,希望对大家有用,如果有写的不对或者不好的地方,欢迎大家指正。
1、开始准备阶段
Git中的指令与Linux系统中的指令相同,在学习的时候大家可以先查看或者回顾一下Linux的一些常用的指令,以及其指令的作用。
windows系统需要右键选择Open Git Bash here,就可以打开Git的命令行,在开始使用Git之前,应该先配置用户名和邮箱。
git config --global user.name 名字(最好是用英文)
git config --global user.email 邮箱
省略(Local):本地配置,只对本地仓库生效 --global:全局配置,所有仓库生效 --system:系统配置,对所有用户生效(一般不会使用) 只需要执行一次就行
git config --global credential.helper store
这条命令是用来存储用户名和邮箱,以后就不用每次使用都输入了
git config --global --list
这条命令可以用来查看自己的配置信息
只有完成这些操作在提交时才能够识别是谁提交的内容。
2、新建版本库
版本库又叫仓库(Repository简称Repo),我们可以理解为是一个目录,这个目录可以管理所有项目的增删改查,对所有的增删改查都要有记录,以便对任何时候都能追踪历时或者还原到之前的某一个版本。
方式一:git init
从本地创建一个初始化的项目
mkdir learn-git 创建一个仓库
cd learn-git
git init 初始化仓库
ls -a 显示当前仓库下的所有文件,包括隐藏文件
cd .git 进入git文件
ls -al 查看文件中的所有内容
cd .. 返回上一级目录
\rm -rf .git 删除.git文件,删除.git文件之后learn-git目录就只是一个普通的目录不再是一个git仓库了
git init my-repo 在初始化仓库命令后面加上仓库名称就会在当前目录下创建my-repo的git仓库
方式二:git clone
从远程服务器克隆一个项目(后面会详细讲解)
git clone https://(仓库地址)
ls -ltr 可以查看当前仓库内的项目分支
3、Git的工作区域和文件状态
一、工作区域
Git本地数据管理分为工作区、暂存区、本地仓库。工作区就是自己电脑上资源管理器中的文件夹;暂存区是一种临时存储区域,用于爆粗即将提交到Git仓库的修改内容;本地仓库就是通过git init创建的仓库。当我们在工作区修改完内容之后,我们需要先将他提交到暂存区,然后再上传到本地仓库。
二、文件状态
相应的Git文件有几种状态,分别是未跟踪、未修改、已修改、已暂存。
4、添加和提交文件
在添加和提交文件前我们先查看仓库的状态。
git status
这条指令可以查看当前仓库处于哪个分支,有哪些文件以及这些文件处于在怎样的一个状态。
在这里我们先创建一个文件,这里我们使用的是echo命令
echo "这是一个文件!" > file.txt 这条指令表示将引号的内容输入到file.txt文件中,如果有这个文件就输入,没有这个文件就创建后输入
ls
cat file.txt 查看文件内容
git status 查看仓库的状态
接下来我们就要用git add命令把这个未被跟踪状态的文件放到暂存区内。
git add file.txt 添加文件到暂存区
git status 查看仓库状态
git rm --cached file.txt 将添加到暂存区的文件退回
git add . 将当前文件夹下的所有文件都添加到暂存区内,.表示的是当前目录
最后就是把暂存区的文件提交到本地仓库,注意提交的文件只能是放在暂存区的文件。
git commit -m "这是第一次提交" 这里的-m参数是用来指定提交信息的
git status
git log 查看当前分支的提交记录
5、版本退回
在开发项目的时候,我们经常会需要撤销之前的一些修改内容,或者回退到之前的一些版本,这时候我们就需要使用到git reset命令。git reset有三种模式,也就是三种不同类型的参数:
-
git reset --soft
--soft表示回退到某一个版本,并且保留工作区和暂存区的所有修改内容。
-
git reset --hard
--hard表示回退到某一个版本,并且丢弃工作区和暂存区的所有修改内容。
-
git reset --mixed
--mixed表示回退到某一个版本,只保留工作区的修改内容,而丢弃暂存区的修改内容,它是默认参数。
git init repo 初始化一个仓库
cd repo
echo 111 > file1.txt 创建文件
echo 111 > file2.txt
echo 111 > file3.txt
这里我们分三次添加提交,即重复下面代码三次
git add file1/2/3.txt
git commit -m "commit1/2/3"
git log --oneline 这里我们查看一下提交的日志,并且记录我们需要退回的版本编号
cd ..
cp -rf repo repo-soft 复制repo文件用于测试三种退回方式
cp -rf repo repo-hard
cp -rf repo repo-mixed
cd repo-soft
git reset --soft HEAD^(或者使用版本编号) 使用soft参数退回版本,HEAD^表示退回上一个版本
ls 查看工作区文件
git ls-files 查看暂存区文件
git status 这时候我们可以发现file是一个才添加到暂存区的文件
另外几个文件也如法炮制,其中,如果我们在操作中出现问题,需要返回操作时,我们可以使用git reflog命令退回到我们的前几个操作。
6、查看差异
git diff可以用来查看工作区、暂存区、本地仓库之间查看差异,还可以查看不同版本之间的差异,或者查看不同分支之间的差异。
git diff后面不加参数的话会默认比较的是工作区和暂存区的内容差异,它会显示发生更改的而文件以及更改的详细信息。
git diff 比较的是工作区与暂存区之间的差异
git diff HEAD 比较的是工作区和暂存区与本地仓库之间的差异
git diff --cached/git diff --staged 比较的是暂存区与本地仓库之间的差异
git diff <commit_hash> <commit_hash>/git diff HEAD~ HEAD 比较两次提交之间的差异
git diff <branch_name> <branch_name> 比较分支之间的差异
7、删除文件
一、直接删除
第一种方式是用最简单最粗暴的方式使用linux命令rm删除文件,也就是直接删除提交。
ls -ltr 查看文件目录
rm file1.txt 删除了file1.txt这个文件
ls 查看文件是否被删除
git status 查看仓库状态,这里我们可以看到我们需要把删除文件这个操作添加到暂存区中并提交这个操作才算是真正的完成
git ls-files 我们会发现暂存区中依然存在file1.txt,因此我们需要把删除操作更新到暂存区
git add .
git ls-files
二、rm删除
第二种方式是用git rm -f 命令把该文件从文件区和暂存区都删除。
git rm -f file2.txt
git status
ls
git ls-files
这样我们就把文件从暂存区和工作区中都删除了,最后不要忘记使用git commit -m 进行提交,这样才把删除操作提交到了仓库中。
8、.gitignore忽略文件
ignore是忽略的意思,这个文件的作用也就是可以让我们忽略掉一些不应该被加入到版本库中的文件,使用仓库体积更小更干净。
忽略日志文件和文件夹、所有.class文件、所有.o文件、所有.env文件、所有.zip和tar文件、所有.pem文件、系统或软件自动生成的文件、编译产生的中间文件和结果文件、运行时生成日志文件、缓存文件、临时文件、涉及身份、密码、口令、密钥等敏感信息文件
echo "some log" > access.log 我们先创建两个日志文件access和other
echo "other log" > other.log
git status
echo access.log > .gitigonre 这里我们创建.gitignore文件并且把access日志文放入进去
cat .gitignore 查看access日志是否放入,gitignore文件中
git status
git add . 把修改的内容全部添加到暂存区
git status
git commit -m "ignore file sample" 提交修改的内容
git status
git ls-files 查看提交后的文件目录
vi .gitignore 这里我们修改.gitignore文件,在结尾添加*.log表忽略所有以log结尾的文件
echo hello > hello.log 创建hello日志文件
git status 这里我们只能够看到.gitignore文件的修改,因为hello.log文件被忽略掉了
git commit -am "test ignore log" 这里我们再次提交
git ls-fiels
echo "modified" >> other.log 我们修改一下other.log文件
git status 这里可以看到other.log文件被修改
git diff 在diff中也可以看到他没有发生变化
.gitignore文件主要是让我们把一些敏感的内容忽略掉不上传到本地仓库里面,以免造成一些不必要的损失和问题。我们也可以在官网上找到一下常用的应该被忽略掉的文件的格式,可以用来直接使用。
9、远程仓库
我们常见的远程仓库有GItHub(国外)、Gitlab(国外)、gitee(码云)、coding、阿里云、京东托管平台这几个常见的远程仓库,这里我们需要注册一个GitHub的账户,大家注意GitHub网站时国外的网站,所以我们注册的时候需要使用加速器或者翻墙,这里就不做一一的演示了。
10、如何使用GitHub
我们登录我们上一节所注册的GitHub账号,我们可以在搜索框里搜素自己想要的仓库,然后点击你想要的仓库,然后右上角有code我们可以克隆或者下载这个仓库,右边会有一些概要信息。点击左上角的logo回到主页我们来自己创建一个仓库试一试,在主页中我们点击绿色按钮,创建一个新仓库,仓库名称为remote-repo,下面的描述是可选的,公共则表示所有人都可以看到你创建的这个仓库,而私人则是只有你自己可以看到这个仓库,另外初始化README文件是一个描述仓库内容的文件,其他的我们暂时不需要,就不用添加,直接点击创建即可。然后就会跳转到仓库的主页面,主页面上有相关的操作,让我们知道如何把本地仓库和这个远程仓库关联起来。
第一种方法
如果我们没有本地仓库的话,可以现在本地创建一个仓库,按照他给的命令把本地仓库和远程仓库关联起来。
echo "# remote-repo" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:xxxxxxxxxx
git push -u origin main
第二种方法
如果我们本地已经有一个仓库的话,按照他的命令把远程仓库给下载下来。
git remote add origin git@github.com:xxxxxxxxxx
git branch -M main
git push -u origin main
第三种方法
就是把其他项目中的代码导入进这个远程仓库。
我们要注意的是我们在把远程仓库关联上我们本地仓库时有HTTPS和SSH两种选项,HTTPS的方式我们在关联的时候需要验证用户名和密码,而SSH则不需要,但是需要在Github上添加SSH公钥的配置,这里我们推荐的是使用SSH的方式。
如何配置SSH密钥
这里我们演示的是window系统下的SSH密钥。
cd 我们首先要回到根目录
ssh localhost 免密码登录
cd ~/.ssh 进入.ssh目录
ssh-keygen -t rsa -b 4096 该命令用来生成SSH密钥,-t指定协议为rsa,-b指定生成密钥大小为4096
这里我们需要注意一下,如果是第一次使用这个命令的话直接回车就可以了,他会在我们用户目录下的.SSH目录下生成一个id_rsa的密钥文件,但是如果之前已经配置了,就不能直接回车,如果我们直接回车的话他会覆盖掉我们之前的密钥文件,而且这个操作是不可逆的,所以我们需要输入一个新的文件名test,然后回车,然后输入密码,这里我们就创建成功了。
ls -ltr 我们查看当前目录文件可以发现新增了两个文件id_rsa(私钥)和id_rsa.pub(公钥)
cat id_rsa.pub 这里我们打开公钥文件并复制公钥文件内容
回到GitHub页面,点击右上角头像,在弹出菜单里面找到设置,点击进入后可以看到SSH和GPG密钥的配置选项,在页面右侧有个新建SSH密钥的按钮,把刚刚复制的密钥复制到key内,添加一个标题,然后添加SSH密钥即可,这样我们就成功的把公钥添加到GitHub上了,但是如果是从新指定的一个新的文件名那么还需要增加一步配置。
touch config 这里我们需要创建一个config文件
vi config 编辑config文件,并把以下内容添加到里面
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/test 这段配置的意思是当我们在访问github.com时指定使用.ssh/test这个密钥
然后我回到本地仓库再来执行git clone命令。
git clone git@github.com:XXXXXXX
在其中我们会发现要我们输入密码,如果已经配置过了,就直接回车。
cd remote-repo 我们进入到这个仓库中
echo hello > hello.txt 创建一个新的文件并添加提交
git add .
git commit -m "first commit"
git ls-files 这时候我们可以看到本地仓库中已经存在了这个文件,但是并没有上传到远程仓库中去
这是我们需要把本地仓库的内容同步到远程仓库去。
git push 推送命令成功后就可以在远程仓库中看到这个文件
git pull 这个命令是把远程仓库修改的内容拉到本地仓库中来
接下来我们就把本地仓库关联到远程仓库中去,我们现在GitHub远程仓库里创建一个名为first-repo的仓库,可以看到里面的提示使用git remote add <shortname><url>,这里我们直接复制这段代码并粘贴到命令行中执行。
git remote add origin git@github.com:xxxxxxxx
git remote -v 用于查看我们当前远程仓库的别名和地址
git branch -M main 用于指定分支的名称
git push -u origin main:main 把本地main分支推送到远程仓库的main分支,如果连个分支名称相同写一个分支名称
当我们关联了两个或者两个以上的远程仓库时我们就需要注意在git push后要加上对应的远程仓库名称和分支。
11、分支
分支可以被看成代码库中的不同版本,可以独立存在,并且有自己的提交记录,分支比较适合团队合作和开发管理,比如多个开发人员可以在不同的分支上进行开发最后集合成一个完成的系统。
git branch 查看分支列表
git branch branch-name 创建分支
git checkout branch-name 切换分支
git switch branch-name 切换分支[推荐]
git merge branch-name 合并分支
git log --graph --oneline --decorate --all 查看分支图
git branch -d branch-name 删除分支[已合并]
git branch -D branch-name 删除分支[未合并]
在合并分支时,如果两个分支都修改了同一个文件或内容,git会不清楚要合并哪一条,这时候我们就需要解决合并产生的冲突。以下是在两个分支都对同一个文件进行修改的情况下的代码演示。
git branch feat 在这里我们创建一个新的分支
git switch feat 转换到我们新创建的分支中
ls
vi main1.txt 在新创建的分支中修改main1文件的内容
git commit -am "feat:1" 这里的-am表示添加提交一起执行
git switch main 然后我们转换到main分支中
ls
cat main1.txt 在这里我们可以看到main1文件中的内容没有发生改变
vi main1.txt 我们再再main1文件内容进行修改
git commit -am "main:6" 添加提交
git merge feat 这里我们把feat分支合并到main分支中会发现报错
git status 查看状态后发现两个分支对同一个文件都进行了修改
git diff 查看不同也会发现两个分支都对同一个文件进行了修改
vi main1.txt 这时我们就需要把合并后出错的main1的内容进行修改即可
git commit -am "merge conflict" 最后我们把合并的操作进行提交
git merge --abort 当不行继续合并错做时可以使用该命令来终止合并操作
除了merge可以把不同的分支整合到一起还有rebase命令也可以将不同的分支整合到一起,但rebase的整合方式和merge不同,merge整合相当于是把分支与main相连接且只能在main分支上进行,而rebase是可以在任意分支上执行,如果在main分支上执行则会将dev分支整合到main分支的后面,如果在dev分支上执行则会将main分支在dev分支之后的部分会被衔接到dev分支的后面,在图解上看就像是把分支整合成为一条直线 。
git branch -d feat 这里我们先把之前的feat分支删除掉
git log --oneline --graph --decorate --all 查看分支图
(alias graph="git log --online --graph --decorate --all")
alias可以把命令用别名来表示,这里我们以后查看分支图就可以使用graph命令,这样缩短了命令行
git checkout -b dev