本地库操作
- 本地库初始化
- 命令:git init【初始化Git本地库】
- 效果:
- 注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
- 设置签名
- 形式:
- 用户名:tom
- Email 地址:goodMorning@163.com
- 作用:区分不同开发人员的身份
- 辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系。
- 命令:
- 项目级别/仓库级别:仅在当前本地库范围内有效
- git config user.name tom_pro
- git config user.email goodMorning_pro@163.com
- 信息保存位置:./.git/config 文件
- 系统用户级别:登录当前操作系统的用户范围
- git config --global user.name tom_glb
- git config --global goodMorning_glb@atguigu.com
- 信息保存位置:~/.gitconfig 文件
- 级别优先级
- 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
- 如果只有系统用户级别的签名,就以系统用户级别的签名为准
- 二者都没有则不允许,后边的操作会报错
- 基本操作
- 状态查看
- git status
- 查看工作区、暂存区状态
- 含义:
- On branch master:在一个叫master的分支
- No commits yet:本地库还没有任何的提交
- 最后一行:暂存区中还没有什么可提交的
- 当我们在该路径下随便写一个文件时,再次git status
- 灰色框:表示一个未追踪的文件,我们可以使用git add命令进行提交
- 添加
- git add [file name]
- 将工作区的“新建/修改”添加到暂存区
- 再次使用git status,会发现文件已经提交到了暂存区
- 上图也说明了,如果不想文件提交到暂存区,恢复到之前的状态,那么可以使用git rm --cached <file>命令
- 提交
- git commit [file name]
- 如果输入这个命令,那么会跳转到vim编辑器,我们需要在打开的编辑器的第一行加入我们的 "commit message",之后使用 :wq 保存退出
- 或者使用如下的方式不需要进入vim编辑器
- git commit -m "commit message" [file name]
- 将暂存区的内容提交到本地库
- 1 file changed:文件的改变数量
- 1 insertion(+):更改文件的行数,如果是第一次提交,那么这个值就是该文件的所有行数
- 查看历史记录
- git log
- 假设当git log的时候记录很多,那么会有如下图所示的效果,为了方便演示,我把窗口调小了
- 屏幕底下会有冒号显示
- 多屏显示控制方式:
- 空格向下翻页
- b 向上翻页
- q 退出
- git log --pretty=oneline【每条日志只显示一行】
- git log --oneline【与上一条命令类似,只是前边的hash值只显示了一部分】
- git reflog【会显示回退到某一版本,需要HEAD指针移动的次数】
- HEAD@{移动到当前版本需要多少步}
- 前进后退本质
- 本质:
- 基于索引值操作[推荐]
- git reset --hard [局部索引值] 【包括前进和后退】
- git reset --hard 56e9925
- 使用 ^ 符号:只能后退【这个版本有个问题,如果有很多个版本,那么如果使用很多歌^会很不方便】
- git reset --hard HEAD^^^
- 注:一个^表示后退一步,n 个^表示后退 n 步
- 使用 ~ 符号:只能后退【所以才有了~这个符号】
- git reset --hard HEAD~n
- 注:表示后退 n 步
- git reset 命令的三个参数对比
- 获取Git命令文档:git help [命令]
- --soft 参数
- Does not touch the index file【暂存区】or the working tree【工作区】at all (but resets the head to
<commit>
, just like all modes do).This leaves all your changed files "Changes to be committed", asgit status
would put it.- 仅仅在本地库移动 HEAD 指针,所以原先本地库和暂存区的对应关系本来一致,但是现在被打破了,曹成了不对等的关系,也就是说只有本地库变了,暂存区和工作区都没变
- --mixed 参数
Resets the index【暂存区】but not the working tree【工作区】 (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.
If
-N
is specified, removed paths are marked as intent-to-add (see git-add(1)).在本地库移动 HEAD 指针,也重置暂存区,也就是说只有本地库和暂存区变了,工作区没变
- --hard 参数
- Resets the index and working tree. Any changes to tracked files in the working tree since
<commit>
are discarded.- 在本地库移动 HEAD 指针
- 重置暂存区
- 重置工作区
- 恢复当前指针指向的位置:
- git reset --hard HEAD
- 删除文件并找回
- 在本地仓库删除指定文件
- git rm [file] 或者 git rm -r [folder]
- 将删除操作的文件提交到本地仓库
- git commit -m "delete message" [file/folder]
- 只是用 rm [file] 也可以进行删除,不过需要将删除操作对暂存区和本地库进行提交 git add / git commit
- 最好使用 rm 的方式进行删除
- 前提:删除前,文件存在时的状态提交到了本地库,也就是说找回只是回到上一个版本没有被删除的状态
- “找回”操作:git reset --hard [局部索引值]
- 这样就相当于删除文件并找回
- 删除操作已经提交到本地库:指针位置指向历史记录
- 删除操作尚未提交到本地库:指针位置使用 HEAD
- 比较文件差异
- git diff [文件名]
- 将工作区中的文件和暂存区进行比较
- 上图我只是在第三行的结尾添加了一些@符号,但是在Git认为,我们是把第三行删除了,重新添加了一行,所以上图中,红色表示删除,绿色表示添加
- git diff [本地库中历史版本] [文件名]
- 将工作区中的文件和本地库历史记录比较
- 不带文件名比较多个文件,比较工作区多个文件的差异
- 分支管理
- 什么是分支?
- 在版本控制过程中,使用多条线同时推进多个任务
- 独立开发彼此互不干扰
- 多个项目的交互运作
- 分支的好处?
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。
- 开发失败的分支删除重新开始即可。
- 分支操作
- 创建分支
- git branch [分支名]
- 查看分支
- git branch -v
- 切换分支
- git checkout [分支名]
- 合并分支
- 第一步:切换到接受修改的分支(被合并,增加新内容)上
- git checkout [被合并分支名]
- 第二步:执行 merge 命令
- git merge [有新内容分支名]
- 前提:要被合并的分支必须包含接收修改的分支或者说被合并的分支要大于【包含】接收修改的分支,这样才能保证成功合并
- 解决冲突
- 冲突的表现
- 冲突的解决
- 第一步:编辑文件,删除特殊符号【如果是上图删除:<<<<<<< HEAD / ======= / >>>>>>> master】
- 第二步:把文件修改到满意的程度,保存退出
- 第三步:git add [文件名]
- 第四步:git commit -m "日志信息"
- 注意:此时 commit 一定不能带具体文件名