廖雪峰Git学习笔记(上)

廖老师git教程有所改动

一、git及相关概念

  1. Git及版本控制系统
    Git:用C语言开发的分布式版本控制系统 DVCS (Distributed
    Version Control System)

1)类似的还有Concurrent Version System(即CVS,常用的代码版本控制系统)、subversion(即SVN)、ClearCase(收费,安装比Windows还大),它们是集中式版本控制系统,速度较慢且必须联网才可工作。

 ① CVS由于自身设计问题,会出现提交文件不完整,版本库莫名损坏的情况;
 ② SVN修正了CVS的一些稳定性问题,是目前使用最多的集中式VCS。
 ③ Bitkeeper(分布式源码管理系统)、Mercurial和Bazaar均为DVCS。分布式版本控制系统的安全性较高。

2)4个著名VCS比较:
https://www.cnblogs.com/greenmile/archive/2010/04/20/VCS.html

  1. 版本控制系统的功能:追踪文件的变更 and 并行开发

注意:所有的版本控制系统,其实只能追踪文本文件的改动(txt、网页、代码等),它可告诉你每次的改动,如在某行添加了单词“Linux“,在某行删了一个单词。而对图片、视频这些二进制文件,虽然也能由它管理,但无法追踪文件变化,只能把二进制文件每次改动串起来,即只知道图片从100KB变为120KB,具体改了什么它并不知道也无从知道。

Microsoft的Word格式是二进制格式,so VCS无法跟踪Word的改动。在真正使用VCS时,要以纯文本方式编写文件。

  1. 版本库(仓库):
    即repository,可看为一个目录,这里的所有文件均可被git管理且每个文件的修改、删除都可被git追踪,因此可在将来追踪历史或“还原”。[Windows系统中为避免遇到莫名其妙的问题,最好使目录名(包括父目录)不包含中文]

认识shell和vim编辑器(含3.4.5):https://www.jianshu.com/p/17960c5b01a2

  1. Shell俗称壳,除了图形界面的壳(shell),还可以是命令的壳(shell),如windows操作系统下有一个cmd.exe,这个就是命令行的shell,再linux系统下有Boume again shell 这个命令行shell,简称bash。
    bash在windows系统中是没有的,因此在windows系统是不能直接使用bash的,但是可以通过安装一些软件应用程序来模拟对应的bath的大部分功能。恰好git就提供了这样的一个bash,我们称之为git bash.我们安装好git后就可以使用bash命令了。

  2. bash命令:
    1)格式:命令 [-options] [参数]
    如:git commit -m ‘提交的内容’
    2)常见的bash命令:
    tar 解压
    wget 下载
    cp 复制文件或文件夹
    history 查看历史操作命令
    mv 移动、重命名、剪贴目录
    ls(list) 查看当前目录下的内容
    cd(change directory)
    切换目录,如cd … 返回上一级目录,cd ~切换到home目录
    pwd 显示工作目录的路径名称
    mkdir(make directory)
    创建目录
    touch 创建文件,如touch index.html
    | 管道符,可将多个命令连接起来使用
    rmdir 删除目录,必须是空目录才能删除
    cat 查看文件全部的内容,如 cat index.html
    curl 网络请求,如 curl http:www.baidu.com
    tail 如tail -n 10 index.html表示查看文件的后10行
    rm 删除文件,其中rm -r表示递归的删除,如rm -r css/可以删除非空目录
    head 如head -n 10 index.html 或head -10 index.html 表明查看文件的前10行
    more和less 二者都表示查看文件, less是以分页的方式来查看,通过按空格来换页
    echo 输出,如 echo hello 就会输出hello,若用echo hello > index.html就会输出到index.html
    grep 正则匹配,如grep i index.html表示在index.html查找以i开头的,如ls | grep s表示将ls列出的结果当作grep的参数传递给grep中匹配到s的

  3. vim编辑器:

