Git是目前世界上最先进的分布式版本控制系统。版本控制系统,能记录每次文件的改动。
集中式版本控制系统,版本库是集中存放在中央服务器的,需要联网。SVN修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统。
分布式版本控制系统,根本没有中央服务器,每个人的电脑上都是一个完整的版本库,不必联网。多人协作时,只需把各自的修改推送给对方。因为每个人的电脑都有完整的版本库,安全性高很多。(通常也有一台充当“中央服务器”的电脑,但仅仅是用来方便“交换”大家的修改)
注意:
所有的版本控制系统,只能跟踪文本文件的改动,比如TXT、网页、程序代码等。而图片、视频、Word文件是二进制文件,没法跟踪文件的变化。
Nodepad++:使用Windows要特别注意,千万不要使用Windows自带的记事本编辑任何文本文件,会在每个文件开头添加0xefbbbf字符,会遇到很多问题。建议下载Nodepad++代替记事本,把Notepad++的默认编码设置为UTF-8 without BOM。
UTF-8编码:文本是有编码的,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。
一、安装
在Windows上使用Git,可从Git官网直接下载安装程序https://git-scm.com/downloads,按默认选项安装。开始菜单“Git”->“Git Bash”,弹出类似命令行窗口如下图,说明Git安装成功。
Git是分布式版本控制系统,每台机器必须自报家门(名字和Email地址)。--global表示你这台机器所有的Git仓库都使用这个配置。在命令行输入:
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
二、工作区和版本库
工作区(Working Directory)指在电脑里能看到的目录。版本库(Repository)指工作区的隐藏目录.git,这个不算工作区。
Git的版本库有stage(或者叫index)暂存区,Git自动创建的第一个分支master,及指向master的指针HEAD。
git add把文件修改添加到暂存区,git commit把暂存区的所有内容提交到当前分支。Git跟踪并管理的是修改,而非文件。每次修改,如果不用git add到暂存区,就不会加入到commit中。
三、创建版本库
版本库又名仓库,可简单理解为一个目录,该目录里所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,在将来某个时刻可以“还原”。
(1)创建一个空目录learngit,有内容的目录也可以。如果使用Windows系统,确保目录名不含中文。
(2)运行git init把这个目录变成Git可以管理的仓库,当前目录下多了.git文件夹(默认隐藏)。
(3)把文件添加到版本库。编写文件,放到learngit或其子目录下。
四、基本命令
git add readme.txt
告诉Git,把文件修改添加到仓库;
git commit -m "wrote a readme file"
告诉Git,把(多个)文件提交到仓库,-m后面输入的是本次提交说明,最好是有意义的;
git status
获取仓库当前的状态;
Untracked files 有未被跟踪的文件
Changes to be committed 有未提交的文件
nothing to commit, working tree clean 没有被修改的文件
git diff
查看具体修改的内容(difference),显示的格式是Unix通用的diff格式。
五、版本回退
git log
查看历史记录,显示从最近到最远的提交日志,以便确定要回退到哪个版本。git log --pretty=oneline使每条记录显示在同一行。
git reset --hard b8094
回退到指定版本,可以是未来的版本。
git reset --hard HEAD^
回退到上一个版本。
git reflog
记录你的每一次命令。如果已经关闭cmd,要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
每提交一个新版本,Git会把它们自动串成一条时间线。Git在内部有个指向当前版本的HEAD指针,回退版本时,Git仅仅是修改HEAD的指向,版本回退速度非常快。
b8094a0...是commit id(版本号),是SHA1计算出来的一个非常大的数字,用十六进制表示。Git是分布式的版本控制系统,多人在同一个版本库里工作时为了避免冲突。版本号写前几位就可以,Git会自动去找。
当前版本HEAD,上一个版本HEAD^,上上一个版本HEAD^^,往上100个版本HEAD~100。cmd控制台中换行符默认是^,输入HEAD^,回车可能出现more?问下一行是否需要再输入,最好使用HEAD~。
git checkout -- readme.txt
把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。再使用git checkout
假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后面会讲到远程版本库,一旦你把stupid boss
提交推送到远程版本库,你就真的惨了
当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
.gitignore项目忽略文件 所使用IDE的配置文件,如.idea(WebStrom)、.vscode
.git存放项目的不同版本
使用码云
码云(https://gitee.com/),国内的Git托管服务。码云提供免费的Git仓库,还集成了代码质量检测、项目演示等功能。对于团队协作开发,码云还提供项目管理、代码托管、文档管理的服务,5人以下小团队免费。
(1)注册账号并登录,上传自己的SSH公钥。右上角用户头像->菜单“设置”->“SSH公钥”,填写一个便于识别的标题,然后把用户主目录下的.ssh/id_rsa.pub
文件的内容粘贴进去: