0%

git不完全指北

Git的不完全使用指北!

什么是Git?

先来看看百度百科怎么说:

Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

初学者可能“对于什么是分布式?什么是版本控制?”这些概念并不清楚,这里也不打算过多讨论,本文章只是一个git的基础教学文章,但只是日常使用绝对够用!

可以采取这样的方法来理解git,Windows具有一个还原的功能,当电脑更新出现问题后,用来回退到你更新前的版本,而git的版本控制就是你可以随意还原(回退)到你之前在git上记录过的版本。

值得一提的是,Git的诞生可以说是一个偶然,因为他是LInus(LInux创建者)花了两周时间用C写出来的!

安装Git

Linux安装方法

1
2
$ sudo apt-get install git
//Debian或者Ubuntu

Windows安装方法

Git官网

可以到Git官网下载官方提供的exe安装包!

安装完成后,这时可以设置一下统一的nameemail

1
2
3
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
//上面对应的name属性和email属性自己进行替换!

Git的工作原理

这里先简单谈一下Git的工作原理,Git作为一个版本控制系统,意思就是它会监听你指定给它的目录(这里的操作是创建版本库,现在不明白也没关系,一会讲),然后当该目录下的文件(这里指的是你添加到版本库中的文件,添加到版本库是一个独立于创建版本库的操作)内容发生变化后,你选择加现在的文件(更改后的文件)添加并提交到版本库中,这时git就记录了两个版本,一个是你现在的所用的版本(即更改后),另一个是修改前的版本。

这样做的目的就是在于防止代码写错了、被人恶意改动了、文件丢失了,这些情况发生时进行一个补救措施。

基本操作指令

接下来介绍一些日常中够用的基本指令

创建版本库并提交文件

这个很简单,先新建一个文件夹,然后再文件夹内执行git init就可以了

1
2
3
4
5
6
$ mkdir git
$ cd git
$ pwd
Path
----
C:\Users\jin\Documents\git

pwd命令用来显示当前的目录,有趣的是,cmd不支持这个命令

对了,这里要强调一点,路径不要用中文,不要用中文,不要用中文

1
2
$ git init
Initialized empty Git repository in C:/Users/jin/Documents/git/.git/

通过该命令进行初始化仓库,然后查看git文件夹发现,文件夹内多了一个隐藏的文件夹.git,这个就是git用来跟踪管理版本库的,勿动

这时版本库已经创建好了,但是它还是空的,可以在git文件夹下创建一个名为practise的文本文件,然后就可以通过git add命令添加到版本库中

1
$ git add practise.txt

执行完后没有任何提示,这是正常的,在Unix中,Unix的哲学是“没有消息就是好消息”,说明添加成功。

然后通过git commit命令提交文件到仓库

1
2
3
4
$ git commit -m "wrote a practise file"
[master (root-commit) 397394e] wrote a practise. file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 practise.txt

提交完成后,系统会给出你响应,下面来说明一下上面给出的响应信息都代表什么

master:这里代表当前分支,master代表的是主分支(后续说明)

397394e:commit id,是一个SHA1计算出来的一个非常大的数字

版本控制

接下来说明一些指令作用:

git status:获取当前仓库情况

当仓库正常时,输入git status得到输出为:

1
2
3
4
5
$ git status
On branch master
//提示你当前分支在master
nothing to commit, working tree clean
//证明一切良好

当文件被修改时例如我们在practise.txt文件中加入一行“this is a practise”,然后输入git status可以得到:

1
2
3
4
5
6
7
8
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: practise.txt

no changes added to commit (use "git add" and/or "git commit -a")

可以看到,命令告诉我们文件被修改了,并且没有准备提交的修改

然后我们可以通过git diff命令查看究竟修改了什么内容:

1
2
3
4
5
6
7
8
$ git diff practise.txt
diff --git a/practise.txt b/practise.txt
index e69de29..2da3a08 100644
--- a/practise.txt
+++ b/practise.txt
@@ -0,0 +1 @@
+this is a practise
\ No newline at end of file

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到我们增加了一行“this is a practise”

知道更改后就可以正常的进行git addgit commit

那么,我们怎么查看我们进行过的提交操作呢?

可以通过git log命令查看提交的记录,使用git log得到如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git log
commit 9f35281b7620e9fc24c7d2f6930b0dd1ca078d35 (HEAD -> master)
Author: yingyi <jinzhongjia@qq.com>
Date: Sat Sep 25 14:27:37 2021 +0800

