Git 新手使用学习手册
一、Git 概述
1.Git 介绍
git 是目前世界上最先进的分布式版本控制系统。通过对信息的压缩和摘要,所占空间小,能够支持项目版本迅速迭代的开发工具。
版本控制系统:是一种记录一个或者多个文件内容变化,便于查阅特定版本修订情况的系统。
例如,为论文准备文稿时,对文稿的多次删除或更改,造成有许多版本的文稿内容,在之后的修改过程中,因内容变动,需退回之前的文稿,就需要查阅之前的版本。
2.Git 安装
git 是一个类似于 Python 的开发工具,使用前需要下载安装,选择不同平台下载安装包,即可安装。
- Windows:Git - Downloading Package (git-scm.com)
- macOS:Git - Downloading Package (git-scm.com)
- Linus and Unix:Git (git-scm.com)
二、Git 分区
为理解 git 的基本工作方式,需要了解三大分区、文件三大状态,分区转换指令,以及分区内容对比指令。
1.三大分区和三大状态
(1)存储三大分区
-
工作区(Working Directory)
用于直接编辑文件的区域,对于新增的文件,如果没有 add 到暂存区,就会以红色形式放置在工作区。
-
暂存器(Stage, index)
数据暂时存放的区域,使用 add 指令版本控制的文件,也就是进入暂存区了。以计算机工作方式理解为,数据存入内存条,还未存入硬盘中。由于还未存入本地仓库,也就是数据暂存的区域。
注:信息存放于 .git 目录下的 index 文件中(.git/index)。
-
版本库,又称本地仓库(commit History)
在暂存区的文件执行 commit 指令会将文件放入版本库中。可以理解为版本存入到本地计算机,若执行 push 指令,会将本地仓库内文件发送至远程仓库,可类比云存储过程。
注:版本信息存放于工作区中 .git 目录下。
(2)文件三大状态
-
已修改(modified)
已修改表示修改了文件,但还没保存到暂存区中。文件为
-
已暂存(staged)
已暂存表示对一个已修改文件的当前版本做了标记,使之在下次提交的快照中,被保存于暂存区中。
-
已提交(committed)
已提交表示数据已经安全的保存在本地数据库中。
2.分区转换指令
-
git add
数据从工作区转移至暂存区
-
git commit
数据从暂存区存入版本库,即存入本地仓库
-
git push
数据从版本库中发送到远程仓库
-
git pull
数据从远程仓库取回到本地仓库
注:远程仓库操作,需要创建 GitHub 账号,并建立远程仓库,将本地仓库与远程仓库连接后进行操作。
2.分区对比指令
当文件版本过多,其中文件可能因为修改,造成文件的差异,使用分区对比指令,对文件差异进行对比,便于在工作区进行修改再次上传。
-
git diff
工作区与暂存区对比
-
git diff head
工作区与版本库对比
-
git diff --cached
暂存区与版本库对比
三、Git 配置
使用 git 更新到远程仓库时,需要以下准备,用户配置和查看和远程仓库配置。
1.用户配置
在第一次使用 git 时,需要进行用户的配置,也就是提供用户名称和用户邮箱,用于在多人协作的场景下,能找到更改部分的作者以及联系方式。
-
相关命令
//设置全局用户信息 git config --global user.name [用户名] git config --global user.email [邮箱] //查看用户名称 git config user.name //查看用户邮箱 git config user.email //检查所有配置信息 git config --list
2.远程仓库配置
(1)生成 SSH key
创建一个 Github 账号后,就可以自由的 clone 或者直接下载 .zip 文件,也可以创建新的项目,但是不能没法提交代码。
在提交代码之前,Github 需要 SSH 的授权,Linus 与 Mac 默认安装了 SSH,而 Windows 系统安装 git bash 也应该安装了 SSH。可以在终端下(win 下在 git bash 里)输入 ssh 命令检测。
接下来输入 ssh-keygen -t rsa 命令,就是指定 rsa 算法生成密钥,接下来三个回车(不需要输入密码),然后就会生成两个文件 id_rsa 和 id_rsa.pub,而 id_rsa 是密钥,id_rsa.pub 就是公钥。
这两个文件默认分别在以下目录中生成:
Linus/Mac 系统在 ~/.ssh 下,Windows 系统在 /c/Documents and Settings/username/.ssh 下,两个文件为隐藏文件。
之后需要将 id_rsa.pub 的内容添加到 Github 上,本地的 id_rsa 密钥和 Github 上的 id_rsa.pub 公钥进行配对,授权成功才可提交代码。
(2)GitHub 上添加 SSH key
在 GitHub 上的设置页面,点击最左侧 SSH and GPG keys,选择 New SSH key 按钮,将 id_rsa.pub 公钥文件粘贴到 Key 栏中,Tittle 栏无需填写,保存结束。
SSH key 添加成功后,输入 ssh -T git@github.com 进行测试,如果出现以下提示证明添加成功。
四、Git 本地操作
git 在实际使用过程中的常见操作和常见问题,创建本地仓库、版本回退、撤销修改和删除文件。
1.创建本地仓库
在使用 git 服务之前,需要将文件夹设置为 git 文件夹,否则无法进行 git 控制,创建成功后,在目录下将出现隐藏文件夹 .git,用于跟踪管理版本信息。
-
当未进行项目初始化之前,无法进行 git 操作,打开 git bash 使用 git status 查看文件状态,会出现以下提示
-
在项目目录下,单击右键打开 git bash 进行操作
-
使用指令 git init 对文件夹进行初始化,此时在文件夹中出现隐藏文件 .git
-
此时再使用 git status 查看文件状态,会提示项目在当前分支下,无提交版本!
-
使用 git add <文件名> 【git add . ,提交全部文件】将单独文件从工作区转换至暂存区,再使用 git status 查看文件状态,目前在本地仓库依旧无版本,但在暂存区出现文件名
git status:最常用的命令之一,用于查看工作区和暂存区的状态,也可使用于查看是否还有文件未提交。
若所有文件都已经从工作区、暂存区提交,则显示在当前分支上,没有被跟踪的文件。
-
接下来,将暂存区的文件提交至本地仓库,使用 git commit -m "备注信息" 【git commit -a -m "备注信息",-a 表示无需执行 git add 命令,直接提交】,此时使用 git log 查看已经提交版本以及相关信息
git commit -m "备注信息":其中的 -m 用于备注当前版本的相关信息,若没有 -m,Git 会尝试打开编辑器以填写信息。
-
若此时修改文本内容,再输入 git status 查看文件状态,提示文件存在未被提交的修改,使用 git diff 查看工作区与暂存区文件差异,可以看到增加了内容 2.0
-
使用 git add a.txt 提交现版本文件到暂存区,再次修改工作区,此时工作区、暂存区和本地仓库文件应不相同,依次使用 git diff 对比工作区和暂存区文件异同,git diff --cached 对比暂存区和本地仓库,git diff head 对比工作区和本地仓库
-
将后两个版本都提交到本地仓库,使用 git commit -m “+2.0“ 将暂存区文件提交至本地仓库,使用 git commit -a -m "+3.0" 从工作区直接提交至本地仓库
2.版本回退
(1)以版本号实现
以上操作创建了多个版本的文件到本地仓库后,在实际操作中,可能会出现需要推到某个版本中,将文件从本地仓库将退回暂存区,以及从最新版本退回后,git log 无法查看最新版本,使用 git reflog 查看日志查看版本号退回。
-
现在使用 git log 查看已经提交的版本,其中出现 (HEAD -> master) 表示当前分支下,所指向的版本,退回版本需要使用到 HEAD 进行操作
-
从本地仓库退回暂存区,HEAD 指向当前所在的前一个版本,此时 git log 无法查看到之前指向最新的版本
- 第一种方法,使用 git reset --hard HEAD^ (退回上一个版本),git reset --hard HEAD^^ (退回上上个版本),以此类推
- 第二种方法,使用 git reset --hard HEAD~100 (退回前 100 个版本)
-
若此时需要退回最新版本,使用 git reflog 查看操作日志,找到最新版本的版本号,使用 git reset --hard <版本号> 退回最新版本,使用 cat <文件> 查看文件中内容
cat <文件>:用于查看工作区的内容,对比可知工作区和本地仓库版本。
(2)以标签实现
在实际使用中,针对本地仓库中不同版本的提交 commit 做标签,类似于起别名,常见的标签形式有:v1.0、v2.0,诸如此类。
git 中提供一个 tag 命令,用于对某一次的提交 commit 做标签,相当于给版本号做了标记,此时,除了通过 git log 查看版本命令;git reflog 查看日志命令,找到版本号;还可以通过查看标签,找到版本号信息。
-
常用命令:
/*创建标签*/ //给当前指向 commit 本地仓库版本设置标签 git tag <标签名> //给指定提交版本创建标签 git tag <标签名> <提交版本号> /*查看标签*/ //直接列出所有标签 git tag //根据其中包含信息,对标签筛选,如选择带有 v4.0 信息的标签 git tag -l "信息*" //查看标签的信息 git show <标签名> //删除标签,指定删除标签名称 git tag -d <标签名>
3.撤销修改
撤销修改操作,针对于工作区与暂存区,将暂存区的文件撤销,在提交之前,发现文本有误需要修改,则暂存区撤销修改退回前一次添加。
-
先输入 git status 查看当前文件状态,显示文件均已提交,再在工作区修改文本内容,输入 git add a.txt 将工作区文件转换到暂存区
-
先使用 cat <文件> 查看工作区内容,再次输入 git status 查看文件状态,为撤销修改内容,有两种情况
-
第一种情况,输入 git restore --staged <文件> 将暂存区文件撤销,退回到上一次修改状态,对工作区文件内容无修改
-
第二种情况,输入 git restore <文件> 暂存区文件不进行撤销修改,工作区在暂存后修改的内容进行撤销,若工作区文件无修改则无变化
以下为文件转换暂存区,暂存区内容到”4.0“,工作区增加”5.0“内容
-
4.删除文件
当文件中有文件需要删除,有多种删除命令,完成不同的功能。
-
rm 命令
作用:删除工作区文件,等同于直接在文件中删除文件。
执行删除命令:
$ rm test.txt
查看状态(成功删除工作区文件):
$ 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) deleted: test.txt no changes added to commit (use "git add" and/or "git commit -a")
rm 命令只是删除了工作区的文件,并没有删除版本库的文件,想要删除版本库文件还需执行以下命令:
$ git add test.txt $ git commit -m "delete test"
此时,更新了暂存区和本地仓库的文件,彻底删除。
-
git rm 命令
作用:删除工作区文件,并且将这次删除放入暂存区
注意:要删除的文件是没有修改过的,也就是与当前本地仓库的内容相同。
执行删除命令:
$ git rm test.txt rm 'rest.txt'
查看状态(成功删除了工作区文件,并将这次删除放入了暂存区):
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: test.txt
提交版本(成功删除了版本库文件):
$ git commit -m "delete test" [master f05b05b] delete test 1 file changed, 3 deletions(-) delete mode 100644 test.txt
删除了工作区和版本库的文件,因暂存区不可能有该文件(如果有意味着该文件修改后 git add 到暂存区,那样 git rm 命令会报错,如下情况)
-
git rm -f 命令
作用:删除工作区和暂存区文件,并且将这次删除放入暂存区
注意:要删除的文件已经修改过,也就是与当前本地仓库的内容不同
-
test 文件修改过还没 git add 到暂存区
$ git rm test.txt error: the following file has local modifications: test.txt (use --cached to keep the file, or -f to force removal)
-
test 文件修改过已经 git add 到暂存区
$ git add test.txt $ git rm test.txt error: the following file has changes staged in the index: test.txt (use --cached to keep the file, or -f to force removal)
可见文件修改后,无论是否 git add 到暂存区,使用 git rm 命令删除就会报错。
解决方法:
执行删除命令:
$ git rm -f test.txt rm 'test.txt'
查看状态(成功删除工作区和暂存区文件,并且将这次删除放入暂存区):
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: test.txt
提交版本(成功删除了本地仓库文件):
$ git commit -m "delete test" [master 9d5d2d2] delete test 1 file changed, 3 deletions(-) delete mode 100644 test.txt
删除了工作区、暂存区和本地仓库的文件。
-
-
git rm --cached 命令
作用:删除暂存区文件,但保留工作区文件,并且将这次删除放入暂存区。
执行删除命令:
$ git rm --cached test.txt rm 'test.txt'
查看状态(成功删除暂存区文件,保留工作区文件,并且将这次删除放入暂存区,注意这里文件取消了跟踪):
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: test.txt Untracked files: (use "git add <file>..." to include in what will be committed) test.txt
提交版本(成功删除了本地仓库文件):
$ git commit -m "delete test" [master 223d609] delete test 1 file changed, 3 deletions(-) delete mode 100644 test.txt
删除了暂存区和本地仓库的文件,但保留了工作区的文件。
如果文件有修改并 git add 到暂存区,再执行 git rm --cached 和 git commit ,那么保留的工作区文件是修改后的文件,同时暂存区的修改文件和本地仓库的文件也被删了。
五、Git 远程操作
将本地仓库中的文件发送到远程仓库中,首先需要创建一个远程仓库,且连接本地仓库和远程仓库,最后提交版本。
1.创建远程仓库
-
创建 Github 账号后,在主页位置选择“+”,点击新建仓库,跳转到创建仓库界面。
-
在创建仓库界面,输入仓库名称和描述,一般选择添加 README 文件,点击创建,完成了远程仓库的创建。
2.连接远程仓库
-
首先需要获取远程仓库地址,打开远程仓库,点击代码按钮,可以选择弹出的 HTTP 或 SSH 两种协议,任选其中之一的地址复制。
-
之后需要将地址告知本地仓库,在本地仓库中,打开 git bash 配置远程仓库信息,使用以下命令:
//添加远程版本仓库 git remote add <仓库地址重命名> <远程仓库 HTTP 或 SSH 地址> /*相关命令*/ git remote -v //显示所有远程仓库 git remote rm name //删除远程仓库 git remote rename <旧命名> <新命名> //修改仓库名 /*以下为示例*/ //将地址重命名为 neiwang git remote add neiwang http://192.168.1.100/zhangsan/sixsixsix.git //将地址重命名为 origin git remote add origin http://192.168.1.100/zhangsan/sixsixsix.git
-
接下来,只需要在本地仓库进行提交即可,通过以下命令完成:
-
第一种,通过分支名提交到远程仓库
//将指定分支上传到远程仓库 git push <仓库地址命名> <分支名> //示例 git push origin master
-
第二种,通过标签名提交到远程仓库
//将指定标签上传到远程仓库 git push <仓库地址命名> <标签名称> //将所有不在远程仓库中的标签上传到远程仓库 git push <仓库地址命名> --tags //删除远程仓库的指定标签 git push <仓库地址命名> :<标签名称> git push <仓库地址命名> --delete <标签名称>
-
3.远程仓库下载
从远程仓库获取版本方式有两种:
-
第一种,使用命令,从远程地址获取代码并合并到本地的版本
//从远程仓库地址获取所需分支,并选择与本地分支合并 git pull <远程主机名> <远程分支名>:<本地分支名> //当远程分支是与当前分支合并,则冒号后部分可省略 git pull <远程主机名> <远程分支名> /*示例*/ //拉取远程主机 origin 的 master 分支,与本地的 brantest 分支合并 git pull origin master:brantest //远程分支与当前分支合并 git pull origin master
-
第二种,复制远程仓库的地址后,通过命令,将远程仓库的代码下载到本地,此时下载的版本等同于下载新的文件,需要手动调取文件,不自动进行合并,重名不可下载
//从远程地址克隆一个本地库 git clone <远程仓库地址 HTTP 或 SSH> //克隆一个项目 git clone http://192.168.1.100/zhangsan/sixsixsix.git
六、分支创建与合并
git 可进行开发主线的分离操作,在不影响主线开发的同时继续工作。
对于个人开发者,则可分为稳定版主线,以及修改版分支,当修改完成后,再进行分支合并操作。
1.创建、切换与删除分支
-
相关命令:
//查看分支 git branch //创建新分支 git banch <分支名> //以标签为基础,创建分支 git checkout -b <分支名称> <标签名称> //切换分支命令 git checkout <分支名> //删除分支 git branch -d <分支名>
2.分支合并与冲突
(1)分支合并
当分支内容,最终会需要合并回主线上,且常常合并完分支后,就会删除分支。
-
使用以下命令进行分支合并操作:
//首先切换至主线上,再将所选分支合并到当前分支中 git merge <分支名>
(2)分支冲突
合并并不是简单的文件添加、移除的操作,当两个或多个分支,修改同一个位置,但所修改结果不同,git 就会提示报错。
解决方法是,在 git 中对比文件内容差异,选取其中一种或都不选,然后在工作区中总体修改这部分内容,将内容修改一致后,再使用 git add 告知 Git 文件冲突已解决,解决后就可提交结果。