一,git的安装
mac电脑的安装
xcode-select --install
windows安装,用指令麻烦一些
随便找个视频观看看教程,去官网下载就可以了。
centos安装
sudo yum install git -y
ubuntu安装
sudo apt-get install git -y
查看git安装的版本
git --version
二,git的基本概念
工作区:是在电脑上你要写代码或⽂件的⽬录
暂存区(stage / index):add之后的代码会放在这里
版本库(repository):存放已经commit的过的代码,然后形成一个版本
HEAD:指向分支,分支就是当前在工作的分支
远程主机名默认为:origin
三,git的基本操作
cd到想要建立仓库的文件夹里面去,然后输入指令创建仓库
git init
设置用户名
git config --global user.name "输入你的用户名字"
设置邮箱地址
git config --global user.email "输入你的邮箱地址"
其中上面两个指令 --global 是⼀个可选项。如果使⽤了该选项,表⽰这台机器上所有的 Git 仓库都会使⽤这个配置。如果你希望在不同仓库中使⽤不同的 name 或 e-mail ,可以不要 --global 选项,但要注意的是,执⾏命令时必须要在仓库⾥。
查看配置的用户名和邮箱
git config -l
删除用户名和邮箱
git config [--global] --unset user.name git config [--global] --unset user.email
如果添加时加了 --global ,则删除的时候也要加。
添加文件到暂存区
git add 文件名1 文件名2 ... //添加一个或多个 git add . //添加当前⽬录下的所有⽂件改动到暂存区:
将暂存区内容添加到本地仓库中
git commit -m "描述本次提交" //提交暂存区全部内容到本地仓库中 git commit 文件名1 文件名2 ... -m "描述本次提交" //提交暂存区的指定⽂件到仓库区:
打印提交日志
git log //可以加上 --pretty=oneline 就可以让每次提交都只打印一行
在.git文件里面查看文件
git cat-file -p commit的id
查看在你上次提交之后是否有对⽂件进⾏再次修改:修改是对于工作区和暂存区是否相同,如果是修改过的文件名会被打印出来
git status
这段指令是上一个指令中如果被修改了,用这段指令可以查看修改了哪些内容:查看暂存区和工作区的差异
git diff 文件名//这个是扩展,如果查看版本库和⼯作区⽂件的区别 git diff HEAD -- 文件名
查看HEAD指针的移动历史
git reflog
版本回退
git reset [--soft | --mixed | --hard] [HEAD]
每个选项的讲解
--soft: 参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
--mixed: 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。
--hard: 参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
HEAD:三种写法
1. HEAD 表⽰当前版本 ,HEAD^^ 上上⼀个版本
2. HEAD~0 表⽰当前版本,HEAD~2 上上⼀个版本
3. 写成版本号,就是 git log 打印的版本号 ,或者是 git reflog 打印的内容。
撤销修改
情况一:对于⼯作区的代码,还没有 add
git checkout -- 要撤销的文件名
情况⼆:已经 add ,但没有 commit
方法1:
//先输入 git reset HEAD 文件名 //在输入 git checkout -- 文件名
方法2:
git reset --hard HEAD 文件名
情况三:已经 add ,并且也 commit 了
前提条件是cmmit之后没有push操作
git reset --hard HEAD^
删除版本库的文件
方法1:
//第一步 rm 文件名 //第二步 git add 文件名 //第三步 git commit -m “描述内容”
方法2:
//第一步,在工作区和缓存区删除文件,然后接下来在提交到版本库 git rm 文件名 //第二步 git commit -m “描述内容”
四,分支管理
查看所有的分支
git branch
创建一个分支名为branch_name的分支
git branch branch_name
切换到名为branch_name的分支
git checkout branch_name
创建并切换到branch_name的分支
git checkout -b branch_name
合并冲突:
原因:分支出去的内容被改变,且原支路也被改变,所以造成了合并冲突
处理方法:merge冲突,需要手动解决,并进行一次性提交
注意:提交非常的重要
Fast-forward模式:在合并的时候没有合并冲突
非Fast-forward模式:在合并的时候有合并冲突
将分支branch_name合并到当前分支:合并后分支还在
git merge branch_name
如果写成这样:意思是如果是Fast-forward模式的merge,也会在用git log --graph --abbrev-commit也会画出分支图来,如果不加就是跟普通提交一样,都会显示是在一条主线上面提交一次代码。
git merge --no-ff -m "描述这次提交" branch_name
因为在合并冲突这个场景下:也需要再提交一次,所以需要添加-m "描述这次提交"。
删除本地仓库的branch_name分支:注意只能在其他的分支上删除branch_name分支
git branch -d branch_name //注意这里只有merge之后的分支才可以这样删除
用图画出git的管理过程:可以清楚的看见git分支合并的过程
git log --graph --abbrev-commit
bug分支
这里我们把在开发代码的分支叫做:kaifacode
把修复bug的分支叫做:dbug
意思是如果在开发中已经在新建立的分支上面已经在工作区写了一段代码了,这时候主版本出现了bug,这时候我们建议新建立一个分支去解决bug,然后bug改完然后合并到主版本里面,如果新开发的代码已经写完了,需要合并,这时候直接把新开发的代码合并到主分支会产生合并冲突,所以这里建议不要直接把代码合并到主分支,先把主分支的代码合并到开发的分支里面来,然后再把合并的代码合并到主分支。
上面的解决方案中我们显然遇到了一个问题,我们在kaifacode写代码是写在工作区的,我们这时也没有提交代码,但是我们这个时候要回去修复主分支里面的bug,这时候工作区又有代码,所以我们需要储存这段代码,然后在新的分支修复bug
git stash
然后我们这个时候我们用 git status 指令看工作区就是干净的了,然后我们就去修复bug即可,修复完之后,我们需要恢复之前的之前在工作区开发的新代码,在恢复新代码之前我们先看下面这条指令
git stash list
这时候我们就可以看见我们用 git stash指令储存的代码了
恢复原本已经开发好的代码用下面这条指令:意思是恢复的同时会把 stash 也删了
git stash pop
下面的这段指令进行恢复,但是恢复代码并不会删除stash的内容
git stash apply
我们还要继续删除stash的内容的话,我们的就要执行下面的一段指令
git stash drop
我们都恢复完之后就可以接着写代码了
强制删除分支:如果我们在开发的过程中建立了一个新的分支,但是这时候突然不想要这个分支了, 我们是无法用之前删除分支的指令进行删除这个分支的,我们要用强制删除分支的指令如下
git branch -D branch_name
删除分支名为branch_name的分支
五,远程操作
把远程仓库克隆到本地来(注意不要再任意的本地仓库里面执行这条命令)
git clone 仓库的网络地址
查看远程仓库的一些信息,并且还有我们自己的权限是否能推送和拉取代码
git remote -v
把本地的代码推送到远程仓库
git push <远程主机名> <本地分⽀名>:<远程分⽀名>
# 如果本地分⽀名与远程分⽀名相同,则可以省略冒号:
git push <远程主机名> <本地分⽀名>
如果远程仓库已经被别人修改,我们这时候需要用这条指令来拉取远层仓库的代码
git pull <远程主机名> <远程分⽀名>:<本地分⽀名>
# 如果远程分⽀是与当前分⽀合并,则冒号后⾯的部分可以省略。
git pull <远程主机名> <远程分⽀名>
如果远程仓库没有这个分支,我们本地新建立了一个分支,可以把这个分支推送到远程仓库。(注意这样推送过去的分支,好像和本地的分支不会建立连接)
git push origin 要推送的分支名 //和上面的一样,只是少了远程仓库的分支名
忽略文件:.gitignore
我们可以创建一个忽略文件可以让git不追踪我们不需要维护的文件
文件的内容格式这样写:
1. # 代表注释
2. *.os 代表以os结尾的文件不能被追踪
3. !a.os 代表 a.os文件不需要被忽略,所以!表示不能被忽略的文件
强制推送:因为我们可能有想add的文件字母结尾已经在gitignore文件里面被忽略,但是我们又想把文件add进入缓存区,这时候我们就需要用到强制添加了,指令如下
git add -f 文件名
检查gitignore文件:如果我们要添加文件的时候可能add不了,这时候可能是 .gitignore 写得有问题,需要找出来到底哪个规则写错了,⽐如说 a.so ⽂件是要被添加的,可以⽤下面的命令检查
git check-ignore -v 文件名
然后文件名记得写上后缀示例:git check-ignore -v a.so
如果回显 .gitignore:3:*.so a.so 代表在gitignore文件的第三行出现了*.so使a.so文件不能被添加。
六,标签管理
可以更好的用于版本的管理
查看有哪些标签
git tag
切换到需要打标签的分⽀上,给最近提交的版本添加标签
git tag 标签名
给之前提交的版本打标签
我们要找到之前commit的id值,先用 git log --pretty=online --abbrev-commit 找到commit的id值
在用下面的指令打标签
git tag 标签名字 索引值
打标签的时候并添加上描述
git tag -a 标签名 -m “描述的内容” 要打标签的索引(这个选项不加的话就选择的是最近一次提交的版本)
查看打标签的版本的内容
git show 标签名
删除打的标签
git tag -d 标签名
把标签名推送到远程仓库
git push 远程主机名 要推送的标签名
推送所有的标签名进入远程仓库
git push 远程主机名 --tags
在远程仓库删除标签
先正常用上面的指令在本地删除
然后在用下面的指令
git push 远程主机名 :删除的标签名
注意上面的‘ : ’ 必须要写,因为:的前面是本地的标签的意思:后面代表远程的标签
七,多人协作
场景1:
条件:在一个分支上协作完成
先在远程仓库上建立一个分支,一台机器在这个分支添加一段代码,另一台机器也在这个分支添加一段代码。
我们可以先用 git branch 查看本地的分支,然后在用 git branch -r 指令查看在本地的在远程仓库的的分支,先把远程仓库克隆到本地,然后我们在远程仓库中创建新的分支,在拉取到本地来就可以了
git pull //这里可以直接拉取,是因为我们是克隆的仓库,远程的master和本地的master分支 已经建立了连接所以我们这里后面不在需要跟一些配置信息
我们在把远程的分支添加到本地来:就是本地仓库和远程仓库建立连接
git checkout -b 建立的分支名 origin/dev(对应的远程仓库的分支)
我们可以查看本地的分支和远程的分支分别有哪些
git branch -a
查看本地仓库和远程仓库是怎么建立连接的
git branch -vv
小知识点:建立过连接的分支就可以直接用短命令了如:git push,git pull
如果已经建立好了本地的分支,这时候我们可以把这个分支与远程仓库建立连接
git branch --set-upstream-to=origin/dev 本地的分支名 // 远程主机名/远程分支名
如果远程仓库已经被修改了,本地也已经commit了一次,这时候需要先pull一次,然后有冲突解决冲突,然后就可以推送到远程仓库即可。
远程分⽀删除后,本地 git branch -a 依然能看到的解决办法
当前我们已经删除了远程的⼏个分⽀,使⽤ git branch -a 命令可以查看所有本地分⽀和远程分⽀,但发现很多在远程仓库已经删除的分⽀在本地依然可以看到。
git remote show origin //可以查看remote地址,远程分⽀,还有本地分⽀与之相 对应关系等信息。
然后根据我们上面的指令打印出来的内容的提示,输入以下指令,我们可以在本地的远程仓库实现删除gitee(远程仓库) 上面已经删除的分支
git remote prune 远程主机名 //这样就删除了那些远程仓库不存在的分⽀
然后本地仓库里面要删除分支前面已经讲过了。