Git: 版本控制,git 工具的基本使用

1. 初始化仓库


我们以一个文件夹为例,演示如何使用 git 工具进行版本控制。然后用图来表示它的文件结构。

在文件夹中右键选择 git bash here ,打开 git 命令窗口。然后执行下面命令来初始化一个备份仓库。

git init

初始化后,文件夹中创建了一个隐藏文件夹 .git (需要显示隐藏文件夹才能看到) ,它就是用来备份文件的仓库,如下图所示。

此时文件夹的结构如下图所示。

版本库就是相当于仓库的一个库房,master 是分支名称,你可以理解为库房的门牌号。master 一般代表着主库房,我们称它为主分支。

2. 配置使用者的用户名和邮箱


我们在项目文件夹中创建文件并写入内容,来表示开始项目,并完成第一个模块,如下图所示。

文件夹的结构如下

为了防止文件被意外的损坏或丢失,我们需要对项目进行备份。原理是将项目文件夹中的文件拷贝至版本库。一个项目往往由多人合作完成,为了区分不同的开发者,在使用前配置自己的身份信息十分必要。

执行下面命令来配置自己的用户名

git config --global user.name “jia”

各参数作用如下表,全局配置会被保存,以后使用就不需要重新配置了。用户名称建议不要使用中文和特殊符号,这里以 jia 为例。

命令参数意义
git使用 git 工具
config配置
- - global全局作用
user name用户名

执行下面的命令来配置个人邮箱。输入的邮箱不会验证是否真实存在,但必须满足邮箱的格式。在开发中,请使用真实邮箱,这很有必要。

git config --global user.email “jia@xxx.com”

3. 存储操作


备份一共两步:先将需要备份的文件添加至暂存区,然后将暂存区的文件提交到版本库中。

执行下面的命令来将需要的文件添加至暂存区

git add ./readme.txt

参数作用如下表。这里以 readme.txt 文件作为演示。

命令参数意义
add添加文件至暂存区

执行成功后,文件夹结构如下图所示。

执行下面的命令来将暂存区的内容提交至版本库

git commit -m “this is first edition”

各参数如下表。备注信息很有必要,方便日后版本控制。如果没有 -m 参数,将进入 vim 编辑模式,按下 esc 键,然后输入 :q! 即可强制退出。

命令参数意义
commit提交暂存区
- m添加备注

操作成功后,备份完成。文件结构如下图所示

4. 更新版本库


继续完成项目的第二个模块,如下图所示。完成后,我们需要再次备份来更新版本库。

再次执行存储操作的相关命令,即可更新备份。

结构变化与存储操作一致,这里不再重复绘图。

5. 查看状态


继续完成项目第三个模块,如下图。

如果忘记了当前是否已经备份。可以执行下面的命令来查看当前备份状态

git status

参数如下表所示

命令参数意义
status查看状态

第一种结果如下图,得到红色的 modified 和红色显示的文件名称。代表文件修改后,没有添加至暂存区,也没有提交至版本库。

第二种结果如下图,得到绿色的 modified 和绿色显示的文件名称。代表修改的文件已经加入暂存区,但没有提交至版本库。

第三种结果如下图,没有上述的提示,代表版本库中的备份与当前的项目一致,说明已经备份。

执行 git status 命令,会比对当前文件夹与版本库中的备份,并检查暂存区,然后返回结果。

6. 多文件存储

继续完成第四个模块,假设过程中产生了新的文件,这里以 newfile.txt 做演示。如下图

执行查看状态,可以得到所有文件的状态。如下图

执行下面的命令可以一次性将当前目录下的所有已修改的文件添加至暂存区,如图

git add ./

接着,我们将这些文件提交至版本库中。

提交成功后,文件结构如下图

7. 跳过暂存区,直接存入版本库中


执行下面的命令可以直接将文件直接提交至版本库。

git commit --all -m “this is fifth edition”

8. 日志


执行下面的命令可以查看日志信息,如下图。

git log

参数含义
commit备份 id
Author操作者信息
Date操作时间

备份 id 可以唯一标识当次备份。最后的内容是当次操作添加的备注信息。

执行下面的命令 可以查看更加精简的日志信息

git log --oneline

参数如下表。效果如图所示

命令参数含义
- - oneline单行显示

黄色部分是备份 id 的简写,它依然可以唯一标识当次备份。后面是当次操作的备份信息。