commit practise

commit 397394e84ee4633652fc7af2683d3cd8791e297e
Author: yingyi <jinzhongjia@qq.com>
Date: Sat Sep 25 10:03:12 2021 +0800

wrote a practise. file
git log`命令显示从最近到最远的提交日志,最近一次是`commit practise

如果嫌输出信息太多,看得眼花缭乱的,可以加上--pretty=oneline参数:

1
2
3
$ git log --pretty=oneline
9f35281b7620e9fc24c7d2f6930b0dd1ca078d35 (HEAD -> master) commit practise
397394e84ee4633652fc7af2683d3cd8791e297e wrote a practise. file

上面的9f35281...397394e...一长串的字符串就是完整的commit id

那么如何回退上个版本呢?使用git reset指令

1
2
$ $ git reset --hard HEAD^
HEAD is now at 397394e wrote a practise. file

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交9f35281...,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

可以看到git会打印出回退后的commit id

但是这时如果使用git log查看提交的记录,你会发现现在记录变成了一个,回退前的版本记录都不见了!

不过,这时候如果我们知道回退前的commit id,我们就可以直接重新回到新版本

1
2
$ git reset --hard 9f3528
HEAD is now at 9f35281 commit practise

告诉我们回退到了9f3528这个版本

如果你不小心把电脑关闭了,然后不知道回退版本前的commit id,Git提供了一个命令git reflog用来记录你的每一次命令:

1
2
3
4
5
$ git reflog
9f35281 (HEAD -> master) HEAD@{0}: reset: moving to 9f3528
397394e HEAD@{1}: reset: moving to HEAD^
9f35281 (HEAD -> master) HEAD@{2}: commit: commit practise
397394e HEAD@{3}: commit (initial): wrote a practise. file

在这里就可以清晰看到回退前的commit id

工作区和暂存区

工作区(Working Directory)

就是你在电脑里能看到的目录,比如我的git文件夹就是一个工作区

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

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

img

我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

管理修改

以下说明两种 情况,也应只存在两种情况:

文件修改后未添加到暂存区

1
2
3
4
$ git restore <file>

$ git checkout --<file>
//<file>指的是文件名称

自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态

文件添加到暂存区还未提交

1
2
3
4
$ git restore --staged <file>

$ git reset HEAD <file>
//<file>指的是文件名称

已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态

删除文件

如果只是通过普通手段,对add后的文件进行删除操作,这对于Git来说算是一个修改操作,可以在git status中看到文件被删除,然后使用git restore进行恢复

如果要从Git版本库中删除元素,可以使用git rm 来进行:

1
2
$ git rm 5.txt
rm '5.txt'

远程仓库

首先先来生成一下本地的ssh秘钥,这个用于github识别是不是你本人在进行推送

1
$ ssh-keygen -t rsa -C "youremail@example.com"

输入这个之后,一路回车就可以,当然也可以自行设置

然后就可以到/Users/你的用户名(你自己之前起过的)/.ssh文件夹下面找id_rsaid_rsa.pub这两个文件

然后到github的个人账户设置中添加ssh密钥,应该粘贴id_rsa.pub文件的内容

这时github就可以识别是你本人在向它push代码了

添加远程库

在我们之前创建的git文件夹下执行命令:

1
2
git remote add origin git@github.com:michaelliao/learngit.git
//origin是远程库的名字,后面的git地址为你的git仓库地址,在此之前你需要提前建好一个git库

这个时候我们就可以向远程库同步推送内容了,在git目录下执行以下指令:

1
2
$ git push -u origin main
//网络上有些git教程可能会使推送到master分支,在过去github创建的仓库默认分支为master,而现在的默认分支为main

git push命令就是将本地的库推送到远程上,由于远程库为空,因此git不止推送了本地的分支到远程的分支,同时也将这两个分支绑定起来,以后就可以简化命令:

1
$ git push origin main

通过git remote -v可以 查看远程库的信息,如果想删除远程库,可以通过:

1
$ git remote rm main

注意:这里的删除库只是删除了本地和远程的一个绑定关系,github上仍然存在该库

克隆远程库

执行以下命令,可以实现克隆远程库:

1
$ git clone git@github.com:michaelliao/gitskills.git

通过此命令克隆的库回和远程库自动绑定,因此不需要进行本地和远程的绑定操作

分支

待定!

标签

待定!

搭建git服务器

待定!