这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
课程导学链接
(【网络与部署 学习资料(下)】第三届字节跳动青训营 - 后端专场 - 掘金)
课程PPT链接
一、Git的基本认识:
Git:是一个免费和开源的分布式版本控制系统,旨在以速度和效率处理从小型到大型项目的所有内容。
版本控制:一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统 (更好的关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故的发生;也能够随时切换到不同的版本,回滚误删误改的问题代码)
二、Git的基本原理:
1.每个库都存有完整的提交历史,可以直接在本地进行代码提交
2.每次提交记录的都是完整的文件快照,而不是记录增量
3.通过Push等操作来完成和远端代码的同步
三、Git基本操作
创建本地空仓库:git init
init:初始化当前目录为仓库,初始化后会自动将当前仓库设置为master
init其他参数:
--initial-branch 初始化的分支
--bare 创建一个裸仓库(纯Git目录,没有工作目录)
--template 可以通过模板来创建预先构建好的自定义git目录
mkdir test //创建目录
cd test //进入目录
git init //初始化当前仓库
初始化后会生成git的配置文件目录,普通的"ls"命令是看不到的,我们需要使用ls -ah查看隐藏目录
配置git环境:git config --global
初次使用git需要设置你的用户名以及邮箱,这将作为当前机器git的标识,如果你用它来下载远程仓库一些需要登录权限的仓库会要求登录,git默认使用配置邮箱以及用户名登入,但会要求你手动输入密码
git config --global user.name "你的用户名" //用户名配置
git config --global user.email "你的邮箱" //邮箱配置
新建文件添加到本地仓库:git add、git commit
add:将文件添加到缓存区
如果你不确信哪些文件是改动过的,使用git add --all
commit:提交到本地仓库
commit其他参数:
-m 简写描述我们的信息
--amend 重写上一次的提交信息
touch test.c //新建一个文件
git add test.c //添加到本地仓库的提交缓存
git commit -m "add new file \"test.c\""//提交到本地仓库
git commit 会为我们生成40位的哈希值,用于作为id,并把刚刚用git add添加到提交缓存区里的文件提交到本地仓库中,便于我们回滚,至此,这个文件就已经添加到本地仓库中了,同时本地仓库也迭代了一个版本。
查看历史提交日志:git log
有三种模式
-soft就仅仅将头指针恢复,已经add的暂存区以及工作空间的所有东西都不变。
-mixed,就将头恢复掉,已经add的暂存区也会丢失掉,工作空间的代码什么的是不变的。
--hard,那么一切就全都恢复了,头变,aad的暂存区消失,代码什么的也恢复到以前状态。
git log //查看历史版本
git reset --hard 要回滚id //回滚
查看提交之后文件是否做了改动: git status
status:查看当前仓库状态
使用git add提交到缓存区文件后,使用git status也可以查看到当前文件的状态
A:未修改
AM:修改
Untracked:未提交
modified:新文件,但未提交
如果提交了的文件,且没有改动的,不会显示到这个里面
将文件撤销回到最近一次修改的状态:git checkout -- file
查看提交历史:git reflog
git reflog可以查看当前版本库的提交历史,凡是对仓库版本进行迭代的都会出现在这个里面,包括你回滚版本都会出现在这个历史中
git 基本组成框架:Workspace、Index / Stage、Repository、Remote
Workspace:开发者工作区,也就是你当前写代码的目录,它一般保持的是最新仓库代码。
Index / Stage:缓存区,最早叫Stage,现在新版本已经改成index,位于.git目录中,它用来存放临时动作,比如我们做了git add或者git rm,都是把文件提交到缓存区,这是可以撤销的,然后在通过git commit将缓存区的内容提交到本地仓库
Repository:仓库区,是仓库代码,你所有的提交都在这里,git会保存好每一个历史版本,存放在仓库区,它可以是服务端的也可以是本地的,因为在分布式中,任何人都可以是主仓库。
Remote:远程仓库,只能是别的电脑上的仓库,即服务器仓库。
git rm后恢复文件:git rm、git reset、git checkout
git rm d.c //删除一个文件
git reset //重置所有缓存区操作
git checkout d.c //将文件取消操作
git创建分支:git branch、git checkout
git checkout -b 文件名 //创建一个分支,创建完成分支后会自动切换过去
git branch //查看当前属于哪个分支,也就是查看HEAD的指向
git切换分支:git checkout 文件名
git合并分支:git merge
git checkout master //切换到master
git merge 分支名 //合并分支
git查看分支:git branch -a //查看当前所有分支
git修改分支名称:git branch 分支名 新的分支名
git删除本地分支:git branch -D 分支名
git删除远程分支:git push origin --delete 远程分支名
github将本地仓库关联到远程仓库:git remote add origin
git remote -v //查看remote
git remote add origin_ssh git@github.com:git/git.git //关联
或 git remote add origin_http https://github.com/git/git.git
git push -u origin master //推送到远程
push:将本地仓库与远程仓库合并 -u:将本地仓库分支与远程仓库分支一起合并,就是说将master的分支也提交上去,这样你就可以在远程仓库上看到你在本地仓库的master中创建了多少分支,不加这个参数只将当前的master与远程的合并,没有分支的历史记录,也不能切换分支 origin:远程仓库的意思,如果这个仓库是远程的那么必须使用这个选项 master:提交本地matser分支仓库
git将远程仓库关联到本地和拉取指定分支、切换远程分支:git clone
git保存当前工作切换分支:git stash
git删除不需要的object:git gc
git gc --prune=now //指定的是修剪多久以前的对象,默认是两周前
gc 可以删除一些不需要的object,以及会对object进行一些打包压缩来减少仓库的提体积
四、常见问题
为什么我明明配置了Git配置,但是依然没有办法拉取代码?
- 免密认证没有配。
- Instead Of配置没有配,配的SSH免密配置,但是使用的还是HTTP协议访问。
为什么我Fetch了远端分支,但是我看本地当前的分支历史还是没有变化?
- Fetch 会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化。
五、小结
通过课上的学习大致上了解git的基本工作原理,以及如何使用git。在短短的2个小时课程里不可能完全掌握git,在懂一些基础之后,需要不断的尝试,不断发现问题并努力的解决问题,才会慢慢变得深刻,学习git有着非常重要的作用,能够让我们对GitHub更好的使用,以及为之后的企业实习打下良好的基础。