第一条日志,就是最近一次备份的前面有 HEAD 字样,这个是当前时间,具体介绍请看下文

master 表示当前分支,具体介绍请看下文。

9. 版本回退


每个分支都有时间轴,用于记录当前分支所进行的操作,产生日志信息。

时间轴可如下图所示,黄色箭头为操作的时间点,黄色文字为该次操作的日志信息。绿色箭头表示当前时间点,我自己称它为当前时间指针。

如果项目出现意外,就需要从备份恢复,如下图

执行下面的命令 可以从最近一次备份恢复

git reset --hard Head~0

参数如下表。

参数含义
reset重置当前时间
- - hard覆盖当前内容
Head当前时间指针
~0回退 0 步

~0 表示将 Head 指针向前移动 0 步,就是指向的第五次备份。~1 表示将 Head 指针向前移动 1 步,就指向第四次备份。以此类推。--hard 表示使用 Head 指向的备份覆盖当前内容。相当于时间回溯,回到 Head 指向的那个时间点。

执行成功后,返回信息大致意思是当前状态已经回溯到了 id 为 49d9ccf 的备份,这里就是指第五次备份。然后重新打开项目文件,整个项目回到了第五次备份时的状态。

再演示一次,如下图

此时项目回到了第三次备份时的状态,其后新建的文件也不存在了。我们打印日志,如下图

日志内容也只显示到了第三次,但其之后的备份和日志信息都没有消失,只是被隐藏了。此时分支的时间轴为下图所示

还可以通过备份 id,回退到指定的版本,执行下面的命令可以回退到 id 所代表的备份

git reset --hard 备份id

下图演示回退到第二次的备份。

由于版本回退不会导致备份和日志消失,我们依然可以通过这个方法恢复到较新的备份。如下图所示

我们又成功的恢复至第五次的备份。时间轴如下图所示

如果记不住后面备份的 id 号,可以执行下面的命令来查看时间轴的所有日志,如图所示。

git reflog

这样就可以通过编号切换版本了。

10. 创建分支和切换分支


如果模块没有完成但需要备份,不能直接把不完整的代码备份到主分支中。否则,其他人获取到不完整的代码,将因为无法运行而没办法继续完成项目。

为了解决这个问题,我们就需要用到分支操作。

如上图,就是创建分支 jia 的过程,创建分支时,会将 master 分支的当前所有内容复制一遍,并建立新的时间轴。

两个分支相互独立,互不影响。我们可以将不完整的代码备份到该分支,当模块完成,再合并到主分支去。

下面用图解来演示一遍

如果此时我们需要备份,就创建一个新的分支。这里以 jia 作为演示。

然后将不完整代码备份到分支 jia 中去。

完成模块后,将模块放入 master 分支中。

下面用代码实现。执行下面的命令来创建一个分支。

git branch 分支名称

执行下面的命令来查看所有分支。

git branch

分支名称前面的星号 * 代表当前所在的分支。如下图所示

执行下面命令来切换当前所在分支。

git checkout 分支名称

下图演示从 master 分支切换至 jia 分支。

切换至 jia 分支后,所有操作都在 jia 分支上进行。下图演示在 jia 分支中进行备份。

当模块完成,需要将内容合并到主分支 master 中。

执行下面的命令将指定的分支合并到当前的分支。因为需要将 jia 分支合并到 master 分支,所以我们需要先切换至 master 分支,然后对 jia 分支进行合并。如图所示

git merge 分支名称

合并后,日志也得到了更新,如下图

11. 合并时文件冲突问题


执行下面的命令来删除分支。但是不能删除当前所在分支(不允许自杀行为),如下图

gir branch -d 分支名称

如果多个分支对同一个文件进行了修改或操作,在进行合并时候,就会产生文件冲突。因为系统不知道以哪个为准。

这里演示通过 jia 分支和 master 分支同时对 readme.txt 文件进行操作,然后合并它们形成冲突。

在 jia 分支中操作 readme.txt 文件后备份

在 master 分支中操作 readme.txt 文件后备份

然后我们对这两个分支进行合并

返回信息的大意是:文件冲突,自动合并失败。这个时候,需要我们手动进行合并代码,我们打开有冲突的文件,如下图所示。

<<<<<<HEAD====== 之间的部分,就是我们现在所在的分支 master 修改的内容,======>>>>>>jia 之间的部分,就是 jia 分支中修改的内容。

