前言

安装
xml
git --version
sudo apt-get remove git -y #卸载
sudo apt-get install git -y
基本操作
创建本地仓库
xml
mkdir gitcode
git init
这个就可以创建本地仓库了
然后当前目录下就有一个.git的文件夹
配置本地仓库
就是配置用户的名称,和用户的email地址
在创建好仓库以后要做的事
bash
git config user.name "hyb"
git config user.name "[email protected]"
git config -l #给出所有的配置
git config --unset user.name #删除某个配置

bash
git config --global user.name "aaa"
git config --global user.email "[email protected]"
因为一个机器可以有很多的本地仓库,加了--global意思就是给所有的仓库都配置,要不默认就是给当前目录配置
bash
git config --unset user.name

加了--global的不能重置
bash
git config --global --unset user.name
这样就可以全局重置了
认识工作区,暂存区,版本库
bash
touch ReadMe

当前git不能管理ReadMe
因为真正的本地仓库就是.git,也就是版本库
但是也不能放入.git文件
因为不允许更改.git
/gitcode是工作区
怎么管理工作区呢
这个就是工作区放入版本库的方式
修改的工作区内容会写入版本区中的对象库的一个新的git对象中
这个就可以维护版本管理
暂存区就是存入的修改的对象索引
master也是存的对象索引,分支的索引
添加文件
场景1
bash
vim ReadMe
git add ReadMe
#或者
git add .
git commit -m "添加的第一个文件"
bash
touch file1 file2
bash
git add file1 file2
git commit -m "添加的三个文件"
bash
git log
显示提交记录
bash
git log --preetty=oneline
打印一行
查看.git文件

index就是暂存区
这个就是对象
bash
git cat-file -p commitId

这个可以查看对象
场景2
bash
touch file4
git add file4
touch file5
git commit -m "add"

这样只会提交一个
因为只add了一个
修改文件
新增,修改,删除都是对工作区的修改
git追踪的管理的是修改,不是文件
bash
vim ReadMe
git status

这个意思是暂存区里面没有内容,修改在工作区
bash
git diff ReadMe
这个就是显示工作区与暂存区的区别

a是改动前,b是改动后
bash
git add ReadMe
git status
git commint -m "修改"
版本回退
bash
git reset [--soft | --mixed | --hard] [HEAD]

第二行是刚刚增加的,怎么回退?
ReadMe有两个版本
reset 本质回退版本库中的内容

mixed是默认选项
所以我们看出hard三个区都会回退
那么新的再也不见了
bash
git log --pretty=oneline #可以查看到commitID
git reset --hard commitID

bash
la

file文件全部都不见了,因为都回退完了,回退到只有一行的这个区间,也添加了file文件
所以一起回退了
这样就回退成功了
怎么反回退呢
bash
git reset --hard commitID
直接回退到那个id就可以了
但是没有记录上id的话

回退的话,就不见了
就不能反回退了
git reflog就可以,这个可以记录回退指令
这个是一部分的id,这样就可以找到id了
git reset --hard id
找不到id就没有后悔药了
回退只是把master的指向不同的comintid而已
撤销修改情况1
如果我们在我们的⼯作区写了很⻓时间代码,越写越写不下去,觉得⾃⼰写的实在是垃圾,想恢复到上⼀个版本

bash
git checkout -- ReadMe

git checkout -- ReadMe就是回退到上一个状态,针对工作区
情况2
这个就要用git reset了
就是把工作区和暂存区回退到版本库的当前版本,因为版本库没有修改的,就是上一次的
我们可以用--hard,所有都回退,或者--mixed(默认),这样就变成了情况1
bash
# HEAD是回退到当前版本,就是版本库中的版本,HEAD^是回退到上一个版本,HEAD^^回退到上两个版本
git reset HEAD ReadMe #只回退这个文件

这样就回退情况1了
然后
bash
git checkout -- ReadMe
情况3
这个就是回退到上一个版本
git reset --hard
前提条件,comit之后没有push

目的是为了不影响远程仓库的代码
bash
vim
git add ReadMe
git commit -m ""
git reset --hard HEAD^ #回退到上一个版本
git status
cat ReadMe
删除文件
就是删除版本库中的文件
bash
rm file5
git add file5
git commit -m "删除file5"

上面的操作可以简化为两步
git rm 就是删除工作区,和暂存区
bash
git rm file4
git status
git commit -m "删除file4"
分支管理
Git 分支管理__创建、切换、合并分支初体验
bash
git branch #打印本地所有的分支
master是主分支,一直都存在的
head默认指向master分支,就是工作分支
head指向的分支,就是当前工作的分支
这个*的意思就是master正在工作
bash
git branch dev #创建dev分支

master还是工作分支
bash
cat .git/HEAD
就可以知道当前HEAD指向的分支

而master就是指向的最新的一次提交
dev也是指向的最新的一次提交
我们来让dev成为工作分支
bash
git checkout dev #切换分支
git branch
cat .git/HEAD

这样工作分支就变成了dev
vim readme
git add readme
git commit -m "aaaa"
git checkout master
git branch
cat readme
master的代码没有新的代码
dev有新的代码
现在开始合并dev和master分支
合并要在master分支上
bash
git checkout master
git merge dev
这样就合并好了
这个就是把master指向了dev的最新的一次提交
删除分支
但是不能在dev分支上删除dev,必须在其他分支上才可以
bash
git branch -d dev
git branch

合并冲突

bash
git branch dev1
git checkout dev1
bash
git checkout -b dev1 #等于上面两个命令
bash
git branch
vim readme
git add .
git status
git commit -m "aaaa"
bash
git checkout master
vim readme
git add .
git commit -m "aaa"

