日常开发中Git命令指北

Git基本操作

创建化仓库

mkdir 目录
cd 目录
git init

配置本地仓库

# 配置用户名,邮箱
git config user.name "cxf"
git config user.email "[email protected]"
# 查看本地配置(小写的 L)
git config -l
# 重置配置(如果出现多个值,则需要使用 --unset-all)
git config --unset user.name
git config --unset user.email
# 全局配置。一台服务器上可以创建多台本地仓库,当前机器所有git仓库都生效
git config --global user.name "cxf"
git config --global user.email "[email protected]"
# 查看日志
# git log
git log --pretty=oneline

添加/取消文件

# 添加单个文件到暂存区(索引)
git add xxx文件
# 添加多个文件到暂存区(索引)
git add xxx文件1 xxx文件2 xxx文件3
# 取消暂存区单个文件
git reset xxx文件1
# 取消暂存区多个文件
git reset xxx文件1 xxx文件2 xxx文件3
git commit -m "xxx信息"

查看 .git文件

tree .git/

日常开发中Git命令指北_第1张图片

cat .git/refs/heads/master

日常开发中Git命令指北_第2张图片

存储的就是索引

修改文件

# 查看状态
git status
# 比对前后内容差异
git diff xxx文件

日常开发中Git命令指北_第3张图片

diff --git a/ReadMe b/ReadMe(a代表改变前,b代表改变后)
— a/ReadMe(–代表之前)
+++ b/ReadMe(++代表之后)
@@ -1 +1,2 @@(-1:改变前的第一行,+1改变后的第一行开始,直到第二行结束)
hello git(原来的内容)
+hello word(修改后新增的内容)

版本回退

回退的是版本库的内容

  1. soft:回退版本库
  2. mixed:回退版本库,暂存区
  3. hard:回退版本库,暂存区和工作区
工作区 暂存区 版本库 本质是回退的版本库的内容
git world git world git git --soft
git world git git git --mixed(默认)
git git git git --hard(慎用)

可以根据版本ID进行回退

# 根据版本号回退
git reset --hard 版本ID
# 回退到当前版本
git reset --hard HEAD
# 回退到当前版本的上一个版本
git reset --hard HEAD^
# 回退到当前版本的上两个版本
git reset --hard HEAD^^

日常开发中Git命令指北_第4张图片
当回退之后版本号也就会跟着消失,如果回退错了想回退到回退之前版本可以使用 reflog

git reflog

日常开发中Git命令指北_第5张图片
我们再回退到已经回退的 hello world 版本
日常开发中Git命令指北_第6张图片

撤销修改

背景:开发三四天代码,但一直没有执行 add 操作。此时我们如果要回退的话,就需要将新增的代码进行删除。

前提是: commit 之后没有 push

git diff xxx文件

日常开发中Git命令指北_第7张图片
此时我们知道了绿色的字体就是我们新增的代码,但如果工程量很大的时候一行一行的删除代码会出BUG而且效率低下。
因此我们如果没有 add 操作可以使用 checkout 操作进行撤销更改

git checkout -- xxx文件

日常开发中Git命令指北_第8张图片

工作区自动回退到最近一次文件的修改
日常开发中Git命令指北_第9张图片
如果不加上 则会使切换分支或者检出特定的提交(也就是将某次commit的状态检出到工作区,即从head指向某个分支最近的一次commit,再从commit回到index,再从index恢复到工作区)

工作区 暂存区 版本库 解决方式
xxx code 1.不推荐手动撤销 2.推荐checkout
xxx code xxx code git reset
xxx code xxx code xxx code git reset

删除文件

删除需要3步

# 删除文件
rm file3
# 添加到暂存区
git add file3
# 提交到版本库
git commit -m "del file3"

日常开发中Git命令指北_第10张图片
有一个优化的两步版本

git rm xxx
git commit -m "xxx"

在这里插入图片描述

Git分支管理

HEAD 可以指向其它分支

# 创建新分支
git branch xxx
# 查看本地仓库分支(*标记当前所在分支)
git branch(tree .git/refs/heads)
# 查看本地和远程仓库全部分支
git branch -a
# 切换分支
git checkout xxx
# 合并:在分支上完成一些修改之后再切换到主分支执行合并分支(master作为主分支,dev作为其它分支,那么就应该切换到master在进行合并dev分支)
git merge xxx
# dev分支被合并之后就可以删掉(如果当前在dev分支的话处于占用状态就无法删除)
git branch -d dev

