与SVN的区别
SVN是集中式的,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器获得最新的版本,然后干活,干完活后要把自己做完的提交到中央服务器。必须联网才能工作。
git是分布式的,没有中央服务器,每个人的电脑就是一个完整的版本库,这样,工作的时候就不用联网了,因为版本都在自己的电脑上。即使没有网络也一样可以提交,查看历史版本记录,创建项目分支等操作,等网络再次连接上Push到Server端。
安装
在Windows上安装
在官网下载安装程序。之后选择默认选项安装。
安装完成后,在开始菜单中找到“Git Bash”,蹦出一个类似命令行窗口的东西就说明安装成功。
最后一步设置,在弹出的命令行窗口中输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
操作
创建版本库
版本库(repository)又名仓库。可以简单理解成一个目录,目录里面所有的文件都可以被git管理起来,每个文件的修改、删除,git都能跟踪。创建一个版本库很简单,选择一个合适的地方,创建一个空目录。
$ mkdir learngit
$ cd learngit
$ pwd
在windows系统中,目录名不能包含中文。
mkdir
命令:创建一个目录(名为learngit
)。
cd
命令:切换到。
pwd
命令:显示当前目录。
第二步,通过git init
命令把这个目录变成Git可以管理的仓库。
$ git init
按下回车后,会出现一行
Initialized empty Git repository in D:/code/test/git/learngit/.git/
表示Git把仓库建好了,并且是一个空的仓库(empty Git repository)。当前目录下多了一个.git
目录,这个目录是Git用来跟踪管理版本库的,尽量不要手动修改。如果没有看到.git
目录,是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
把文件添加进版本库
所有的版本控制系统,只能跟踪文本文件的改动,比如TXT文件、网页、所有程序代码等等。而图片、视频这些二进制文件,虽然也能有版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但具体改了什么,版本控制系统无法知道。Microsoft的Word格式是二进制,因此版本控制系统是没法跟踪Word文件的改动的。如果要真正使用版本控制系统,要以纯文本方式编写文件。文本是有编码的,建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台支持。
使用Windows的注意:千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个特别的方式来保存UTF-8编码的文件,他们在每个文件开头添加Oxefbbbf(十六进制)的字符,会遇到很多问题。建议下载Notepad++代替记事本。选择默认选项安装,把Notepad++的默认编码设置为UTF-8 without BOM即可。
先用Notepad编写一个readme.txt
文件。内容如下
Git is a version control system.
Git is free software.
文件存放在learngit
目录下。
使用git add
将文件添加到仓库。
$ git add readme.txt
用命令git commit
提交到仓库。
$ git commit -m "wrote a readme file"
git commit
命令的-m
后面输入的是本次提交的说明,可以输入任何内容,可以从历史记录中方便找到改动记录。
按下回车后会显示:
[master (root-commit) 9a3c573] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
上面的提示是说,1个文件被改动(新添加的readme.txt文件),插入了两行内容(readme.txt有两行内容)。
版本回退
已经添加并提交了一个readme.txt
文件。接下来修改其中的内容
Git is a distributed version control system.
Git is free software.
运行git status
命令查看结果:
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有提交修改。
可以使用git diff
查看具体修改的内容
$ git diff readme.txt
回车后,会显示下面的内容
diff --git a/readme.txt b/readme.txt
index d8036c1..013b5bc 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
\ No newline at end of file
知道了对readme.txt做了什么修改后,可以提交了。提交修改和提交新文件是一样的两部。先git add
,后git commit
。
提交之后,再用git status
看一些仓库当前的状态
On branch master
nothing to commit, working tree clean
上面的信息说明目前没有需要提交的修改,工作目录是干净的。
再进行一次练习,修改readme.txt文件
Git is a distributed version control system.
Git is free software distributed under the GPL.
提交。
$ git add readme.txt
$ git commit -m "append GPL"
使用git log
可以查看历史记录。
$ git log
commit 116aafeda7061ac9a88039692fbcaf4c080c01bd (HEAD -> master)
Author: xxx
Date: Sun Feb 11 16:48:53 2018 +0800
append GPL
commit d5f99c8adff3ffb84e25dd18b0e14cf68b2bd62f
Author: xxx
Date: Sun Feb 11 16:42:49 2018 +0800
add distributed
commit 9a3c5738e00148151fc043c862009f21c3ac83a1
Author: xxx
Date: Sun Feb 11 15:51:18 2018 +0800
wrote a readme file
git log
命令显示从最近到最远的提交日志。如果嫌输出信息太多,可以加上 --pretty=oneline
参数:
$ git log --pretty=oneline
116aafeda7061ac9a88039692fbcaf4c080c01bd (HEAD -> master) append GPL
d5f99c8adff3ffb84e25dd18b0e14cf68b2bd62f add distributed
9a3c5738e00148151fc043c862009f21c3ac83a1 wrote a readme file
上面的一大串数字与字母是commit id
版本号。SVN版本号一般都是递增的数字,Git的版本号是SHA1计算出来的一个非常大的数字,用16进制表示。这样做是为了防止冲突。
如果想把readme.txt回退到上一个版本。首先知道在Git中,HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,往上100个版本写100个^
会数不过来,所以写成HEAD~100
。
使用git reset
命令回退到上一个版本
$ git reset --hard HEAD^
HEAD is now at d5f99c8 add distributed
--hard
参数的含义稍后说。
查看readme.txt的内容是不是版本add distributed
:
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
用git log
查看现在版本库的状态:
$ git log
commit d5f99c8adff3ffb84e25dd18b0e14cf68b2bd62f (HEAD -> master)
Author: lianglanlan <799679063@qq.com>
Date: Sun Feb 11 16:42:49 2018 +0800
add distributed
commit 9a3c5738e00148151fc043c862009f21c3ac83a1
Author: lianglanlan <799679063@qq.com>
Date: Sun Feb 11 15:51:18 2018 +0800
wrote a readme file
最新版本append GPL
已经看不到了。如果想再回到append GPL
版本,只要上面的命令窗口还没有被关掉,就可以顺着向上找,找到append GPL
的版本号,就可以指定回到未来的某个版本。
$ git reset --hard 116aafe
HEAD is now at 116aafe append GPL
版本号可以不用写全,前几位就可以,Git会自动去找。这样就回到了未来的版本。
Git的版本回退速度很快,因为在Git内部有个指向当前版本的HEAD
指针,当回退版本的时候,Git仅仅是吧HEAD
指向了append GPL
,然后把工作区的文件更新。
如果回退到了某个版本,关掉了命令窗口,想恢复到未来的某个版本,但找不到对应的版本号。可以使用命令git reflog
查找:
$ git reflog
116aafe (HEAD -> master) HEAD@{0}: reset: moving to 116aafeda7061ac9a88039692fbcaf4c080c01bd
d5f99c8 HEAD@{1}: reset: moving to HEAD^
116aafe (HEAD -> master) HEAD@{2}: commit: append GPL
d5f99c8 HEAD@{3}: commit: add distributed
9a3c573 HEAD@{4}: commit (initial): wrote a readme file
可以看到其中 append GPL
的版本号是116aafe
。
工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
工作区
就是电脑中能看到的目录,比如learngit
文件夹就是一个工作区。
暂存区
工作区里有一个隐藏目录.git
,这个不是工作区,是Git的版本库。Git版本库里存了很多东西,其中最重要的就是称为stage
的暂存区。还有Git自动创建的第一分支master
以及指向master
的指针HEAD
。
使用git add
命令时,就是把文件修改添加到暂存区,使用git commit
提交修改时,就是把暂存区的所有内容提交到当前分支。
管理修改
如果对文件进行一次修改,并使用了git add
,之后对文件进行了第二次修改,并直接使用了git commit
。第二次修改的内容就不会被提交。因为第二次的修改没有放入暂存区。
撤销修改
如果对文件进行了修改,这时用git status
命令查看一下:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
可以看到上面代码中,Git提示git checkout -- file
可以丢弃工作区的修改:
$ git checkout -- readme.txt
这个命令的意思是把readme.txt
文件在工作区的修改全部撤销。如果readme.txt
没有被放到暂存区,就会回到和版本库一模一样的状态;如果readme.txt
已经添加到暂存区,又做了修改,现在就会回到添加到暂存区后的状态。
总之,上面的命令就是使文件回到最近一次git commit
或git add
时的状态。
如果对readme.txt
文件做了一些错误的修改,并且git add
到暂存区,在commit
之前发现了这个错误,想撤回,可以先查看一下git status
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
可以看到Git提示使用git reset HEAD file
可以把暂存区的修改撤销掉,重新放回工作区。
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
再用git status
查看一下,这时暂存区是干净的,工作区有修改。
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
这时再用git checkout -- file
丢弃工作区中的修改,就可以了。
删除文件
先添加一个新文件test.txt
。
$ git add test.txt
$ git commit -m '添加test.txt'
[master 0328b0c] 添加test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
一般情况下,可以直接在文件管理器中把没用的文件删了,或者用rm
命令删了:
$ rm test.txt
使用git status
查看状态
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
deleted: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
现在分成两种情况:
(1)如果确实是要从版本库中删除该文件,就用命令git rm
删掉,并git commit
$ git rm test.txt
rm 'test.txt'
$ git commit -m '删除test.txt'
[master 01e0f19] 删除test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
(2)如果删错了,以内版本库中还有
$ git checkout -- test.txt
远程仓库
添加远程库
已经在本地创建了一个Git仓库,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步。首先登陆GitHub。
点击右上角加号,创建一个新的仓库:
在Repository name填入learngit
(自定义名字也可),其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。
目前,在GitHub上的这个learngit
仓库还是空的。
根据提示,在本地的learngit
仓库下运行命令。(可以点击上面图片最右侧复制命令,再粘贴到控制台中)
$ git remote add origin git@github.com:lianglanlan/learngit.git
添加后,远程库的名字就是origin
。这是Git的默认叫法,也可以改成别的。
下一步就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
当你第一次使用Git的clone
或者push
命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xxx.xx.xx.xx)' can't be established.
RSA key fingerprint is xxxxx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,在第一次验证GitHub服务器的Key时,需要确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes
回车。
如果出现下面这种情况,说明没有在GitHub账号添加SSH Key。解决方法如下:
1、在终端输入ssh-keygen -t rsa -C "username"
(注:username为你git上的用户名)
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
如果执行成功,返回:
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa):
直接按回车,会出现以下两种情况的一种:
(1)如果正常运行的话,会出现:
Enter passphrase (empty for no passphrase):
这种情况直接回车
(2)有时候会出现:
/Users/your username/.ssh/id_rsa already exists.
Overwrite (y/n)?
说明你已经设置了存储地址,输入y
覆盖,回车。
上面的任意两种情况之后,会出现:
Enter same passphrase again:
再按回车,这时会看见:
Your identification has been saved in /Users/username/.ssh/id_rsa.
Your public key has been saved in /Users/username/.ssh/id_rsa.pub.
The key fingerprint is:
58:42:8b:58:ad:4b:b5:b9:6d:79:bf:8c:f9:e2:2b:ed
username
The key's randomart image is:
+--[ RSA 2048]----+
| ... |
| o oo. |
| . .ooo. |
| o o+ |
| . ..oS. |
| . . + . |
| . o . |
| . o+. |
| +E++. |
+-----------------+
这说明SSH key就已经生成了。文件目录就是:/Users/username/.ssh/id_rsa.pub.
可以执行cat
命令查看文件的内容:
cat /User/username/.ssh/id_rsa.pub
这时会看见
ssh-rsa AAAAB3NzaC1yc2。。。。。。。。。
ssh-rsa
后面的内容这就是你的SSH keys。把显示出来的SSH直接添加到GitHub账户设置里的SSH Keys中。
(1)打开设置
(2)选择SSH Keys
(3)添加新的SSH Key
(4)进入编辑SSH Key中,title自定义,Key就是之前命令生成的那段,复制过来就好(全部复制,包括ssh-rsa
)。
这时再重新执行一下:
$ git push -u origin master
推送成功后,可以立刻看到远程库的内容已经和本地一模一样。
从现在起,只要在本地作了提交,就可以通过下面命令把本地master
分支的最新修改推送至GitHub。
$ git push origin master
在GitHub上预览html效果
打开setting
找到一个Github Pages 的设置,点击 source 中的本来的 None ,使其变成 master 分支,也就是作为部署github pages 的分支。
点击 save,保存。页面会自动刷新,再看 github pages 设置框处,多了一行网址,就是你的 github pages 的网址了。