这样合并就会有冲突了
vim readme
后面四行就是冲突代码,这个要手动解决,因为已经都搞在文件中了
手动删除
修复完冲突后,还要提交一次
git status
git add .
git commit -m "aaa"

bash
git log --graph --abbrev-commit

这个就是主和从分支的提交记录,是时间线
红色是主分支
合并模式

以前合并的模式默认是Fast-Forward
bash
git log --graph --abbrev-commit

红色不一定就是master
Fast-Forward就是指向dev2最新的一次提交,问题是看不出来是merge还是正常提交
合并冲突的时候不是Fast-Forward模式,因为最后是master提交的
bash
git merge --no-ff -m "aaa" dev2
非Fast-Forward模式就是--no-ff,最终master指向的是master新的提交,就是 -m "aaa"
分支策略
bug分支
假如我们现在正在dev2 分⽀上进⾏开发,开发到⼀半,突然发现master 分⽀上⾯有bug,需要解决。在Git中,每个bug都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时⽀删除。

因为dev2是用来开发新需求的,不是解决bug的,所以要用新的分支解决bug
我们发现工作区的master的ReadMe自动就跟着别的分支修改而修改了
bash
git checkout dev2
git stash #将工作区里面的内容进行存储
tree .git

就是把工作区中的修改存入stash里面
但是不会把新建文件存入stash
bash
git checkout -b fix_bug
然后开始修复bug
git add .
git commit -m "aa"
git checkout master
git merge --no-ff -m "aaaaa"
这样就修改到了主分支了
git chackout dev2
cat readme
写的代码不见了,因为放入了存储区里面
怎么获取呢
git stash list
stash 里面存了什么
git stash pop
这样就恢复过来了
但是还是没有改bug呢
因为dev2就是基于bug创建的分支
不影响master
开始提交
git add .
git commit -m "aaaa"
然后开始合并
但是会合并冲突呢
因为dev2没有解决bug
所以要人工解决冲突吗
这是bug呢,万一master还继续越改bug越多呢
我们可以先在dev2上合并主分支,这样就不会影响master了
dev2上解决合并冲突
git merge --no-ff -m "aaa" master

然后解决冲突
然后提交
git add .
git commit -m "aaaa"
然后切换到master合并dev2
git checkout master
git merge --no-ff -m "aaa" dev2
然后删除分支
git branch -d dev2 fix_bug
强制删除分支
就是没有在merge之前删除
bash
git branch -D
merge之后的删除分支
bash
git branch -d
bash
git checkout -b dev3
vim readme
git add .
git commit -m "aa"
git checkout master
git branch -d dev3 #报错
git branch -D dev3

远程操作
创建远程仓库
ReadMe文件就是写这个仓库的详细描述
点击issue,然后新建issue
就会这样了
就是把问题写在这里,让其他成员看到这些问题
然后创建

这个就是合并分支的申请
克隆远程仓库-HTTPS
git clone http地址


bash
git remote #查看远程仓库的默认名字
git remote -v #查看更详细

fetch是拉的操作
克隆远程仓库-SSH
码云------》设置--》SSH公钥
没有SSH的话,是不能git clone SSH的
先创建这个
第⼀步:创建SSHKey。在⽤⼾主⽬录下,看看有没有.ssh⽬录,如果有,再看看这个⽬录下有没有
id_rsa 和id_rsa.pub 这两个⽂件,如果已经有了,可直接跳到下⼀步。如果没有,需要创建SSHKey:

发现有.SSH目录
这个文件不是我们想要的
然后开始创建这两个文件
bash
ssh-keygen -t rsa -C "[email protected]"
这里的邮箱要和马文配置的邮箱一致

然后再进入ssh目录·查看,公钥和私钥
这个就是公钥,全部复制下来
这样就可以在码云上添加公钥了
然后就是克隆操作了
bash
git clone SSH

向远程仓库推送
和user.email
但是这个name和email都必须和码云一样

name就是@后面的内容
bash
git config --global user.name "hyb91"
git config --global user.email "xxxx"
bash
vim file.txt
git add .
git commit -m "aaa"
git push origin master:master #第一个是本地分支,第二个是远程分支
git push origin master #分支一样可以省略

拉取远程仓库
就是pull
就是让远程仓库领先于本地仓库就可以pull了
别人push了就可以领先了
还有就是远程仓库也可以修改文件(不允许)
bash
git pull origin master:master #拉取和合并
git pull origin master
忽视特殊文件
在⽇常开发中,我们有些⽂件不想或者不应该提交到远端,⽐如保存了数据库密码的配置⽂件,那怎么让Git知道呢?在Git⼯作区的根⽬录下创建⼀个特殊的名填进去,Git就会⾃动忽略这些⽂件了。不需要从头写.gitignore ⽂件,然后把要忽略的⽂件.gitignore ⽂件,gitee在创建仓库时就可以为我们⽣成,不过需要我们主动勾选⼀下

也可以自己在里面创建.gitignore文件
vi .gitignore
bash
# 可以直接写文件名
*.so
*.init

发现新的a.so文件没有显示
因为没有追踪,因为有.gitignore
bash
git add -f a.so #强制把忽略的文件提交,尽量不要使用这个
bash
# 可以直接写文件名
*.so
*.init
!b.so #这个的意思就是排除b.so,b.so可以提交
加上叹号,就是不忽略这个文件
bash
git check-ignore -v d.so
这个就是查看文件被忽略的原因
配置命令别名
比如给命令git status 取别名变为git st
bash
git config --global alias.st status
这样就可以了
bash
git config --global alias.lpa 'log --pretty=oneline --abbrev-commit'