每次合并之后主分支master将用dev分支提交的ID
日常开发中Git命令指北_第11张图片

合并冲突

日常开发中Git命令指北_第12张图片

# 创建并切换分支
git checkout -b dev1
# 查看分支
git branch
# 保存操作(.代表当前全部文件由于只修改了ReadMe,所以支队ReadMe有效果)
git add .
git commit -m "md ReadMe:bbb"
git checkout master
git merge dev1

然后就会出现以下错误
日常开发中Git命令指北_第13张图片
这个时候我们要手动处理,全保留或者删除部分。这里保存dev1分支内容
日常开发中Git命令指北_第14张图片
查看一下状态
日常开发中Git命令指北_第15张图片
我们就正常的进行 add和commit 操作之后我们看一下版本号发现最后一次提交的版本号就是我们的master版本号
日常开发中Git命令指北_第16张图片
日常开发中Git命令指北_第17张图片

# 查看分支信息
git log --graph --abbrev-commit

日常开发中Git命令指北_第18张图片

合并模式

在之前合并dev分支之后,历史记录也会跟着消失。此时我们就无法知道此时的代码到底是 merge 进来的还是 master 自己生成的。

# 合并分支
git merge dev2

日常开发中Git命令指北_第19张图片

# 合并分支(这确保了要合并的分支在提交历史中清晰可辨)
git merge --no-ff -m "merge dev2" dev2
# 查看历史纪录
git log --graph --abbrev-commit

日常开发中Git命令指北_第20张图片

BUG分支

背景:如果在 开发分支 上修改BUG,如果修出了更大的BUG则会对线上环境造成更大的影响,因此更好的方法是 新建分支进行修改BUG
日常开发中Git命令指北_第21张图片

# 在dev2分支上进行开发(需要修改dev2的BUG)
git branch -b dev2
# 将dev2工作区的内容剪切到stash中
git stash
# 切换到master主分支进行分支创建
git checkout master
# 在master分支上创建并选择fix_bug分支
git checkout -b fix_bug
# 切换到master主分支
git checkout master
# master合并fix_bug
git merge --no-ff -m "merge fix_bug" fix_bug
# master的BUG修复完毕再切换到dev2分支进行开发
git checkout dev2
# 查看stash存储的内容
git stash list
# 将stash空间里的代码恢复到dev2分支上
git stash pop
# dev2代码开发完成之后再进行提交
git add .
git commit -m "md ReadMe:Done"
# 将dev2新功能合并到master分支上【此时会出现问题,因为master分支上已经修复好了bug而dev2上的bug未修复又开发了新功能】
# 较好地解决方法就是:dev2先合并master分支,这样不会破坏主分支;在master合并dev2分支,这次合并分支就不会出现冲突
git merge --no-ff -m "merge master" master
# 切换到master分支
git checkout master
# 合并dev2分支
git merge --no-ff -m "merge dev2" dev2
# 删除不用的分支
git branch -d fev2 fix_bug

强制删除分支

# 删除分支【当commit提交之后就无法删除】
git branch -d xxx分支
# 强制删除分支【当commit提交之后依旧可以删除】
git branch -D xxx分支

Git远程操作

日常开发中Git命令指北_第22张图片

克隆远程仓库

HTTPS

日常开发中Git命令指北_第23张图片

# HTTPS 克隆下载
git clone https://gitee.com/chenxfwtbu/remote-gitcode.git
# 显示每个远程仓库和其地址
git remote -v

日常开发中Git命令指北_第24张图片
origin: 是远程仓库的默认名称。用于远程和本地仓库之间的推送或拉取,通过该名称就可以获取远程仓库地址
master: 是Git本地仓库默认分支的名称。master分支是最主要的分支,其它分支从master分支上派生。可以在master分支上合并,提交等操作以便管理员管理更新代码

SSH

配置 .ssh 目录下的私钥和公钥【非对称加密】
日常开发中Git命令指北_第25张图片

# rsa算法生成私钥【公钥保存在id_rsa.pub文件中】
ssh-keygen -t rsa -C "自己Gitee的邮箱地址"
# rsa生成一个4096位的密钥对
ssh-keygen -t rsa -b 4096 -C "自己Gitee的邮箱地址"
# ed25519算法生成私钥【公钥保存在id_ed25519.pub中】
ssh-keygen -t ed25519 -C "自己Gitee的邮箱地址"

