大家好,前段时间因为我想把自己的项目上传到github上,然后使用git的时候遇到了一堆问题,所以特写此篇文章,来跟大家聊一聊git的使用方法。
文章参考了网上许多资料,有bilibili的狂神说的视频以及公众号文章,有stormzhang的《从0开始学Github系列》等等。
我感觉我的文章结构写的还蛮清晰的。大家也可以通过目录看自己需要了解哪个,然后去看特定的也行。
话不多说,我们直接开始聊git。
一、什么是git
简单来说git其实就是一个版本管理工具。我们可以使用git做很多事情,比如说:
-
我们想把本地的代码放到远程服务器里
-
版本迭代时,记录每个版本添加的功能以及代码
-
回退到特定的代码版本
-
多人协作,每个人负责一个功能时,大家需要在同一个代码的基础上进行修改。这个时候,大家需要互不影响的同时,又可以同步别人的代码
……
当然,如果看了这些还是有点摸不着头脑也没关系。看一看 git 的具体命令都是干什么的之后,每个人对 git 应该都会有自己的一套见解。
二、git安装
使用git之前,得先把它安装到我们自己的电脑上。
这里给出git的下载安装的网站,其余的大家如果不会,网上有很多教程,大家可以跟着教程安装就行。
- Mac:git-osx-installer (abandoned) download | SourceForge.net
- Windows:Git for Windows
- Linux:apt-get install git
三、使用git
在项目目录下点击右键,然后点击git bash。
然后会弹出这样一个窗口
我们在这个窗口里输入我们的命令即可。
三、git配置
(一)配置用户相关信息
使用git的时候,一定先要配置用户的用户名和邮箱,否则会报错。因为每一次的提交中都会带上这些信息,用来标识是谁做了这些更改。就像下图一样:
配置信息的命令格式为:
git config --global(可选) 键名 赋予的值
其中,global 是可选的。
–global 选项用于指定配置的作用范围是整个用户账户。
带了 --global 选项,无论你在这个用户的系统中使用哪个 Git 仓库,这些配置都会生效。
不带 --global 选项,那么这些配置项将只应用于当前 Git 仓库。
我们配置的是用户的用户名和邮箱,所以一般情况下都是带 --global 选项的。其命令为:
git config --global user.name "anum" #配置用户名为 anum
git config --global user.email "123@qq.com" #配置邮箱信息为 123@qq.com
(二)删除配置信息
删除配置信息的命令格式为:
git config --global(可选) --unser 要删除的键名
比如说我们现在要删除该用户的用户名的配置,那么可以执行如下命令:
git config --global --unser user.name
(三)查看配置信息
-
查看所有当前生效的 Git 配置信息
它会显示当前项目的所有配置,包括系统级配置、全局配置和当前仓库级配置。Git 会根据优先级从高到低显示配置,优先显示当前仓库级别的配置,然后是全局配置,最后是系统配置。
命令:
git config --list(或者 --l也行)
-
查看系统级别的 Git 配置
显示在系统级别(对所有用户和所有仓库)生效的配置。
这些配置信息,其实都保存在我们电脑中的文件中。系统级别的配置,在 git 安装目录下的 \etc\gitconfig 文件当中。
命令:
git config --system --l
-
查看用户级别的 Git 配置
显示当前用户的全局Git配置。
配置信息存储在 C:\Users\Administrator\ .gitconfig 文件当中。Administrator指的是账户名,每个人的账户名都不一样。
命令:
git config --global --l
四、git基本理论
在真正介绍 git 命令之前,先介绍一下 git 中的各个工作区域。
git 在本地一共有三个工作区域,外加远程的 git 仓库,就是四个工作区域。
本地的工作区域有:
- 工作目录(Working Directory):就是我们电脑上存储项目的那个目录。
- 暂存区(Stage/Index):临时存放我们有改动的文件的区域。它其实就是一个文件,记录着每一次的改动都有哪些。
- 本地仓库(Repository 或Git Directory):存放数据的位置,里面放着提交的所有版本的数据。
除了上述的三个本地工作区域,还有一个远程的工作区域,叫远程仓库(Remote),它是存放代码的服务器,像github、gitee的存放代码的区域,都可以叫远程仓库。
下图是文件在四个区域内转换的关系和命令(图片借鉴自狂神说公众号文章)
其中History指的就是本地仓库。
五、git拉取代码
使用 git 拉取代码的意思就是,使用 git 工具,把别人提交到远程仓库的代码下载到本地。
首先,我们要到想要存放代码的目录,然后进行git操作。
使用 git 拉取代码,一共有两种方式。
(一)git init & git pull
-
git init 初始化 git 仓库
在使用 git 进行操作前,一定要先建一个 git 仓库才行。git init是用来初始化 git 仓库的一个命令。
我们到工作目录下面,执行下面命令
git init
这样,就代表初始化了一个 git 仓库。
-
git pull 拉取项目
建立完仓库之后,我们就可以使用git pull 进行项目拉取。
先找到要拉取的项目的url。
以我建立的github仓库为例,点击code的绿色按键,然后点击HTTPS下面的两个小方块图标,复制url。
然后,执行git pull 命令:
git pull https://github.com/lilia1204/test.git
执行结果和上图差不多,就表示拉取成功啦。
(二)git clone
第一个方法是先在本地建立仓库,然后再拉取项目。而git clone是直接把远程仓库搬到本地来。
举个例子,我首先建立了一个空的文件夹 test
然后我在一个空的文件夹 test 下面执行 git clone命令:
git clone https://github.com/lilia1204/test.git
然后再看我的项目文件夹里的变化:
可以发现,我原本的test里又多了一个test文件夹,但是没有 .git 文件夹。这是因为我在我原本的test目录下,直接把我远程的 test 仓库一整个给搬了下来。所以我原本的test目录不算一个git仓库,test/test 目录才是一个 git 仓库。
(三)查看该目录是不是git仓库
这里有两种方法查看该目录文件夹是不是git仓库:
-
到工作目录下,看有没有 .git 文件夹。
.git 文件夹是隐藏项目,所以需要将隐藏项目也显示出来,才能看得见。
比如说在windows系统里,就可以如下操作:
-
使用git status 命令
在git bash中输入
git status
如果git 仓库初始化成功了,显示如下图
如果git仓库没有初始化成功,那么就会如下图所示
六、git 提交代码
(一)关于授权
想象一下,如果我们想要往自己的 github 账户提交代码,但又不希望别人随意提交,那么应该怎么办?所以说是不是应该在提交之前先验证一下身份。
Github从2021年8月14日开始,使用git对github进行身份验证操作的时候不再接受使用账号密码形式clone和push代码。这里身份验证有别的两个方案,一个是使用access_token,另一个是使用SSH。
使用asscess_token的可以看以下两篇文章,我个人跟着做了一遍感觉步骤写的还挺详细的。
GitHub改为token验证后,如何提交代码?_new personal access token-CSDN博客
GitHub使用Personal access token - 小旭的blog - 博客园 (cnblogs.com)
当然,我认为用SSH比较简单一点吧,所以下面主要来讲一下怎么用SSH授权。
(二)生成SSH key
SSH是一种协议标准,目的是为了实现安全远程登陆以及其它安全服务。github身份验证,就可以用这个,而且是一种一劳永逸的方法。
Linux 和 Mac 是默认安装了 SSH的,windows 的git bash里也带了SSH。
可以在终端输入ssh ,查看有没有安装SSH。出现以下提示,说明已经装了SSH。
如果已经安装了SSH,那么可以输入以下命令生成ssh key。该命令的含义,是使用rsa算法生成密钥。
ssh-keygen -t rsa
输入之后,连按三个回车键(什么都不需要输入)。然后就会生成两个文件 – id_rsa 和 id_rsa.pub。其中id_rsa是私钥,id_rsa.pub是公钥。
这两个文件默认生成目录为:
- linux/Mac系统:~/.ssh
- win系统:/C/users/username/.ssh
这俩都是隐藏目录。
(三) SSH 授权原理
下面稍微解释一下ssh身份验证的原理,不想看的可以跳过哈,不影响后面使用。
私钥和公钥,这两个配对起来,叫一对密钥。
公钥加密后的密文,只能通过相应的私钥才能解密。而且通过公钥推理出密钥几乎是没有可能的。
那么github远程登录是怎么做的呢。
- 首先,我们本地主机要向远程主机发送登录请求。
- 然后远程主机收到消息后,随机生成一个字符串并用公钥加密,发回给本地。
- 本地拿到该字符串,用存放在本地的私钥进行解密,再次发送到远程主机。
- 远程比对该解密后的字符串与源字符串是否等同,如果等同则认证成功。
从上述的步骤来看,我们要把公钥放在远程主机上面,也就是把它放在服务器上面。也就是把 id_rsa.pub文件中的内容放到Github上去。
(四)Github上添加SSH key
-
点击右上角头像按钮
-
点击设置
-
点击ssh密钥按钮
-
点击添加新ssh密钥
-
在红色框里把id_rsa.pub文件中的东西复制粘贴过来,title那一栏不需要填写。然后点击下方Add SSH key按钮。
- 生成成功后的界面是这样的。
(五)SSH 测试
SSH key添加成功之后,输入
ssh -T git@github.com
输入完之后会出现这种界面,大概意思是以前没有连接过这个主机,问我们是否信任Github的服务器。我们只需要手动输入 yes ,然后回车就好了。
然后再次测试一下,显示如下图所示,就代表添加成功啦。
(六)向Github提交代码
如下图所示,向github提交代码需要下图三个步骤。分别是git add -> git commit -> git push。
1. git add
执行git add
命令,把我们文件放进暂存区。
具体命令是git add 文件名
示例
git add test.md #将test.md放到暂存区
git add . #把所有有变化的文件都放进暂存区
2. git commit
这个命令的意思是说把暂存区中有变更的文件提交到本地仓库。比如新添加的文件、有更改的文件、删除的文件、文件的权限变化了等等。
具体命令是git commit -m '备注的信息
示例:
git commit -m 'my first commit' #,-m一定要有,不然会出错'
3. 和远程仓库连接
我们现在已经把代码放到了本地仓库,那么如果想把本地仓库的东西推送到远程仓库,需要把本地的git仓库和和远程的仓库关联起来。执行下列命令:
git remote add origin git@github.com:lilia1204/test.git
其中:
git remote add
:添加远程仓库的意思
origin
:你的远程仓库名(本地的别名),很多时候都会取名origin,当然你也可以取别的名字。
git@github.com:lilia1204/test.git
:你远程仓库的URL,可以去你的github仓库里,如下图,点击code,然后点击SSH就可以看到。上述只是我的一个示例,需要换成你们自己的URL。
4. git push
把本地仓库和远程仓库关联之后,就可以用git push 命令来推送代码。
具体命令为git push 远程仓库名 分支名
示例:
git push origin main #推送到远程仓库origin的main分支中
关于分支可以看文章后面。
七、查看状态
(一)git status – 查看暂存区状态
git status命令是查看当前暂存区的状态的。
具体的输出有:
- 未跟踪的文件 (Untracked files):指仓库中新添加的文件,但还没有被 Git 跟踪,也就是说它们没有被添加到暂存区。你可以使用
git add
命令来跟踪这些文件。 - 已修改但未暂存的文件 (Changes not staged for commit):这些是已经被修改过的文件,但修改还没有被添加到暂存区。如果想把它们添加到下一个提交中,需要使用
git add
。 - 已暂存的文件 (Changes to be committed):这些文件已经被添加到暂存区,并且将在下次执行
git commit
时被提交。 - 已提交但本地与远程仓库不同步的分支状态:会显示当前分支是否与远程分支有不同步的提交(比如本地有新的提交还未推送到远程,或者远程有新的提交本地还没有拉取)。
示例:
$ git status
On branch main
Your branch is up to date with 'origin/main'.
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: file1.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
file2.txt
no changes added to commit (use "git add" and/or "git commit -a")
这个输出展示了:
- 你当前位于
main
分支,并且和远程仓库的main
分支同步。(关于分支可以看后面的解释) file1.txt
已经被修改,但尚未暂存。file2.txt
是一个新文件,未被 Git 跟踪。
(二)git log – 查看提交记录
git log 命令可以查看所有产生的 commit 记录,包括提交的用户名,提交的用户邮箱,提交时间信息和附带信息,就是我们git commit -m 'first commit'
的 first commit信息。
八、分支
git中的分支,可以理解为是不同的工作线。他们互相是独立的,不相互影响。
我们可以利用这个,来同时开发不同的功能,修复不同发bug。比如A和B同时在开发不同的功能,那么他们可以分别新建一个分支,最后开发完后,把他们两个的分支再合并起来就好了。
不过每个仓库都有一个主线,例如main和master分支,这里一般放的是已发布的代码。
(一)git branch 查看&创建分支
直接输入git branch
,意思就是查看当前仓库的所有分支。
前面有星号的是当前分支。
如果想在当前仓库添加新分支,可以写为
git branch 分支名
比如我想新加一个名叫 a 的分支,就可以写 git branch a
(二)git checkout 切换&创建并切换分支
如果想要切换当前分支,就需要下面的命令:
git checkout 分支名
比如切换到a分支就可以写成 git checkout a
如果不想先用branch新建分支再切换,想一步到位,那么就可以使命令
git checkout -b 分支名
比如想新建个 c 分支,并把当前分支换成 c ,就可以执行命令 git checkout -b c
(三)git branch -d&-D删除分支
如果说我们想删除一个分支,可以执行命令
git branch -d 分支名
比如我们想删除a分支,就可以写成 git branch -d a
不过,有的时候可能回删除失败。比如要删除的a分支还没有合并到main分支。这种情况下,执行git branch -d a
是删除不了的。我们可以使用下面的命令来删除
git branch -D 分支名
比如强制删除a分支: git branch -D a
(四)git merge 合并分支
假设某个功能已经在 a 分支写的差不多了,现在要将它合并到main分支里,然后上线。
这种情况下,需要两步走:
- 把当前分支切换到main分支,如果已经在 main 分支里了,就不用切换了
- 执行 git merge a命令,意思时把a分支合并到当前分支。
不过,有的时候会因为产生冲突而失败。
关于如何解决冲突的事儿,我在之后的文章中会写到哦,感兴趣的可以去看看
最后,小白第2次正式写一个文章,如果有什么说的不对的,或者哪里没说清楚的,欢迎评论区讨论批评哟~