vim中有一个命令vi,如vi index.html,就可编辑index.html,但应注意此命令只是进入一个编辑界面,而不能直接编辑。要进行编辑需要配合vim的三种编辑模式来进行,即命令模式、输入模式和底行模式。

用vi进入的是命令行模式,此时是不能进行编辑的,只有从命令行模式切换到输入模式才可编辑(切换方式:输入字母i或a)。进入输入模式后,可以随意改动,在该模式下将内容修改好后需要进入底行模式才可保存(切换方式:在输入模式下按esc从输入模式回到命令行模式,然后从命令模式输入:切换为底行模式)。进入底行模式就可进行保存操作,通过输入w(write),保存并退出的话用wq,然后回车,不保存强制退出用q!。

具体命令:
1)底行模式:

wq 保存并退出 ;
q! 不保存强制退出 ;
set nu 设置行号 ;
e! 回到上一次保存的位置。

2)命令行模式:

ZZ 保存并退出 ;
Ctrl+f 向前翻页;
u 撤销,可多次使用 ;
yy复制当前行;
p 粘贴内容;
dd 删除当前行;
Ctrl+b 向后翻页;
i 从命令行进入输入模式,在当前光标处插入;
a 从命令行进入输入模式,在当前光标后插入;
A 从命令行进入输入模式,光标移动到行尾;
o 从命令行进入输入模式,在当前行下面插入新行;
O从命令行进入输入模式,在当前行上面插入新行。

二、Git的使用

常用命令:https://www.cnblogs.com/lwzz/archive/2013/02/23/2921426.html

  1. 创建版本库:

    创建空目录“kdir 文件名” (也可在已有内容的目录下创建git库)

    将此目录变成Git可管理的仓库“git init“ (初始化一个git库)

[当前目录下多的“.git”目录是Git跟踪管理版本库的,不要轻易修改此中文件,否则改乱了就把Git仓库破坏了。若未看到“.git”,是因为此目录默认隐藏,用ls -ah命令就可见]

                               ↓

                       >添加文件到版本库

git add 文件名(read.txt)“添加[该命令可多次使用] ,再用git commit -m ”输入说明“
如:
git add file1.text
git add file2.text file.text
git commit -m “add 3 files."

若git commit提交时未用-m添加注释便进入vim模式的处理:
https://blog.csdn.net/weixin_34405925/article/details/87987972

  1. git status命令用于显示工作目录和暂存区的状态。用此命令能看到哪些修改被暂存到了, 哪些没有, 哪些文件没有被Git追踪到。

如果git status 告诉有文件被修改过,可用git diff查看修改内容。若正是自己所修改的内容,便可放心的提交到仓库。

  1. Git有三个区域:

Working Tree 当前工作区域
Repository 提交的历史,即使用git commit提交后的结果
Index/Stage 暂存区域,和git stash命令暂存的地方不同。用“git add 文件名“可将该文件添加在Stage里

  1. git log 查看项目版本演变的历史信息(git status不显示已经commit到项目历史中去的信息)

git log --pretty=oneline 输出信息减少,无演变时间,只有commit id(版本号)和更改说明。
(Git的版本号与SVN不同,不是1,2…递增的数字,而是一个SHA1计算出来的一个很大的数,用16进制表示 → 原因:Git是DVCS,允许多人再同一版本库里工作,若大家都用1,2…作为版本号,那就冲突了)

git log --onelline 简洁查看变更记录(HEAD指向的版本是当前版本)

(一) 时光机穿梭

1. 版本回退

首先,Git必须知道当前版本是哪个。在Git中HEAD表示当前版本,上一个版本是HEAD,上上个版本是HEAD^,往上100个版本写为HEAD~100。

Git版本回退速度很快,因为Git内部有个指向当前版本的HEAD指针。当回退版本时,Git仅仅是改变了HEAD,然后顺便更新了工作区的文件。

(穿梭前,用git log查看提交历史,以确定要回退到哪个版本)