此时,我们需要手动删除掉不需要的部分。

假设需要保留 jia 分支所做的修改,我们将代码删除至如下状态。删除后,需要对项目再次备份。

至此,两个分支合并完成。

12. github 远程仓库实现版本控制


这里以 github 网站创建远程仓库为例,注册登录 github 网站后,在页面的右上角,展开加号 + ,然后选择 New repository 新建一个远程仓库。

然后填写创建仓库的资料和选项

创建完成后,会弹出一个如下图所示的页面。

git 命令窗口执行下面的命令将本地仓库的备份放入远程仓库。

git push 地址 分支名称

地址 是复制得到的网络地址( ctrl + v 无效,需要鼠标右键粘贴),分支名称 就是要把本地当前分支的备份放入远程仓库的哪个分支,建议与当前分支的名称一致。

如果是第一次执行此操作,则需要登陆 github 的账号。

执行成功后,刷新 github 网站或者打开仓库就可以看到备份文件。

13. 从远程仓库获取项目文件


如果其他开发者将模块上传到了远程仓库,我们需要将更新至本地项目文件夹中。首先,我们在 github 上打开仓库,点击右上角的下载按钮,就可以获得这个仓库的地址。

根据这个地址,我们可以在 git 窗口中执行下面的命令将远程仓库中的备份更新到本地仓库中,如图所示。

git pull 仓库地址 分支名称

前提是,我们在本地必须初始化一个空的仓库来获取,否则会失败。

还有另外一种方式:

git clone 仓库地址

此方式会自动在我们的目录中新建一个文件夹,如下图。如果多次执行,则会覆盖内容。

14. ssh 方式上传文件


使用远程仓库网络地址的方式,在操作的时候,需要用到仓库拥有者的账户和密码。这并不方便,所以可以使用 ssh 协议。

ssh 分为公钥和私钥,我们保留私钥,然后将公钥放入 github 网站,github 会验证公钥和私钥,验证成功后就可以通过 ssh 的方式进行操作。

首先,执行下面的命令来生成公钥和私钥。

ssh-keygen -t rsa -C “jia@xxx.com”

-t 用于选择编码方式,这里选择 rsa 。然后输入我们的邮箱。

执行后,将提示生成的位置,如上图,默认位置是

C:/Users/windows用户名/.ssh/id_rsa

然后一路回车,直到命令执行结束。我这里是因为该位置已经存在,所以会询问是否覆盖。生成结束后,我们去对应的位置找到秘钥文件。如下图

我们以记事本打开公钥,ctrl + a 全选,ctrl + c 复制。然后去 github 网站,点击右上角头像,在下拉面板中选择 settings 。如下图所示

然后在左边栏选择 SSH and GPG keys ,在右边的面板中,点击右上角的 New SSH key 。如下图所示

从上至下依次完成,然后提交。提交后有概率让你输入账户密码验证,验证完成后,操作完成。

我们打开仓库的页面,展开下载 code 的按钮,面板的左上角可以选择 Use SSH 来使用 ssh 方式。

然后在 git 命令窗口中,执行下面的命令就可以将本地仓库的备份放入远程仓库中。

git push SSH地址

备份时,需要先提交到本地的版本库,才能提交至远程仓库

15. 上传远程仓库,需要先处理冲突


同本地的冲突一样,当多个用户对同一个项目文件进行修改后,提交到远程仓库就会产生冲突。

为了解决这一问题,我们在向远程仓库提交项目文件的时候,应该先通过下面的命令将远程仓库的代码同步至本地。

git pull SSH地址

然后通过本地处理文件冲突的方式,在合并项目文件后,重新上传至远程仓库。这样上传至远程仓库时,才不会产生文件冲突。

16. pull 和 push 时,地址的简化


我们每一次执行 pull 和 push 命令时,都需要复制一长串仓库地址。

这样比较麻烦,于是我们可以给这个地址起个名字,然后用名字来代替它。这个过程类似于声明变量,然后使用变量。

在 git 命令窗口中执行下面的命令将仓库地址交给我们指定的名称,建议名称不要使用中文和特殊字符。

git remote add 名称 SSH地址

注意,这个操作只在当前项目目录中有效。

声明后,我们以后在本项目目录下使用仓库地址时,就可以直接用替代的名称即可。如下图所示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值