Git学习笔记
参考文献:https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg
一、概述
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
下图就是分布式版本控制工具管理方式:
二、git工作流程
一般工作流程如下:
- 从远程仓库中克隆 Git 资源作为本地仓库。
- 从本地仓库中checkout代码然后进行代码修改
- 在提交前先将代码提交到暂存区。
- 提交修改。提交到本地仓库。本地仓库中保存修改的各个历史版本。
- 在修改完成后,需要和团队成员共享代码时,可以将代码push到远程仓库。
下图展示了 Git 的工作流程:
三、下载和安装
下载地址
安装:按照官方推荐选项,一路默认点击确定即可。
右击鼠标,查看是否有Git Bash Here选项,若有,则安装成功。
启动git。在当前目录中点击右键中选择Git Bash来启动。
四、工作区和暂存区介绍
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
什么是工作区(Working Directory)?工作区就是你在电脑里能看到的目录,比如我的reporstory文件夹就是一个工作区。有的同学可能会说repository不是版本库吗,怎么是工作区了?其实repository目录是工作区,在这个目录中的“.git”隐藏文件夹才是版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
如下图所示:
分支和HEAD的概念我们稍后再讲。前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
五、Git常用命令
1. 本地库初始化
git add # 注意:初始化之后,会生成一个.git文件夹,可以使用 ll -lA查看,.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
2. 设置签名
用户名:taitao
Email 地址:ttai@mail.ustc.edu.cn
作用:区分不同开发人员的身份
- 辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系。
- 项目级别/仓库级别:仅在当前本地库范围内有效 ,信息保存位置:./.git/config 文件
git config user.name tom_pro
git config user.email goodMorning_pro@atguigu.com
- 系统用户级别:登录当前操作系统的用户范围,信息保存位置:~/.gitconfig 文件
git config --global user.name tom_glb
git config --global goodMorning_pro@atguigu.com
查看系统级别设置的签名
cd ~ // 回到家目录下
cat .gitconfig //查看系统用户级别签名
- 级别优先级
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别 的签名
如果只有系统用户级别的签名,就以系统用户级别的签名为准
二者都没有不允许
3. 基本操作
git status #查看工作区、暂存区状态
git add [file name] #将工作区的“新建/修改”添加到暂存区
git commit -m "commit message" [file name] #将暂存区的内容提交到本地库
git log #查看历史记录
git remote -v #查看当前所有远程地址别名
git remote add [别名] [远程地址] #创建远程库地址别名
git push [别名] [分支名] #推送
git origin [远程地址] #克隆
git fetch [远程库地址别名] [远程分支名] #拉取与合并,其中 pull=fetch+merge
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名] [远程分支名]
-
解决冲突
如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可 -
多屏显示控制方式:
空格 #向下翻页
b #向上翻页
q #退出
git log --pretty=oneline
git log --oneline
git reflog
- 前进后退
#基于索引值操作[推荐]
git reset --hard [局部索引值]
git reset --hard a6ace91
#使用^符号:只能后退
git reset --hard HEAD^
#注:一个^表示后退一步,n 个表示后退 n 步
使用~符号:只能后退
git reset --hard HEAD~n
# 注:表示后退 n 步
- 删除文件并找回
前提:删除前,文件存在时的状态提交到了本地库。
git reset --hard [指针位置]
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用 HEAD
- 比较文件差异
git diff [文件名] 将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本] [文件名] 将工作区中的文件和本地库历史记录比较
不带文件名比较多个文件
六、分支管理
在版本控制过程中,使用多条线同时推进多个任务。同时并行推进多个功能开发,提高开发效率,各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
git branch [分支名] #创建分支
git branch -v #查看分支
git checkout [分支名] #切换分支
#合并分支
#第一步:切换到接受修改的分支(被合并,增加新内容)上
git checkout [被合并分支名]
#第二步:执行 merge 命令
git merge [有新内容分支名]
- 冲突的解决
#第一步:编辑文件,删除特殊符号
#第二步:把文件修改到满意的程度,保存退出
#第三步:git add [文件名]
#第四步:git commit -m "日志信息"
#注意:此时 commit 一定不能带具体文件名
七、连接远程库和本地库
1. 创建远程库
创建好之后,会得到该创库的地址:https://github.com/FelixTt/advancedSoftwareEngineering.git
2. git init #在本地新建本地库并且初始化(在适合文件夹下git bash)
3. git add [文件名] #将新写好的文件添加
4. git commit -m “提交注释” #提交文件
5. git remote add origin
#关联本地库和远程库 https://github.com/FelixTt/advancedSoftwareEngineering.git
#注意:这一步是将长长的链接起一个别名origin,可以使用git remote -v 来查看列出已经存在的远程分支。
6. git pull #上传前需要pull代码,然后消除差异
git pull origin master --allow-unrelated-histories
7. git push [别名] [分支名] #上传代码
#例如:git push origin master
八、场景演练
场景一:Git本地库的基本用法
鼠标右键,点击git bash here,出现上图的命令行窗口。
git init #初始化一个本地版本库
git status # 查看当前工作区(workspace)的状态
git add [FILES] # 把文件添加到暂存区(Index)
git commit -m "wrote a commit log infro” # 把暂存区里的文件提交到仓库
场景二:Git 远程版本库的基本用法
首先在github上创建一个远程库,然后再vs code中点击克隆库,将github上该仓库的链接复制到下图的框中,即可从github中克隆好项目到本地存储下来。
在本地中,即可看到一个隐藏的.git文件夹。
在本地中新建一个文件,就可以看到该文件未被添加到暂存区,也没有提交到本地库,并且在该文件右侧出现一个“+”的标志,点击“+”,即可将文件添加到暂存区。再按照下图流程,将文件提交到本地库。最后push到远程仓库。
此时,就在远程仓库中,就会出现在本地提交的文件。
场景三:团队项目中的分叉合并
创建一个新分支,并且切换到该分支下,创建hello.txt,并且合并到主干master上。
将新建的文件添加到暂存区和提交到的本地仓库,再将文件提交到远程仓库中。
场景四:Git Rebase
在输入命令 git log后,可以看到之前操作的历史记录。
在输入git rebase -i HEAD~3后,打开文本编辑器,删除pick 09a8af4 modifying add这一行,其操作和vim相同。
在保存退出之后,再次 git log,发现删除了一些历史纪录了。