开始:把当前版本回退到上一个版本,可用git reset - -hard HEAD^,然后用“cat 文件名“查看文件内容以验证版本是否回退。

此时用git log查看版本库状态可发现最新版本的消失了,但可利用最新版本的版本号把它找回来。

1)若上面的命令行窗口还未关闭:

可从之间的操作历史中得到新版本版本号为3e2df82…,可用git reset --hard 3e2df找回(版本号没必要写全,前几位即可,git会自动去找。但也不能只写前一两位,因为git可能会找到多个版本号,便无法确定是哪个了),再用cat命令查看就发现消失的最新版本又回来了。

附:git reset的三种模式:https://www.jianshu.com/p/c2ec5f06cf1a

2)若忘记版本号:

找到新版本的版本号即可。Git提供了一个命令git reflog来查看历史命令,用此便可找到其版本号了。

2. 工作区和暂存区

Git和其他VCS如SVN的一个不同之处就是又暂存区的概念。
工作区(Working Directory):
在电脑内可见的目录,如我创建的版本库learngit文件夹就是一个工作区。
版本库(Repository):
工作区有一个隐藏目录“.git”,这个不算工作区,而是Git的版本库。

Git的版本库中存了很多东西,其中最重要的就是Stage(或叫Index)的暂存区,还有Git为我们自动创建的第一个分支master以及指向master的一个指针HEAD。

由此可见,之前往版本库内添加文件时:
先用git add将文件添加进去,实际就是把文件修改添加到暂存区;
再用git commit提交更改,实际就是把暂存区的所有内容提交到当前分支(因为创建版本库时,Git自动为我们创建了唯一一个master分支,so现在git commit就是往master分支上提交更改)

这两步可理解为,需要提交的文件修改全部放到暂存区,然后一次性提交暂存区的所有修改。一旦提交后,若你没有对工作区做任何修改,那么工作区就是“干净”的。

3. 管理修改

Git比其他版本的VCS设计得优秀是因为Git跟踪并管理的是修改(如创建新文件,添加行,删除内容等)而非文件。

若操作过程为 第一次修改→git add→第二次修改→git commit:
只有第一次修改被提交,第二次修改不会被提交。

提交后,用git diff HEAD – 文件名(readme.txt)可查看工作区和版本库里最新版本的区别,可证实第二次修改确实未被提交。

那如何提交第二次修改呢?

可继续git add再git commit;

也可先不提交第一次修改,git add第二次修改后再git commit,这相当于把两次修改合并后一块提交。(第一次修改→git add→第二次修改→git add→git commit)
每次修改若不用git add添加到Stage,那就不会加入到commit中。

4. 撤销修改

git checkout – file 丢弃file在工作区的修改,即把file文件在工作区的修改全部撤销,分三种情况:

一种是file自修改后还没被放入暂存区,现在撤销修改就回到和版本库一模一样的状态;
git checkout – file → cat 或 git restore file → cat

一种是file已添加到暂存区后又作了修改,现在撤销修改就回到添加到暂存区时的状态;
git checkout – file → cat

一种时file修改后并添加到了暂存区,但还未提交。
git reset HEAD file(把暂存区的修改撤销即unstage并重新放回工作区)[此时用git status查看可知暂存区是干净的,工作区有修改]→ git checkout - - file

总之,就是让file回到最近一次git commit或git add时的状态。

若已经提交了不合适的修改到版本库时,如果还未推送到远程库,可通过版本回退撤销本次提交。

执行完成后,用cat查看文件内容会发现内容果然复原了。

此命令中的 - - 很重要,没有–就变成了“切换到另一个分支”的命令。

5. 删除文件

先手动在文件管理器中删除file或用rm file命令删除(只删除了工作区的文件);
此时Git知道你删除了文件,因此,工作区和版本库就不一致了,git status会告诉你哪些文件被删除了。