如果对安全性没有别要求的话使用默认的 rsa算法 非对称加密也行,但 ed25519 算法可以更快的速度生成密钥对,咱用更少的存储空间并且提供和rsa算法相当的安全性,因此ed25519也用的越来越多

日常开发中Git命令指北_第26张图片
然后再复制粘贴生成的公钥到Gitee码云
日常开发中Git命令指北_第27张图片
在执行clone操作
日常开发中Git命令指北_第28张图片

# SSH 克隆仓库
git clone [email protected]:chenxfwtbu/remote-gitcode.git

向远程仓库推送

# 先查看本地仓库配置项
git config -l
# 先配置用户名和邮箱
git config user.name "chenxfwtbu"
git config user.email "[email protected]"

日常开发中Git命令指北_第29张图片
日常开发中Git命令指北_第30张图片

# 推送
git push 远程仓库名称 本地分支名称:远程分支名称
# 如果远程和本地仓库的主分支都一样的话可以省略掉 :master
git push origin master

日常开发中Git命令指北_第31张图片

拉取远程仓库

git pull 远程仓库名 远程分支名:本地分支名
# 如果远程和本地分支名一样的话可以省略
git pull origin master

日常开发中Git命令指北_第32张图片

pull:相当于拉取+合并

忽略特殊文件

在日常开发过程中有些文件不想或者不应该上传的远端【保存了数据库密码的文件】。可以在 Git工作区 目录下创建一个 .gitignore 文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
日常开发中Git命令指北_第33张图片

# 如果需要强制让某些文件添加需要加上 -f 参数(但一般不破坏.gitignore规则)
git add -f b.so
# 也可以把排除的文件名前加一个 !

日常开发中Git命令指北_第34张图片

# 当配置文件很多行的时候,可以查看被排出的原因【第三行的*.so将c.so排除在外】
git check-ignore -v d c.so

在这里插入图片描述

配置命令别名

# 将命令缩短进行简写
git config alias.缩写 "命令"

日常开发中Git命令指北_第35张图片

标签管理

标签 tag,可以简单理解为对某一次 commit 的一个表示,相当于起了个别名。

项目发布某个版本的时候,针对最后一次 commit 起一个 v1.0 这样的标签来识别里程碑的意义。相较于难记的 commit idtag 可以很好的让使用者快速回退到某个版本【域名和IP地址的关系】

操作标签

# 为最后一次commit打标签
git tag 标签
# 查看全部标签
git tag
# 为指定的一次提交打标签
git tag 标签 commit id
# 注释标签
git tag -a v0.8 -m "import tag:XXX" 
# 查看注释标签
git show 标签名
# 修改标签(不能直接修改,而是删除重建)
git tag -d 标签名

日常开发中Git命令指北_第36张图片

会将最后一次提交的commit id记录在标签v1.0的文件中

日常开发中Git命令指北_第37张图片

为指定的提交打标签
日常开发中Git命令指北_第38张图片

推送标签

日常开发中Git命令指北_第39张图片
在最开始,Gitee上没有标签,需要我们手动推送才可以

# 推送指定标签
git push 远程仓库名 标签名
# 推送全部标签
git push 远程仓库名 --tags

日常开发中Git命令指北_第40张图片
远程仓库中的标签删除建议在网页上操作
日常开发中Git命令指北_第41张图片
本地标签删除操作如下

# 删除指定标签
git tag -d 标签名
# 将删除的标签推送到远程
git push 远程仓库名 :标签名

日常开发中Git命令指北_第42张图片
日常开发中Git命令指北_第43张图片

多人协作

完成准备工作

日常开发中Git命令指北_第44张图片

# 拉取远程全部内容【之前是拉取远程的master主分支内容】
git pull

日常开发中Git命令指北_第45张图片
Ubuntu下开发者1

# 创建本地分支并和远程分支关联
git checkout -b 本地分支名称 远程仓库名/远程分支名
# 查看建立的连接
git branch -vv
# 开发者1aaa
vim file.txt
# 添加
git add .
# 提交
git commit -m "md fiile.txt:aaa"
# 推送(由于已经建立关联,也可以直接git push)
git push origin dev:dev

Win下开发者2

