目录
1. Git,GitHub,GitLab的概念
1.1 什么是Git?
1.2 什么是GitHub?
1.3 什么是GitLab?
1.4 常用术语介绍
2. 常用命令
2.1 获取Git仓库
2.1.1 从现有项目中初始化仓库
2.1.2 克隆现有的仓库
2.2 记录每次更新到仓库
2.2.1 检查当前文件状态
2.2.2 跟踪新文件:工作区到暂存区
2.2.3 提交新文件:暂存区到本地仓库
2.2.4 修改文件后,将文件从工作区提交到暂存区,再到本地仓库
2.2.5 丢弃工作区变更:git checkout -- 文件名
2.2.6 丢弃暂存区变更:git reset HEAD 文件名
2.2.7 丢弃本地仓库变更:git reset -- hard HEAD^
2.2.8 删除文件:rm 文件名,git rm 文件名
Git是一个分布式版本控制系统。
版本控制是一种在开发过程中对文件,目录,工程等内容的修改进行管理和备份。
以方便查看历史记录和恢复以前版本的软件工程技术。
如果说Git是一种版本控制系统,是一个命令集,是一种工具。
那么GitHub就是基于Git实现的在线代码仓库,它包含一个网站界面,向互联网开放,用于创建公
共的仓库。如果用户需要创建私有仓库,需要付费。
GitLab是一个基于Git实现的在线代码仓库软件,支持用户免费创建公共和私有的仓库,还支持用
户搭建类似于GitHub的本地版本控制系统,一般用于在企业,学校等内部网络搭建Git私服。
(1)仓库 repository:受版本控制的所有文件修订历史的共享数据库
(2)工作空间 workspace:本地硬盘或UNIX用户账户上编辑的文件副本
(3)工作树/区workking tree:工作区中包含了仓库的工作文件
(4)暂存区 staging area:暂存区是提交更改(commit)前,工作区用来暂存工作区的变化
(5)索引 index:索引是暂存区的另一种术语
(6)签入 checkin:指将新版本复制回仓库
(7)签出 checkout:指从仓库中将文件的最新修订版本复制到工作空间
(8)提交 commit:对各自文件的工作副本做了更改,并将这些更改提交到本地仓库
(9)冲突 conflict:多人对同一文件的工作副本进行更改,并将这些更改提交到仓库
(10)合并 merge:将某分支上的更改连接到此主干或同为主干的另一个分支
(11)分支 branch:从主线上分离开的副本,默认分支叫master
(12)锁 lock:获得修改文件的专有权限
(13)头 headers:头是一个象征性的参考,常用以指向当前选择的分支
(14)修订 revision:它表示代码的一个版本状态。Git 通过SHA1 hash算法表示的ID来标示不同的版本
(15)标记 tag:指的是某个分支某个特定时间点的状态,通过标记,可以很方便的切换到标记时的状态
获取Git项目仓库有两种方法。
(1)仓库初始化
如果打算使用Git来对现有项目进行管理,只需要进入到该项目目录下,执行命令:# git init
(2)解析:
该命令将创建一个名为.git的子目录。
这个目录包含了初始化的Git仓库中所有的必需文件,这些文件是Git仓库的骨干。
注意,到这时仅仅做了初始化操作,项目中的文件还没有被跟踪。
(1)克隆仓库的本质
如果想要获得一份已存在的Git仓库的复制品,要用 git clone 命令。
Git克隆的是该Git仓库服务器上的几乎所有数据,而不是仅仅复制完成工作所需要的文件。
执行 git clone时,默认配置下远程Git仓库中的每一个文件的每一个版本都将被拉取下来。
(2)命令格式: git clone [url]
(3)示例:
比如要克隆API-test库,则: # git clone https://github.com/StormPuck/API-test
这会在当前本地目录下创建一个名为API-test的目录,并在这个目录下初始化一个 .git 文件夹。
并从远程仓库拉取下来所有数据放入.git文件夹,然后从中读取最新版本的文件的复制品。
如果进入这个新建的libgit2文件夹,会发现所有的项目文件都已经在里面 (?),准备就绪等待后续的开发和使用。
(4)如果想在克隆远程仓库时,自定义本地仓库的名称,可用命令:
# git clone https://github.com/StormPuck/API-test local-git
得到一个Git仓库后,要对仓库中的文件进行操作,并在操作完成时提交更新到仓库。
工作目录下的每个文件不外乎两种状态:已跟踪,未跟踪。
(1)已跟踪的文件
指那些被纳入版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改,已放入暂存区。
(2)未跟踪的文件
除了已跟踪的文件之外的其他文件,它们既不存在于上次快照的记录中,也没有放入暂存区。
(3)注意:
初次克隆时,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。编辑文件后,这些文件被Git标记为已修改文件。逐步将这些已修改文件放入暂存区,然后提交所有暂存了的修改,如此反复。
命令: # git status
(1)如果克隆完仓库后,不做任何修改,使用该命令,输出如下:
说明现在的工作区很干净,即所有已跟踪文件在上次提交后都未被更改,且当前工作区没有出现任何跟踪状态的新文件。
(2)此时,在工作区创建一个新文件 readme,使用该命令,输出如下:
可以看到新建的readme文件出现在untracked files下面。
未跟踪文件意味着Git在之前的快照(提交)中没有这些文件。
Git不会自动将之纳入跟踪范围,除非明白告诉它“我需要跟踪该文件”, 这样的处理让用户不必担心将生成的二进制文件或其他不想被跟踪的文件包含进来。
命令: # git add 新文件名
比如:
# git add .
# git add readme
# git status
此时能看到readme文件已经被跟踪,并处于暂存状态。
命令: # git commit -m "message", 该命令用来提交变更的文件。
比如:
# git commit -m "add readme file"
# git status
上述将文件readme提交到本地仓库,并查看状态,此时工作目录又变干净了,没有东西要提交。
(1)修改一个文件,比如用vi命令修改readme文件 (centos7中),添加一些内容,保存退出。
(2)使用 #git status 查看(下图),查看相关提示信息,会提示文件有变化但没有更新等等。
(3)使用 # git add 命令将文件添加到暂存区,然后再次查看状态 # git status
(4)使用 #git commit -m "message" 命令,提交文件变更到本地仓库,再次查看状态 # git status
(5)再次更改文件 readme
(6)使用 # git commit -a -m "message"命令,跳过暂存区,直接提交到仓库
(1)更改文件 readme,查看状态 # git status
(2)由于上一步的更改有问题,想要放弃本次变更
这里用命令: # git checkout -- readme(readme是文件名,--和文件名之间有空格)
(3)再次查看文件 readme,可以看到第一步的修改被丢弃了
(1)修改文件,然后通过 #git add 命令提交到暂存区后,想回退编辑怎么办?
(2)使用 # git reset HEAD readme 命令回退
(3)然后再查看状态 #git status, 看看是否已经回到了 # git add 之前的状态
(1)修改文件,然后已提交到本地仓库,想回退编辑怎么办?
(2)使用 #git log 命令查看仓库提交历史信息, git log 命令显示从最近到最远的提交日志
注意: commit id (版本号).
上一个版本是HEAD^, 上上一个版本就是HEAD^^...往上50个版本写成HEAD~50
(3)现在要回退到上一个版本,使用 # git reset -- hard HEAD^命令,看看是否回退成功
(4)使用 #cat readme 查看文件内容,是否回到了上一个版本的内容情况
(5)再用 # git log 命令查看版本信息,之前看到的最新的一个版本已经不存在了。
(6)此时,如果又想要回最新的那个版本,怎么办?
如果窗口没关,应该能看到前面查到的最新那个版本的commit id
使用以下命令,再回到指定版本: # git reset -- hard xxxxxxxxxxxxxxxxx(这一串就是已经被撤销的那个最新的版本的commit id)
(1)参考上面的操作,新建一个文件 hello.txt,提交到仓库。
(2)如果此时想在本地将该文件删除,使用 rm hello.txt 命令
(3)使用 # git status 命令查看状态
(4)到了这一步,有两个选择。
一个是删错了,由于版本库还有该文件,所以可以使用 # git checkout 命令轻松将其找回。
# git checkout -- hello.txt
# git status
# ls
一个是确实想从版本库中删除该文件,则使用下面的命令。
# git status
# git rm hello.txt
# git status
# git commit -a -m "delete hello.txt"
# git status