git学习整理

与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版本库
使用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 commitgit 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 的网址了。
这里写图片描述

从远程库克隆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值