Git简易入门
全文共约4500字,阅读完需要大约10分钟。第一次写长文,如有错误,请在评论区指出,我会及时改正。
Git简介
什么是Git
Git是目前世界上最先进的分布式版本控制系统,最初由林纳斯·托瓦兹创作,git最初只是作为一个可以被其他前端包装的后端而开发的,但后来git内核已经成熟到可以独立地用作版本控制。很多被广泛使用的软件项目都使用 git 进行版本控制。
我可以用Git做什么
除了用作开发软件的版本控制,git还有许多其他妙用,比如通过对tex文件的版本控制实现写论文时的版本控制。
Git的安装
大部分Unix和Linux的发行版都自带Git,如果没有的话也可以通过系统自带的包管理器或者Homebrew进行安装,当然对于有些系统则需要自行从源码构建。 对于Windows系统,可以从官方仓库下载安装包进行安装,对于Windows11用户,可以很方便的使用winget工具在Powershell命令行进行安装:
1 | winget install --id Git.Git -e --source winget |
安装完成后,在命令行使用以下两条命令设置你的全局用户名和邮箱,当你修改文件时将用该身份进行修改:
1 | git config --global user.name "your_username" |
Git的基本使用
版本仓库
选择或者新建一个文件夹作为版本仓库(repository),一般一个版本仓库只用于一个项目,版本仓库下所有文件的更改都会被Git记录。 进入要用作版本仓库的文件夹,右键-在终端中打开即可打开终端并进入当前目录,使用以下命令初始化该文件夹为版本仓库:
1 | git init |
这时目录下会出现一个名为.git的隐藏文件夹,即代表仓库已经建立完成。
本地版本控制
暂存文件
使用以下命令提交文件到暂存区:
1 | git add fileName.txt |
第一条命令是将名为fileName的文本文档保存到暂存区,第二条命令是将目录下(工作区)所有文件都保存到暂存区。注意:Git对于文本格式的文档如txt、py等代码文档可以记录其变化内容,而对于二进制文档如视频、图像、Word文档只能记录其大小变化,无法记录其变化内容。
提交修改
保存文件到暂存区后,还需要将其保存到仓库更改才会生效:
1 | git commit -m "Your commit" |
引号内是提交这次更改的注释内容,可以是解释更改了什么之类的。 有需要时也可以将修改添加到上一次提交中:
1 | git commit --amend |
注意:commit命令提交的是暂存区的文件,而不是工作区的
查看修改
使用下列命令查看仓库当前状态,即当前文件夹(工作区)和仓库的是否有文件不同:
1 | git status |
对于一个特定的文件,可以查看工作区该文件和仓库里的文件的区别:
1 | git diff fileName.txt |
用以下命令查看仓库版本历史:
1 | git log |
版本回退
上一步最后看到修改历史中有一大串十六进制字符串,这个字符串就是版本号,在使用版本号时,只要写出能唯一标识该commit的版本号的前几位就可以。使用以下命令回退:
1 | git reset --hard 4ca140 |
第一行是回退到对应版本号版本,第二行是回退到两个版本前(几个^代表几个版本前,HEAD代表当前版本),第三行是回退到四个版本前,相当于HEAD^^^^。注意:使用--hard参数回退时,工作区所有未提交的文件会全部丢失且不可恢复。不使用--hard则只回滚仓库而不回退本地文件。 如果你回退版本后又反悔了,可以使用新版本的版本号回到新版本,使用以下命令查看你仓库的所有修改记录:
1 | git reflog |
使用以下命令来撤销工作区的修改,回到暂存区状态,如果暂存区没有该文件就回到版本仓库的状态:
1 | git checkout -- fileName.txt |
使用以下命令来将暂存区的文件撤销:
1 | git reset HEAD fileName.txt |
删除文件
使用以下命令来将删除文件操作推送到暂存区:
1 | git rm fileName.txt |
之后正常提交到仓库即可。
远程仓库
连接远程仓库
在GitHub上新建一个repository,复制仓库地址:
可以看到GitHub已经给出本地连接的命令提示了:
1 | git remote add origin 仓库地址 |
推送本地仓库到远程仓库:
1 | git push -u origin master |
第一次推送时,因为远程仓库是空的,需要带上-u新建master分支并与本地关联,之后可以直接进行推送:
1 | git push origin master |
注意事项
第一次推送github可能需要你验证登录,使用你创建仓库的GitHub账户验证即可。推送后,你应该就可以在GitHub上看到你推送的文件了。 如果你在推送时报以下错误:
1 | fatal: unable to access 'https://github.com/You/yourRepo.git/': Failed to connect to github.com port 443 after **** ms: Timed out |
应该是由于你的网络供应商屏蔽了github.com,关于这点网上有许多解决方法,包括修改hosts文件之类的,这里推荐一种最简单有效的方法:为Git设置代理,但是需要你有一个可用的代理,在终端执行以下命令:
1 | git config --global http.proxy 127.0.0.1:7890 |
将 127.0.0.1:7890 换成你使用的代理服务器地址及端口即可,如果你的代理设置没有问题,之后就可以正常推送了。 在Github仓库页面点击
即可查看编辑历史。之后即使没有网络也可在本地进行修改,等联网时再推送到远程仓库即可。
删除远程仓库
使用以下命令断开本地仓库与远程仓库的链接:
1 | git remote -v |
第一条命令列出已连接的远程仓库,第二条命令删除名为origin的远程仓库的连接。
从远程仓库克隆到本地
下面这条命令是Git中最有用的一条命令:
1 | git clone https://github.com/user/RepoUrl.git |
将后面的链接换成你要克隆到本地的仓库地址,即可克隆别人的仓库代码,之后按照自己的需求编译就可以使用别人在Github上开源的软件了。
分支管理
当我想给项目加一个新功能,但是新功能还只开发到一半,我们提交的话别人就要在我开发了一半的基础上开发其他功能,这时候就可以新建一个分支,等开发完这个功能再合并到主分支上去,也不会影响别人开发。
创建与切换分支
查看当前所有分支:
1 | git branch |
创建并切换分支:
1 | git branch dev |
第一条命令创建了一个新的分支 dev,第二条命令切换到新建的dev分支。以上功能也可以用一条命令完成:
1 | git checkout -b dev |
以下命令也是等效的:
1 | git switch -c dev |
使用switch也可以切换分支:
1 | git switch dev |
切换到dev分支然后将该分支推送到GitHub,即推送命令最后一个参数master换成dev,然后就可以在GitHub上看到新分支的内容了。
合并分支
新分支开发到一定程度,就可以和主分支合并了,先切换到master分支,然后使用以下命令合将dev分支合并到当前分支:
1 | git merge dev |
之后推送到远程仓库即可。使用以下命令删除本地和远程仓库的dev分支:
1 | git branch -D dev |
复制一个特定提交到当前分支:
1 | git cherry-pick commitID |
拉取提交
多人合作开发一个分支时,提交前先拉取,保证别人的更改都同步到了你本地:
1 | git pull |
拓展
标签管理
使用以下命令打标签:
1 | git tag v1.0 |
第一条命令为最新的commit打上v1.0的标签,第二条命令为特定commit打上标签,第三条命令为特定commit打上带说明的标签,第四条命令将标签推送到远程仓库。
发起Pull Request
Github的一大好处就是可以让别人参与你的开源项目,在fork别人的仓库并做一定修改后,可以发起Pull Request,请求仓库管理者合并你的修改。
使用git checkout进行回退
使用以下命令回退到特定commit并成为一个新分支,原分支不会改变:
1 | git checkout commitID |
使用以下命令回退特定文件,是直接在原分支上的更改,在提交commit后会应用到仓库:
1 | git checkout commitID -- fileName.txt |
使用SSH连接至Github
前面连接Github使用的是HTTPS连接,当然我们也可以使用更快速且安全的SSH进行连接。首先,在命令行运行ssh-keygen.exe,一路回车之后,在程序提示的路径(一般是C:\Users\YourUserName/.ssh/文件夹下)找到公钥id_rsa.pub,用记事本打开并复制其内容,在GIthub依次进入Settings-SSH and GPG keys-New SSH key,tittle填入方便你识别不同设备的标识,key粘贴刚刚复制的公钥,点击下方的Add SSH key,按步骤进行即可,这样再连接远程仓库的时候就可以使用SSH链接进行连接了,已经用HTTPS进行连接的仓库要先断开链接,再用SSH链接进行连接。仓库的SSH链接可以在下图所示位置复制:
除了SSH连接确保安全外,你也可以使用GPG密钥验证来防止别人冒充你提交commit,具体可以参考这篇文章。