Git常见使用
基本操作
创建仓库
1.先创建一个文件,再进入到对应的文件夹中
# 创建文件
mkdir [file_name] # 进入该文件
cd [file_name]
2.创建对应的Git仓库(在对应的文件夹内)
# 创建对应的仓库
git init # 可以查看当前文件内的内容
ll file_name # 查看tree目录
tree .git/
配置本地仓库
必须要配置的配置项:
-
name
-
email
为了方便操作,推荐在初始化仓库之后就进行配置
# 配置
git config user.name "test"
git config user.email "12345@qq.com"# 查看当前仓库的所有配置项
git config -l# 重置配置
git config --unset user.name
git config --unset user.email
对于一台服务器来说,可以不只有一个仓库,加入 --global 可以让配置项对该服务器中的所有仓库进行配置
# 全局配置
git config --global user.name "test"
git config --global user.email "12345@qq.com"
需要注意的是: 使用 --global 来进行配置,不能使用普通重置
# 全局重置
git config --global --unset user.name
git config --global --unset user.email
维护/管理
管理的前提条件是将文件放入Git仓库,创建一个ReadMe来进行管理
# 在当前git仓库下
touch ReadMe # 这里会创建到工作区中
但是这样创建之后Git是无法管理ReadMe文件的,因为ReadMe存在的目录不是对应的本地仓库文件
.git/ 才是仓库,或者叫版本库
需要注意的是,不能将ReadMe文件放入 .git/ ,这个文件是不允许手动进行修改的,修改后可能会导致整个仓库报废
工作区 add 之后 加入版本库的暂存区,commit之后会上传到当前分支(树状结构,存储的都是对象的索引)
操作版本
需要提前注意的是,仓库对于文件的修改定义有多种:
-
新增
-
内容/文件名修改
-
删除
修改文件
# 上传文件到暂存区
git add [file_nmae]# 将当前仓库的所有被修改了的文件加入暂存区
git add .# 添加被忽略的文件,强制添加
git add -f [file_name]# 提交到对应分支,这里是直接将暂存区的全部文件都进行上传
git commit -m "当前提交的版本描述"
添加文件之后,我们可以看到 .git/ 文件也有一些变化: 生成了暂存区 index
# 查看结构
tree .git/
如果对文件进行了删除,那么也需要对删除的文件进行add之后再commit
同时也可以直接使用git的删除提交指令
# 这个语句是会在暂存区进行删除,所以还是要进行commit操作
git rm [file_name]# 提交到版本库
git commit -m "操作/版本描述"
版本回退
Git是我们用来管理版本的工具,那么我们要获取到当前文件的上一个版本,就需要进行回退操作
# 将版本库中的内容进行回退(不是工作区和暂存区)
# git reset [选项]
# 回退到 [commitID] 对应的版本节点# 只会回退版本库中的内容,不会改变工作区和暂存区
git reset --soft [commitID]# 回退版本库和暂存区 (这个是默认选项)
git reset --mixed [commitID]# 版本库、工作区、暂存区都会回退到上一版本(一般情况下不会使用)
git reset --hard [commitID]
针对某一个仓库,执行了回退操作之后,也可以对该次回退进行回退操作,即撤销回退操作(可以从reflog中获取commitID)
同时 reset 还可以回退到当前版本
# 回退到上一个版本
git reset HEAD# 回退到上一个版本
# 一个 ^ 代表一个版本
git reset HEAD^
撤销修改
如果对自己的代码感到不满意,就可以对修改的部分进行撤销
注意: 以下都是没有对远程仓库进行操作的
# 场景一: 没有进行add提交
# 必须要加 -- ,这个是代表使当前文件回到最近一次的add或者commit
git checkout -- [file_name] # 要进行撤销操作的文件名# 场景二: 进行了add,但是没有进行commit提交
git reset# 场景三: 进行了add和commit提交
git reset --hard [HEAD]# 回退到上一个版本
如果已经将代码推送到了远程仓库,直接使用以上的语句可能达不到想要的结果
标签管理
可以对某一次提交进行标识,仓库中,refs就会存储tag标签
# 先切换到想要打标签的分支上
git branch branch_master# 标记最新的一次提交
git tag [标签名]# 标记某次提交
git tag [标签名] commitID# 对标签进行描述
git tag -a [标签名] -m "描述" [commitID/没有就是最新版本]# 查看有哪些标签,这里的排序不是根据设计的时间来排序的,而是符号顺序
git tag# 查看标签描述
git show [标签名]# 删除标签
git tag -d [标签名]
分支管理
master就是一个分支(主分支)
创建分支
首先我们要知道,HEAD指向的分支就是我们工作的分支,也就是说,提交到的分支是由HEAD决定的
# 先查看当前分支
git branch# 创建本地分支 创建之后再查看,就可以看到当前分支的存在了
# 创建之后的新分支,会指向当前最新的提交
git branch branch_name
切换分支
切换分支之后,更新之后提交的代码就会上传到切换后的分支,而不是master分支,但是需要注意的是,提交的都还是在这个仓库里面的
# 切换到对应分支,这里的 checkout 不需要加 --
git checkout branch_name# 查看当前分支就可以看到我们进行了切换
# * 所在的分支就是当前操作分支
git branch# 创建并直接切换到分支
git checkout -b branch_name
合并分支
正常合并
合并分支的时候,一定要先切换到master分支
# 切换到master分支
git checkout master# 合并分支,输入被合并的分支名
git merge branch_name# 不使用fast-forword模式
git merge --no-ff -m "合并信息" [branch_name]
合并冲突
有些时候,在进行合并操作的时候,会合并失败,会返回信息显示我们的分支和master分支中有部分冲突
比如,当branch1需要合并到master,但是branch1对某一个文件的内容进行了修改,此时进行合并,就不知道要以master为准还是以branch1为准,这个时候就会提示有冲突
冲突需要手动解决!!! 推荐先合并到其他分支,不会出现冲突之后,再合并到master,这样就不会影响到master分支
进入冲突文件,删除不想保留的部分,进行二次提交
删除分支
不能在当前分支上删除当前分支
删除分支之后,合并的部分是不会被撤销的
# 切换分支
git checkout other_branch_name# 删除分支
git branch -d branch_name# 强行删除
git branch -D branch_name
BUG分支
当在线上运行某程序的时候,如果出现了BUG,一般就是master分支上的代码出现了问题,这个时候就需要通过分支管理来解决BUG
需要新建一个分支来处理BUG
# 将当前正在修改的分支的工作区内容进行保存(分支1)
git stash# 切换到master分支(因为是master分支出现了问题)
git checkout master# 创建并切换新分支
git checkout -b new_branch# 修改之后,对修改部分的代码进行提交
# 合并
git checkout master
git merge --no-ff -m "提交信息" new_branch# 恢复之前正在修改的工作区,继续之前的工作
git checkout branch1
git stash pop
远程操作
克隆仓库
HTTP协议
不能在任意一个本地已存在仓库目录下进行克隆!克隆之后本地就会出现这个仓库
克隆之后就会将远程仓库的内容拉取到本地
# 仓库克隆
git clone [HTTP协议]# 查看远程仓库
git remote # origin是默认名# 查看本地仓库权限
git remote -v # push代表推送,fetch代表拉取
推送
实际上是分支和分支之间的交互
# 先在本地进行提交
git add file_name
git commit -m "提交版本信息"# 推送到远程分支
git push origin [本地仓库分支]:[推送到的远程仓库分支]
# 远程分支和本地分支一致,可以省略部分,master分支
git push origin master
拉取
远程仓库内容版本高于本地仓库,本地就需要获取到最新的版本
# 拉取远程分支
git pull origin [远程仓库分支]:[拉取到的本地仓库分支]
# master分支
git pull origin master
远程标签
推送之前,我们要先在本地创建标签
# 推送特定标签
git push origin [标签名] # 推送所有标签
git push origin --tags# 删除标签
git push origin :[远程的标签名]
其他操作
打印日志
1.输出提交日志
# 输出素有日志
git log# 让日志浓缩成一行来进行输出(主要信息)
git log --pretty=oneline# 可视化分支路线(颜色只是为了区分不同的分支)
git log --graph --abbrev-commit
2.记录本地每次提交
git reflog
查看仓库
查看仓库状态
这个语句会输出当前所在仓库以及分支,同时会将修改但没有上传的文件列出来
没有上传到暂存区的文件标红,上传到暂存区但是没有上传到分支的文件标绿
git status
查看差异
# 显示当前工作区和暂存区之间的差异
git diff [file_name]# 显示版本库和工作区文件的差异
git diff HEAD -- [file_name]
查看分支/指向
# 查看当前head指向的分支
cat .git/HEAD# 查看master信息 对应的是最新的commitID
cat .git/refs/heads/master
查看git对象内容
注意:每一次提交都会有一个 commitID ,文件和 commitID 是一对多的关系
git cat-file -pv [commitID] # commitID 就是提交到分支的对应编码# 查看当前树的所有已提交文件
git cat-file -p [treeID]# 查看对应提交做了哪些修改
git cat-file -p [commitID]