本文是自己对廖雪峰Git教程的学习笔记。
首先明确一件事情:所有的版本管理系统,不论是SVN还是Git,都只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等。跟踪不到二进制文件的的变化,比如图片、视频这些二进制文件,微软的Word文件也是二进制文件。
1.Git纪年
年份 | 事件 |
---|---|
1991 | Linus创建开源项目Linux,志愿者以diff方式提交修改建议 |
2002 | BitMover公司授权Linux社区免费使用BitKeeper代码版本控制系统 |
2005 | Linux社区牛人试图破解BitKeeper被发现,使用权被收回,Linus花两周用C写了Git |
2008 | GitHub上线,为开源项目提供免费Git存储,无数开源项目迁移至GitHub |
2.集中式与分布式版本控制系统
集中式特点:版本库存放在中央服务器;必须联网才能工作,网速会影响文件的上传。
分布式特点:没有中央服务器,不需要联网,每个人都是完整版本库,强大的分支管理(甩集中式N条街的特性)。
二者的区别:分布式比集中式安全性高,不会因为中央服务器出问题影响工作。
为了方便大家的修改,分布式版本控制系统也有一台类似集中式版本控制系统的中央服务器,而该服务器的存在,也仅仅是为了多人协作时方便修改。
3.Mac下Terminal常用的Unix命令
首先要清楚几个文件目录:
" / " :根目录
" ~ " :用户主目录的缩写。例如当前用户为hello,那么" ~ "展开来就是:/Users/hello
" . " :当前目录
".." :父目录
- cd: 跳转到某个目录
cd / 表示跳转到根目录。
cd ~ 表示跳转到用户主目录。
cd .. 表示跳转到上级目录。(cd和..之间的空格不能漏) - ls: 列出当前目录下的子目录和文件
- ls -a : 列出当前目录下所有的子目录和文件,包括隐藏文件
- pwd: 显示当前目录的路径
- clear: 清空当前输入
- history: 查看输入历史记录
- mkdir:创建文件夹
4.Git使用(Terminal命令行方式)
创建版本库
①创建文件夹:在指定目录下,Terminal执行mkdir 文件夹名
,如mkdir learngit
。
②初始化一个Git仓库,使用git init
命令。
③添加文件到Git仓库,分两步:
第一步,使用命令git add <file>
,注意,可反复多次使用,添加多个文件;
第二步,使用命令git commit
,完成。
因为项目中更改不会是简单的一两个文件所以不能一个个的add,那么怎么办呢
git add -A
// 添加所有文件
git add -u
//添加被修改的和被删除的文件,不提交新添加的文件
git add .
//提交新添加的和被修改的,不包含被删除的查看状态与修改内容
①要随时掌握工作区的状态,使用git status
命令。
②如果git status告诉你有文件被修改过,用git diff
可以查看修改内容。版本回退
①HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。
②穿梭前,用git log
可以查看提交历史,以便确定要回退到哪个版本。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数
③要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。-
工作区和暂存区
①工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
②Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)
的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
③git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支
工作区和暂存区.jpeg 撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
git checkout
其实是用版本库里的版本替换工作区的版本
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file
,可以把暂存区的修改撤销掉(unstage),重新放回工作区,就回到了场景1,第二步按场景1操作。
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区,当我们用HEAD
时,表示最新的版本。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。删除文件
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm
命令删了。
现在你有两个选择
①确实要从版本库中删除该文件,那就用命令git rm 文件
删掉,并且git commit
。
②另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:git checkout -- 文件
5.Git仓库(以GitHub为例)
创建SSH Key。
①Terminal执行如下命令:
ssh-keygen -t rsa -C "youremail@example.com"
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
②登陆GitHub,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。添加远程仓库
①登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库。
②根据GitHub的提示,在本地的learngit仓库下运行命令:
git remote add origin 仓库地址
这一步是完成本地Git仓库与GitHub仓库之间的关联。
③把本地内容推送到GitHub仓库,执行如下命令:
git push -u origin master
第一次推送时加上-u
参数,以后再推送时不用加。从远程仓库克隆
要克隆一个仓库,首先必须知道仓库的地址,然后执行如下命令:
git clone 仓库地址
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。创建与合并分支
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph命令可以看到分支合并图。
git log --graph --pretty=oneline --abbrev-commit