现在有两种情况:

一是确实要从版本库中删除该file,那就用git rm file删除,并且git commit -m “remove file”

二是删错了想恢复,因为版本库内还有,所以可把误删的文件恢复到最新版本,用git checkout – test.txt (git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”,但从未被添加到版本库就被删除的文件时无法恢复的

若用的是git rm file删除文件,那就相当于不仅删了文件,还添加到了暂存区,需要先git reset HEAD file,再git checkout – file便可恢复文件到最新版本,但会丢失最近一次提交后你修改的内容。

(二)远程仓库

同一个git仓库可分布到不同机器上,每台机器“克隆“所得的版本库都相同且没有主次之分。

一台电脑也可以克隆多个版本库,只要不在同一个目录下。

GitHub提供git仓库托管服务,本地git仓库和GitHub仓库之间传输时通过SSH加密的,so需要一点设置:

1) 创建SSH Key:ls -al ~/.ssh查看本地是否已经存在,若无,Windows下打开Git Bash输入ssh-keygen -t rsa -C “youremail@example.com” ,提示你保存.ssh/id_rsa的路径是/Users/xxx/.ssh/id_rsa,直接按回车。(若已经存在SSH key你想用以上操作重新生成的话会提示。若你不是要重新生成,直接输入y并按回车。)

之后会提示你设置passphrase。与git通信时会要求输入passphrase,也可不设置。

完成后,主目录里的.ssh目录内含id_rsa和id_rsa.pub两个文件,就是SSH Key的密钥对,前者是私钥,不能泄露,后者是公钥,可以放心告诉任何人。

2)登录GitHub,打开个人账户设置,“SSH and GPG keys”页面,添加 SSH Key。

另:
① GitHub需要SSH Key是因为GitHub要识别推送的提交时本人操作,而Git支持SSH协议,所以GitHub知道了你的公钥后便可确认是你本人操作。
② Github允许你添加多个Key(把你使用的每台电脑的Key都添到Github)。
③ GitHub上免费托管的git库任何人都可以看到(但仅自己可改),所以不要放入敏感信息。
④ 若不想他人看到git库有两个办法。一是充值,让GitHub把公开库变成私有的他人不可读不可写。二是自己搭一个git服务器。

1. 添加远程库

(DVCS好处之一便是在本地工作不需考虑远程库的存在,有没有联网均可正常工作。当有网的时候,把本地提交推送一下就同步了)

在GitHub中创建一个新的仓库,目前这个仓库还是空的,你可以从这个仓库克隆出新的仓库,也可把一个已有的本地仓库与之关联,然后把本地仓库的内容推送到GitHub库。

进行关联:

在本地的仓库下运行git remote add origin git@github.com:GitHub账户名/仓库名.git ,添加后远程库的名字就是origin(git默认叫法,也可改为别的但origin这个名字一看就知道是远程库)

下一步用git push命令把本地库的内容推送到远程库上git push -u origin master,这个命令实际是把当前分支master推送到远程库。

由于远程库是空的,我们第一次推送master时加上了-u参数,这样git既把本地master分支内容推送到远程新的master分支,又把本地的master分支和远程的master分支关联起来,在以后的推送或拉取时就可简化命令。此后再推送用git push origin master即可。

另:
若推送时出先SSH警告:
The authenticity of host 'github.com‘ can’t be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?

输入yes回车即可

之后可能会出现 :
Permanently added the RSA host key for IP address ‘52.74.223.119’ to the list of known master,可参考:
https://blog.csdn.net/u25th_engineer/article/details/100167400

2. 从远程库克隆

切换到本地库(已初始化的)所在的目录下,
git clone git@github.com:账户名/被克隆库名.git 命令
git clone https://github.com/账户名/被克隆库名.git克隆到本地。

Git支持多种协议,如https、ssh,但通过ssh支持的原生git协议速度最快,而https除了速度慢,每次推送还要输入口令。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值