1. git学习
学习目标:
熟练在vscode中使用git,熟练版本控制的各种操作。
熟练使用git的版本对比、分支合并。
1.git基本使用
你的本地仓库由 git 维护的三棵“树”组成。第一个是你的工作目录(workspace),保存着正在修改的文件;第二个是 暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。下面是git操作的一个流程图:
安装好git后,在命令行或终端中使用下面的命令可以设置git自己的名字和电子邮件。这是因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址,这样谁修改了哪行代码就都可以查询出来。在命令行输入:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。上面这个命令只要配置一次,以后不需要再配置了。
注意:
--global:系统某个用户的全局设置
--local:对单独的某个项目进行设置。
参考:https://www.lmlphp.com/user/57828/article/item/709802/
下面介绍一下git的常用操作:
git init # 用于初始化git库,生成了.git文件,.git中存放着暂存区和分支(master)的数据
git add file2.txt file3.txt # 添加到暂存区
git add . # 添加所有文件到暂存区
git commit -m "fix(text.txt):change balabala" # 将暂存区的文件全部存储到当前分支中。-m后为注释,用于说明提交内容是啥。
# 提交的说明是有一定规范的,如上,fix表示进行的操作,text.txt代表操作的文件,change balabala 代表具体做了什么操作
# 具体我们可以搜索“git commit风格”进行进一步了解。
git status:查看workspace、stage和repository的状态。
git diff readme.txt # 查看HEAD指向的readme.txt与本地的readme.txt相比做了哪些修改
git diff HEAD -- readme.txt # 命令可以查看工作区和版本库里面最新版本的区别
git log # 查看提交的历史以及版本对应的ID号
git log --pretty=oneline # 查看提交历史(只包含简要信息)
git reset --hard 1094a # 退回到ID开头为1094a的版本
git reset --hard HEAD^ # 退回到上一个版本,上上一个版本就是HEAD^^,往上100个版本是HEAD~100
# HEAD指向的是当前分支
git reflog # 用来记录你的每一次命令,可用于查看生成过的每一个版本的ID
git checkout -- readme.txt # 丢弃工作区的修改,如误删了readme.txt和修改了readme.txt
git reset HEAD readme.txt # 可以把暂存区的修改撤销掉(unstage)
git checkout -- <filename> # 此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。
# 已添加到暂存区的改动以及新文件都不会受到影响。
# 假如你想丢弃你在本地的所有改动与提交,
# 可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
git fetch origin
git reset --hard origin/master
HEAD指向当前分支
master、feature都相当于指针
2.本地仓库与远程仓库连接
2.1.生成公钥和私钥
1.Windows下打开Git Bash或linux终端中输入:
ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
windows下的C:\Users\用户名\.ssh里有id_rsa和id_rsa.pub两个文件,id_rsa是私钥,id_rsa.pub是公钥,
linux中id_rsa和id_rsa.pub两个文件可以在~/.ssh目录下找到
2.将id_rsa.pub中的内容添加到https://github.com/settings/keys中,添加位置如下:
在linux下通过cat显示id_rsa.pub的内容,然后再复制内容到下图的key中(通过其他方式得到key可能格式不对)。
2.2.本地仓库与远程仓库连接
前面我们已经介绍过本地库的创建,下面介绍如何将本地仓库上传到远程仓库中。
1.首先给远程仓库取名为origin(起什么名都可以):
git remote add origin git@github.com:username/learngit.git # 使用ssh方式提交代码。(由于前面配置了ssh key,所以使用这种方式)
# git remote add origin git@gitee.com:username/learngit.git # gitee的上传命令
# git remote add origin https://gitee.com/username/test.git # 使用https方式提交代码
# 更一般的命令如下:
# git remote add origin <server> # 如此你就能够将你的改动推送到所添加的服务器上去了。
远程库的名字就是origin,这是Git常用的叫法。请千万注意,把上面的username/learngit.git替换成你自己的GitHub仓库。使用git命令将本地仓库通过https方式上传到github,需要进行如下操作:
git remote add origin https://token@github.com/username/test.git
token的获取,具体可参看链接
2.将本地库的所有内容推送到远程库上:
git push -u origin master
相当于以下两个:
git branch --set-upstream-to=origin/master master // 将远程仓库origin的master分支与本地仓库master分支绑定
git push origin master
也就是说-u起到了绑定作用,如果我们需要将一份已经写好的代码提交到多个git远端时,就可以不用-u参数进行绑定。
若有如下提示,请输入yes(不可以按回车):
4.断开远程连接与克隆
# 远程库操作
git remote -v # 查看远程库信息:
git remote remove origin # 此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库
# 克隆
git clone 相应链接 # 开启代理,可能会导致克隆失败
git clone git@github.com:superDogDad/test.git #使用ssh协议,ssh协议速度最快。
git clone https://github.com/superDogDad/test.git
git clone /path/to/repository # 创建一个本地仓库的克隆版本
git clone username@host:/path/to/repository # 使用此命令克隆任意服务器中的远程仓库
3.分支管理
前面我们都是使用git push origin master将把本地master分支的最新修改推送至GitHub。但是通常我们不直接修改master分支,而是新建一个分支来修改代码,然后将分支提交到github中。提交到github中以后,你的领导会评估你的分支与master中代码的差别,然后再决定是否将你的分支与master进行合并。
1.生成、切换、提交和删除分支:
git branch feature_x # 建一个叫做“feature_x”的分支
git checkout -b feature_x # 建一个叫做“feature_x”的分支,并切换过去
git checkout master # 切换回主分支
git branch -d feature_x # 把新建的分支删掉
git push origin <branch> # 提交你的分支到远程。除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的
2.更新和合并分支
git pull origin master:brantest # git pull=git fetch + git merge。
# 将远程主机origin的master分支拉取过来,与本地的brantest分支合并。
git pull origin master # 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git merge <branch> # 要合并其他分支到你的当前分支
git diff <source_branch> <target_branch> # 在合并改动之前,你可以使用如下命令预览差异
4.log
git log用于查阅本地仓库的历史记录
git log --author=bob # 查看bob的提交记录
git log --pretty=oneline # 一个压缩后的每一条提交记录只占一行的输出
git log --graph --oneline --decorate --all # 通过 ASCII 艺术的树形结构来展示所有的分支, 每个分支都标示了他的名字和标签
git log --name-status # 看看哪些文件改变了
git log --help # 查看帮助
常用如下:
git log --graph --pretty=oneline --abbrev-commit
或
git log --oneline --graph
5.错误修改
git checkout -- <filename> # 此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。
# 已添加到暂存区的改动以及新文件都不会受到影响。
# 假如你想丢弃你在本地的所有改动与提交,
# 可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
git fetch origin
git reset --hard origin/master
6.实用小贴士
内建的图形化 git:gitk
彩色的 git 输出:git config color.ui true
显示历史记录时,每个提交的信息只显示一行:git config format.pretty oneline
交互式添加文件到暂存区:git add -i
7.github
Repositories:存放项目
Star:收藏
watch:有更新时会提醒
fork:在你的账号中创建此仓库的副本,Pull Request 把你的提交贡献回原仓库。(具体还得实战演练演练)
github使用小技巧:
在仓库中点击"."可以开启在线的vscode
8.问题
1.新提交到暂存区的东西,会覆盖掉旧的吗?
答:提交到暂存区的东西是一个一个修改,所以不存在覆盖一说。新提交的修改和以前提交的修改会在commit以后,一同上传到仓库中。
2.版本退回方法?
git reset --hard HEAD^
遇到不会的,再去百度
3.去看官方文档
答:有空,再说。
4.代码自动备份软件:git是一个版本管理工具,那代码自动备份是不是有相应的软件呢,毕竟暂存区也是在本地,一旦电脑崩溃就啥都没了。
答:似乎没有备份代码的软件,但是我们可以通过github进行代码备份。
通过设置脚本进行自动commit和上传来进行备份。
一般开发一个新功能feature,都是需要开辟一个新分支。我们设置自动上传的代码以后,要让这些代码都是自动上传到feature中。这样就不会影响master等重要的分支。
可参考如下链接,进行设置:链接
5.除了vscode的git插件,还有git的可视化软件可以用吗?
答:github桌面版等
6.github不支持大文件存储,大文件存储请参考: https://git-lfs.github.com
9.最后
git的学习,可以先在廖雪峰的网站中进行学习,然后将这个网站当成字典,需要的时候去查询。当然菜鸟教程更全,更适合当字典。
复习廖雪峰的git教程的时候,只需要看廖雪峰教程每小节下面的总结即可知道还要不要认真看这一节。