Git 常用操作(一)

一、Git 简介

"版本控制系统"(Version Control System,VCS)是程序代码管理软件的通称,是用来保存程序文件的修改记录以及历史版本,以便日后查看或是使用。VCS早期的系统是采用集中管理和控制的方式,比如 SVN。新的 VCS 改成采用分布式的方式,比如 Git。当前市场上占有率最高的 VCS 有两套:Subversion(简称 SVN )和 Git。现在越来越多的软件公司开始使用Git管理程序项目,网络上也有专门提供 Git Server 服务的网站,像是 GitHub 和 GitLab。

Git 的开发者其实就是 Linux 的作者 Linus Torvalds,Git 是免费、开源的,最初 Linux 内核开发使用 Bitkeeper 管理代码,此时 Bitkeeper 是免费的,后来却要收费,因此 Torvalds 打造出自己的VCS 工具 Git 用来替代 BitKeeper。

二、集中式和分布式

集中式是指只有一个远程版本库,而分布式有本地和远程版本库。

方便性:SVN 是集中式版本控制系统,版本库是集中放在中央服务器的,拉代码的时候需要联网从中央服务器哪里得到最新的版本,提交代码也同样。集中式版本控制系统是必须联网才能工作;Git 是分布式版本控制系统,它没有中央服务器的,每个人的电脑就是一个完整的版本库。工作的时候就不需要联网了,因为每个人的电脑都有一个完整的版本库。如果没有网络仍然能够提交文件,查看历史版本记录,创建项目分支;

安全性:对于 SVN 来说,如果存储远程版本库的服务器挂了,所有人的代码都无法提交,甚至丢失版本库。而 Git 则因为有本地版本库而不会有这个问题。

三、Git 的工作方式

由上图可以看出,通常情况下,Git 的工作流程如下所示:

(1)我们在工作区目录中添加、修改代码文件;

(2)我们运行 git add . ,将工作区(workspace)的代码提交到了暂存区(index)中;

(3)然后我们运行的 git commit -m "修改代码提交说明" 将暂存区中的代码提交到本地仓库(local Repository)中;

(4)最后我们通过 git push 将本地仓库的代码推送到远程仓库(Remote Repository)了。

四、Git 文件状态

在 Git 中,文件的状态主要有如下几种:

说明:

(1)新建文件 ---> Untracked

(2)使用 add 命令将新建的文件加入到暂存区 ---> Staged

(3)使用 commit 命令将暂存区的文件提交到本地仓库 ---> Unmodified

(4)如果对 Unmodified 状态的文件进行修改 ---> modified

(5)如果对 Unmodified 状态的文件进行 rm 操作 ---> Untracked

五、Git 常用命令

Git 常用命令如下所示:

# 创建文档库repository,即.git子文件夹
git init

# 指定dev分支-b dev,默认克隆master分支内容
git clone -b dev https://xxxxxxx

# 更新远程代码到本地工作区
git pull

# 显示当前Git的状态,查看我们当前工作区修改的文件状态
git status

# 比较当前工作区(即未提交到暂存区),与暂存区(即已经执行了git add)之间文件内容的不同,显示具体内容的修改变化(删除了红色行 ,新增了绿色行的代码)。其实此时运行的 git diff 相当于 git diff HEAD(HEAD 指向的是 local repository 中最新提交的版本)。
git diff file_name

# 把文件内容加入Git系统的索引,即暂存区
git add file_name

# 从暂存区将文件提交到本地仓库
git commit -m 'commentxxxx'

# 将本地仓库代码推送至远程仓库
git push

# 查看提交日志
git log

# 显示完整的辅助说明指令列表
git help -a 

# 显示init指定指令的说明信息
git init -help

# 使用图形化工具查看
gitk

5.1 Git 配置文件

Git 有三个不同级别的配置文件,它们有不同的优先级,高优先权文件的设置项会覆盖低优先权文件中相同的设置项。以下按照优先权从高到低按序如下:

(1)项目文件夹中 ".git" 子文件夹内的 config 文件

这个配置文件具有最高的优先权,使用如下命令可以查看该配置文件的内容。

git config --local -l

(2)操作系统登录账号的 home directory 中的 .gitconfig 文件

这个配置文件具有中等优先权,文件通常在 C:\Users\moonxy\.gitconfig,使用如下命令可以查看该配置文件的内容。

git config --global -l

(3)Git 程序的安装文件中的 etc\gitconfig 文件

这个配置文件具有最低优先权,文件通常在 C:\Program Files\Git-2.24.1\etc\gitconfig,使用如下命令可以查看该配置文件的内容。

git config --system -l

使用 git config -l 可以同时查看上面三个配置文件中的所有设置项。

如下我们将操作者的姓名和 email 记录在文档库对应的配置文件中:

git config user.name 'moonxy'
git config user.email 'moonxy@qq.com'

此处省略了 --local,默认设置在文档库的配置文件中,也可以添加 --global 和 --system 选项来设置在其他优先级的配置文件中。