# 创建本地分支
git checkout -b dev
# 本地分支关联远程分支
git branch --set-upstream-to=origin/dev dev
# 开发者2bbb
vim file.txt
# 添加
git add .
# 提交
git commit -m "md filex.txt:bbb"
# 推送
git push origin dev:dev

日常开发中Git命令指北_第46张图片
发现抱错。原因:win下载的时候dev分支和远程origin/dev分支中,file.txt有差异导致的。因此我们需要 pull 一下:将远程分支的内容拉下来解决本地冲突之后再推送给远程

# 拉取远程全部内容而不是部分分支内容
git pull
# 手动修改一下file.txt文件即可
# 添加
git add .
# 提交
git commit -m "merge dev"

日常开发中Git命令指北_第47张图片
查看一下远程仓库,发现已经dev上两个开发者已经完成了代码的修改和发布
日常开发中Git命令指北_第48张图片

将内容合并进master

日常开发中Git命令指北_第49张图片

此时对于开发者1和2的功能还没有合并到master主分支。需要继续以下流程:

  1. PR合并申请单
  2. 管理员审批
  3. merge

日常开发中Git命令指北_第50张图片
日常开发中Git命令指北_第51张图片
日常开发中Git命令指北_第52张图片
开发者1和2谁merge都可以,这里我们就以开发者1来merge做模拟

# dev和master分支获取最新的远程仓库代码
git pull
# 为了防止遗漏,切换到master分支继续拉取一下
git checkout master
git pull
# 然后再切换到dev分支
git checkout dev
# dev分支合并master分支(git merge --no-ff -m "merge master" master报错原因:快进模式和非快进模式合并会无法合并)
git merge master
# 切换到master分支
git checkout master
# 合并dev分支
git merge dev
# 删除dev分支
git branch -d dev
# 推送
git push

最后总结一下流程

  1. git push 远程仓库名 分支名 推送自己的修改
  2. 如果推送失败,则因为远程分支比本地更新,需要先用 git pull 试图合并
  3. 如果合并有冲突,则解决冲突并在本地提交
  4. 没有冲突或者解决冲突后,再用 git push 远程仓库名 分支名 推送就能成功
  5. 功能开发完毕,将分支合并到 master 分支最后删除分支

案例2
这一套非常方便,不会有冲突。因此大多数一个功能一个分支
日常开发中Git命令指北_第53张图片
开发者1

# 本地创建分支
git checkout -b feature-1
# 开发function1
vim function1
git add .
git commit -m "add function1"
# 这里不关联,因为远程没有创建对应分支
git push origin feature-1
# 查看远程分支信息
git branch -a

开发者2

# 本地创建分支
git checkout -b feature-2
# 开发function1
vim function2
git add .
git commit -m "add function2"
# 这里不关联,因为远程没有创建对应分支
git push origin feature-2
# 查看远程分支信息
git branch -a

案例3
日常开发中Git命令指北_第54张图片
开发者1

# 获取feature-2分支
git pull
# 本地创建feature-2分支(上文中用的 --set-upstream-to=origin/dev关联的)
git checkout -b feature-2 origin/feature-2

git pull

1.拉取分支内的内容
2.拉取的仓库的内容

开发者2

# 先建立远程和本地分支的链接
git branch --set-upstream-to=origin/feature-2 feature-2
# 开发
# 添加
git add .
# 提交
git commit -m "md func2"

在这里插入图片描述

# 切换到master分支
git checkout master
# 拉取远程仓库
git pull
# 切换到feature-1
git checkout feature-1
# 合并master分支(为了预防冲突,不直接在master分支上合并)
git merge master

如果没有冲突就会跳出这个页面(ctr+x离开)
日常开发中Git命令指北_第55张图片
本地的feature-1分支没有关联远程分支
日常开发中Git命令指北_第56张图片

# 将本地分支链接远程分支(也可以直接推送对应分支信息就可以自动生成)
git push origin feature-1

日常开发中Git命令指北_第57张图片
我们最后远程仓库删除分支之后但是本地 git branch -a 依旧能够看到的解决办法
日常开发中Git命令指北_第58张图片
日常开发中Git命令指北_第59张图片

# 获取远程仓库信息
git remote show origin
# 修建仓库分支
git remote prune origin

日常开发中Git命令指北_第60张图片

你可能感兴趣的:(工具,git)