Git学习笔记
为了更好的管理文件 我们需要Git这样一个强大的版本控制系统!
Git简介
Git是什么?
Git是目前世界上最先进的分布式版本控制系统【版本控制系统自动记录每次文件的改动,还可以让别人协作编辑】
Git诞生
Linux的创始人Linus在BitMover公司撤销支持的威胁下,自立门户。在两个星期时间内用C语言写成了一个分布式版本控制系统--Git.
2008年,GitHub网站上线,为开源项目提供Git存储。无数开源项目开始向GitHub迁移,如:jQuery,PHP,Ruby.
Git是在逆境下诞生出来的传世之作!
集中式&分布式的区别
Linus痛恨CVS和SVN这两个版本控制系统,它们都属于集中式版本控制系统。而Git属于分布式版本控制系统。
- 集中式:集中式的版本库是集中存放在中央服务器的,干活的时候用自己的电脑从中央服务器获取最新版本然后再把自己修改后的版本推送给中央服务器。缺点是必须要联网才可以工作,网速慢的时候会影响工作的效率。
- 分布式:分布式没有中央服务器,每个人的电脑上都是一个完整的版本库。现在有A和B两个人,A在自己的电脑上修改了文件,B也在自己的电脑上修改了文件,A和B只需要把各自的修改推送给对方就可以了。优点是具有安全性,一个坏了只需要从另一个人的电脑上进行拷贝就可以了。通常来说Git也会有自己的一台"中央服务器"一直保持开机,但仅仅是为了用于传输文件。
安装Git
Linux
sudo apt-get install git
Windows
从Git官方网站上下载安装程序
网速比较慢的就用百度网盘的地址
还要进行进一步的设置:
git config --global user.name "Name"
git config --global user.email "Email"
--global
参数会让这台机器上所有的Git仓库都使用这个配置,但是也可以对某个仓库制定不同的用户名和Email地址。
创建版本库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建版本库的流程:
1.找一个合适的地方创建一个空目录;windows下请保证目录名中不含有中文
2.通过git init
命令把这个目录变成Git可以管理的仓库;
git init
Initialized empty Git repository in /Users/michael/learngit/.git/
之后就会发现目录下多了一个.git
的目录。是作为隐藏文件存在的。
这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
把文件添加到版本库
只能跟踪文本文件的改动,如TXT文件,HTML,程序源代码等。
图片和视频可以记录大小的变动,显然没有办法记录你修改了什么样的地方。
强烈推荐使用UTF-8编码的纯文本,而Word文档这样的二进制存储的文件,Git就没有办法提供改动追踪。
不要使用windows自带的记事本编辑纯文本文件,他们在文件之前添加了0xefbbbf(16)的字符。并且使用的IDE要确认已经设置为UTF-8编码。
下面是添加文件test.cpp到Git仓库的过程:
1.先把文件放到Git仓库的目录下,再通过
git add test.cpp
命令把文件添加到仓库。
2.在所有要添加的文件添加完成之后,可以通过
git commit -m "Message You Want to Mark."
进行文件添加结束后的说明。
注意:
一个commit命令可以提交多个文件,只需要一直add就可以了,也可以通过add命令一次add多个文件。
记住命令:
git init
git add <filename>
git commit -m "Message"
版本问题
git status
查看现在的仓库状态,可以查看现在有什么修改没有被提交。
git diff
可以查看未被提交的文件进行的修改。
版本回退
git log
通过该命令查看历史修改的版本,最近到最远的提交日志。如果觉得输出信息太多,可以使用--pretty=oneline
参数:
git log --pretty=oneline
然后就会显示commit id
,是十六进制表示的commit id
现在想要将当前编辑的文件退回到上一次提交的文件继续编辑的话,就需要使用git reset
命令。
首先Git需要知道当前的版本是哪一个版本。Git中,用HEAD
表示当前版本。上一个版本就是HEAD^
,上上个版本就是HEAD^^
。往上\(n\)个版本是HEAD~n
git reset --hard HEAD^
然后现在的文件就被还原成了上一次提交的版本。
现在再次使用git log
发现已经无法查看上一次的版本了。
但是我又后悔了怎么办呢。其实本质上HEAD是一个指针,指向当前版本的ID。可以通过git reflog
命令来查看每次命令的修改
git reflog
5c963fa (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
8bdbadd HEAD@{1}: commit: My Test Programme in 0313
5c963fa (HEAD -> master) HEAD@{2}: commit (initial): My test Programme
前面的一串数字就是版本号,就可以通过git reset --hard
命令加上前面的十六进制数字来回到数字ID所代表的版本。
工作区和暂存区
工作区
就是电脑里的文件夹,就是能在电脑里面看见的部分,比如我在电脑里面建立的版本库文件夹\(Githome\)
版本库
版本库就是.git
文件,内部有两个部分:暂存区(Stage)和主分支(Master),而头指针HEAD就指向Master分支。
每次git add
操作就是将文件添加到暂存区。然后通过git commit
将暂存区里面的东西全部提交到master分支中去。然后清空暂存区。
管理修改
git add
的命令每次add的不是文件,而是对文件的修改。
因为如果第一次修改后add而第二次修改以后没有add的话,第二次修改就不会被提交到master分支中。
撤销修改
git checkout -- file
命令:
- 如果当前修改没有被添加到暂存区,则直接撤销到和版本库内一模一样的情况。
- 如果当前文件的修改被添加到了暂存区,则直接撤销到和添加到暂存区时一样的状态。而这种情况下如果想要撤销到和版本库内一模一样的版本,有两种方法:第一种是commit之后使用版本回退的功能,但是这种方法需要你没有把修改全部提交到远程版本库中;第二种是先
git reset HEAD file
可以把暂存区的修改退回到工作区,之后再使用第一种情形下的方法进行撤销修改。
删除文件
- 方法一:直接在文件夹中删除文件后使用
git rm <file>
或者git add <file>
进行对删除操作的提交 - 方法二:直接使用
git rm <file>
进行删除之后使用commit
将删除操作提交到版本库内。
如果误删,只能通过git checkout -- file
恢复到版本库内的最新版本。会丢失最近所做的修改。