如果要删除文档库配置文件中的操作者姓名,可以执行如下命令:

git config --unset user.name

我们可以定义指定的别名(alias),也就是用简短的缩写来表示标准的命令,如下:

# git config alias.指令别名 '正式的指令和选项'
git config alias.cfg 'config -l'

之后使用 git cfg 就表示 git config -l

# 删除别名
git config --unset alias.cfg

修改默认的文本编辑器,比如从 nano 修改为 vim,命令如下:

git config --global core.editor 'vim'

修改文件对比程序,使用 git difftool 命令,在配置文件中指定自己习惯的文件对比程序,比如 KDiff3 或者 WinMerge,如下:

git config --global diff.tool kdiff3

git config --global difftool.kdiff3.cmd \
"'C:\Program Files\KDiff3\kdiff3.exe' \"\$LOCAL\" \"\$REMOTE\""

git config --global difftool.prompt false

设置好之后再次执行 git difftool 指令,就会启动 KDiff3 程序,并且显示文件对比的结果。

5.2 把文件存入 Git 文档库

使用 .gitignore 文件排除不需要加入文档库的文件

在 .gitignore 文件中可以用 "#" 字符开头表示注释,文件夹路径是由 "/" 字符,文件名可以使用通配符 "*"。另外还可以使用 "!" 字符表示排除,例如以下设置表示要忽略所有扩展名为 txt 的文件,但是不包含 note.txt:

*.txt
# 设置不要忽略 note.txt 文件
!note.txt

控制 Commit

"git rm" 指令用来删除文档库中的文件或是 Git 索引(暂存区)中的文件,也可以删除工作区中的文件。如下:

git rm 文件名

如果执行 "git rm" 时加入 "--cached" 选项如下:

git rm --cached 文件名

表示删除文档库中的文件或是 Git 索引(暂存区)中的文件,但是保留了本地工作区的这个文件,只是不希望这个文件被版本控制。

Commit 节点

gitk 指令启动图形查看模式后,窗口下方的 "SHA1 ID" 字段就会显示该节点的标识符,也可以使用 "git log" 指令达到相同的目的,如果加上 "--graph" 选项,会用文本模式排列出 commit 节点的演进图,如果搭配 "--oneline" 选项,可以用最简便的方式显示。

git log --oneline

Git 还提供一个叫作 HEAD 的节点标签,这个节点标签可以简写成 "@",这个节点标签永远代表最新的 commit,比如执行如下的指令,显示最新 commit 的详细数据:

git show HEAD

要指定某一个节点之前的节点可以使用以下格式:

节点标签或者标识符^数字
节点标签或者标识符~数字

其中 "^" 用来指定是哪一个父节点,"~" 用来表示哪一层的父节点。

如果要显示指定的 commit 节点中特定文件的内容,可以使用 "git show" 命令,格式如下:

git show [commit id]:文件名

commit 节点的标识符是一组很长的16进制数字,一般只要使用最前面4个数字,Git 会自动找出对应的节点。

除了 Git 内置的 HEAD 节点标签之外,我们可以给 commit 节点贴上自定的标签,"git tag" 指令格式如下:

# 自定义标签
git tag 自定义的标签名称 commit节点标识符或者标签

# 删除标签
git tag -d commit 节点标签

让文档库恢复到某一个节点的状态,即用于回退版本,可以指定退回到某一次提交的版本,"git reset" 指令格式如下:

git reset 选项 commit节点标识符或者标签

其中选项如果是 "--soft",表示只有文档库里面的数据会该表,Git 索引和工作区中的文件都不会受到影响;如果选项是 "--mixed"(这是默认选项),表示 Git 索引也会恢复到指定节点的状态,但是工作区中的的文件仍然不会受到影响;如果选项是 "--hard",则文档库、Git 索引和工作区中的文件,都会恢复到指定节点的状态。

从 Git 文档库中取出文件

我们可以从文档库中任何一个 commit 节点取出指定的文件:

git checkout [commit节点标识符或标签] 文件名1 文件名2

改变文件或者文件夹的名称

有时候我们需要更改文件夹中的文件名,然后把它记录在Git 索引中,接着只要执行 "git commit" 指令,就可以更新文档库。

git mv 原来的文件名或文件夹名 新的文件名或文件夹名

注意:

"git add ." 指令会把新增的文件和被修改的文件加入 Git 索引,但是被删除的文件不会记录在 Git 索引中。

"git add -u" 指令会把修改的文件和被删除的文件加入 Git 索引,但是新增的文件不会加入 Git 索引中。

"git add -A" 指令会把新增的文件、被修改的文件以及被删除的文件全部加入 Git 索引中。

参考资料:

一个小时学会Git

【Git】(1)---工作区、暂存区、版本库、远程仓库

posted on 2020-12-18 10:02  沐小悠  阅读(167)  评论(0编辑  收藏  举报