Git命令记录

初始化本地仓库

git init
#执行完该命令之后会创建一个.git目录,该目录中包含了配置文件等内容;
#注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改,否则本地库就不能正常工作了。

设置签名

#形式:用户名和email地址
#email地址随意就可以,作用是区分不同开发人员的身份
#辨析:这里的email和登录gitee或GitHub的账号密码没有任何关系

---通过参数可以区分成两个级别---
#项目(仓库)级别:仅在当前本地库范围内有效
git config #不带参数是项目级别的
#系统用户级别:登录windows系统(操作系统)的用户,对该系统中的项目都有效
git config --global #带global是设置全局系统级别

#如果都设置了,则使用项目级别的签名,如果项目级别没设置,就以系统级别为准。
#如果都没有,是不允许的,提交的时候会出错

#例子
git config user.name andy
git config user.email andy@ex.com
#项目级别的保存在当前项目的.git目录下的config文件中

git config --global user.name andy
git config --global user.email andy@ex.com
#系统级别的保存在家目录~(C:/Users/用户名)的.gitconfig文件中

查看工作区、暂存区的状态

git status
#On branch master:当前所在分支为主分支
#No commits yet:还没有任何的提交;指的是本地库
#nothing to commit (create/copy files and use "git add" to track):也没有什么可提交的;指的是暂存区
#Untracked files:(use "git add <file>..." to include in what will be committed);可以使用git add 文件名提交到暂存区
#nothing added to commit but untracked files present (use "git add" to track):没有往暂存区提交,当时是未追踪的文件存在

从工作区提交到暂存区

git add [文件名]
#将文件的新建/修改添加到暂存区

从暂存区删除

git rm --cached [文件名]

从暂存区提交到本地库

git commit [文件名]
#会进入vim编辑器并提示输入commit message,相当于写一下注释,这次提交了什么东西,什么内容。
#输入:set nu可以显示行号
#按i键进入输入模式进行编辑即可
#如果不项打开编辑器,也可以使用下面的命令
git commit -m "这里是commit message" [文件名]
#如果是新创建的文件,必须先执行git add命令再执行git commit命令
#如果是对已有的文件进行修改,可以不add,直接commit,但是不能够撤销了

查看版本的历史纪录

git log #显示的最完整的形式
#多屏显示控制方式:
    #空格向下翻页
    #b向上翻页
    #q退出

git log --pretty=oneline #每条日志只显示一行
git log --oneline #哈希值只显示一部分,只显示过去的历史记录

git reflog #比--oneline多了一些信息(HEAD指针到对应版本需要移动的次数),对于前进后退移动指针具有参考价值。过去和未来的历史纪录都显示

版本的前进或后退

#本质就是HEAD指针的移动

(1)基于索引值操作(推荐)
#先git reflog查看一下
git reset --hard [哈希索引值]

(2)基于^符号
#异或符号只能往后退,不能往前
git reset --hard HEAD^ #后退一步
git reset --hard HEAD^^^ #后退三步

(3)基于~符号
#用于取代很多个^符号的时候,也是只能后退
git reset --hard HEAD~3 #后退三步

reset命令的三个参数对比

#--hard参数:在本地库移动指针,重置暂存区和工作区
#--soft参数:仅仅在本地库移动指针
#--mixed参数:在本地库移动HEAD指针,重置暂存区

#使用git reset --hard HEAD恢复为当前指向的位置

恢复删除的文件

#前提:删除前,文件存在时的状态提交到了本地库
#新建a.txt文件
vim a.txt

#提交到暂存区
git add a.txt

#提交到本地库
git commit -m "new a.txt" a.txt

#删除a.txt
rm a.txt

#使用git reflog查看历史版本
#回退到刚创建的时候
git reset --hard [哈希索引值]

比较文件差异

git diff [文件名]
#不加参数是工作区和暂存区进行比较
#git是以行为单位进行文件内容管理的
#红色的-号代表删除了
#绿色的+号代表新增的

#如果是在原有行内容的基础上进行修改,则是先把改行删除,再把最终内容增加

git diff HEAD [文件名]
#加上HEAD参数是工作区和本地库中HEAD指针所在版本进行比较

git diff HEAD^ [文件名]
#和上一个历史版本进行比较

git diff [哈希索引值] [文件名]
#和某一个历史版本进行比较

#不带文件名可以比较多个文件

git分支介绍

#什么是分支?
    #在版本控制过程中,使用多条线同时推进多个任务。

#在初始化本地仓库时会有一个默认的master(主干)分支
#新增分支可以用feature开头,表示功能
#新增分支的内容是从主干分支复制过来的

#各个分支在开发的过程中是相互独立的
#分支开发完再合并到主分支

#用hot_fix分支来修复主分支中的bug

分支的好处

#同时并行推进多个功能的开发,提高开发效率

#各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

分支的操作

#查看所有分支
git branch -v
#*号代表当前所处分支
#创建新分支
git branch [分支名]
#切换分支
git checkout [分支名]
#合并分支
#必须先切换到要接受合并的那个分支下面去,比如要将hot_fix分支合并到master分支,就先切换到master分支下面去

git merge [分支名]
#解决冲突
#举例:master分支和hot_fix分支修改同一个文件的同一个地方,然后进行合并时会产生冲突

#产生冲突后git不知道要听谁的,所以需要人来做一个决定,手动去解决冲突
#第一步:编辑文件,删除特殊符号
#第二步:把文件修改到满意的程度,保存退出

#修改完冲突之后执行下面两个命令
git add [文件名]
git commit -m "日志内容" #一定不能带文件名

#合并分支后原来那个分支内容不变,而是当前分支内容是最新的

删除远程分支

git push origin --delete [远程分支名]
例如:git push origin --delete develop
#说明:删除远程的develop分支

更新远程缓存

git fetch -p origin

切换到远程分支

git checkout -t origin/[远程分支名]

例如:git checkout -t origin/develop

#说明:切换到远程有本地没有的分支,会自动在本地创建该分支并切换到该分支

tag的操作

#查看tag
git tag

#删除本地tag
git tag -d tag-name

#删除远程tag
git push origin :refs/tags/tag-name

#基于tag创建分支
git branch <new-branch-name> <tag-name>
例如:git branch newbranch v1.0