Post

Git 入门

简介

git 是一个分布式版本控制软件,简单说就是管理代码的,属于程序员必备技能。

更多内容参考维基百科的介绍,这里不再赘述。

git英文维基

git中文维基

安装

这里是 Linux 的安装过程。Windows 可以去 官网 下载。

安装 git

1
sudo apt-get install git 

查看版本号

1
git -v 

配置和使用

设置用户名和邮箱

1
2
git config --global user.name "用户名"
git config --global user.email "example@xxx.xxx"

基本信息设置完成后就可以通过 https URL 来克隆一个开源仓库了。

比如用下面这条命令克隆我在github上的 profile 仓库。

1
git clone https://github.com/oodenough/oodenough

克隆完成后应该能看到目录下就一个 README.md 文件。这是显示在 github 个人主页上的介绍内容。

要想连接到自己在 github 上的私有仓库,需要向 github 上的账户添加本机的 ssh密钥 ,添加完成后就可以将私有仓库克隆到本地,修改代码后又推送 push 到远程的仓库。

在这个过程中 ssh密钥 的作用是验证身份。

在命令行用以下命令生成密钥对 key pairs

1
ssh-keygen -t rsa -C "备注" 

-C "备注" 可以备注一些相关信息,也可以省略。

生成的密钥对默认路径是 ~/.ssh

1
ls ~/.ssh

可以看到目录下有两个密钥文件,分别是 id_rsaid_rsa.pub

前者是 私钥, 后者是 公钥

前者保存在本机,后者添加到 github 账户,settings => ssh and GPG keys => New SSH key

克隆自己的私有仓库

1
git clone git@github.com:username/repository-name.git 

把 username 替换成你的 github 用户名,repository-name 替换成你要克隆的仓库名。

注意这里使用的 URL 不再是 https 而是 ssh.

克隆时 github 会把公钥发送到本机与私钥匹配,对上了证明你对该私有仓库是有权限的,然后克隆才得以正常进行。推送时同理。

workflow

这里对 Git 的 workflow 做一个简单的介绍。

git 仓库结构如下

git-workflow

分别是 工作区暂存区仓库.

当前对代码的修改是在工作区进行的,而代码最终会用 git commit 命令提交到仓库,暂存区顾名思义是将本地修改后的代码提交到仓库的一个过渡区。

如果当前工作区的代码出现问题,可以从暂存区拉取代码来覆盖工作区。

所以接下来分别从代码提交代码拉取来介绍 git 的几条常用命令。

提交

初始化仓库

先创建个文件夹

1
2
mkdir myrepo
cd myrepo

初始化本地仓库

1
git init .

初始化完成后 Git 会在目录下添加一个隐藏的 .git 文件,在之后你提交的代码,以及所做的更改都会记录在这个文件里。

添加第一个文件

1
echo 'initial' >> README.md

这里所作的便是在工作区创建了一个 README.md 文件,文件内容是 initial

查看仓库状态信息

1
git status

也可以添加参数 -s (short)查看更简短的状态信息

由于该文件是首次出现在工作区,此时显示的信息应该是 untracked。也就是说 git 没有在追踪记录这个文件。

将文件添加到暂存区

暂存区英文也可以叫 index

添加命令如下

1
git add README.md

再次查看 git 状态,可以发现提示信息已经改变。

将文件添加到仓库

1
git commit -m 'add README.md'

上面这条命令将暂存区的文件添加到仓库, 为了防止以后版本回退的时候不知道这条记录做了什么改变,在 -m 'add README.md' 里可以添加一些相关的提示信息。

查看仓库的记录

1
git log

可以添加参数 --pretty=oneline 查看更精简的单行 commit 记录

到这里我们都是在本地提交,从 working directory 到 staging area 再到 local repository.

接下来是将本地仓库的 commit 记录推送到 github 的远程版本库。

远程 origin 的设置

首先去 github 创建一个新仓库

然后为本地仓库设置远程 origin 为刚刚创建的 github 上的 repository

用以下命令查看当前仓库的远程 origin 信息

1
git remote -v

移除当前仓库的远程 origin

1
git remote remove origin

为当前仓库添加远程仓库 origin 源

1
git remote add origin git@github.com:username/repository-name.git

这里使用的 URLssh,原因前面讲过了:在对私有仓库执行相关操作时需要 ssh 密钥对验证身份

在本地仓库已经有一条 commit 的情况下,就可以开始推送了

1
git push -u origin main

这条命令的意思是向远程 origin 仓库的 main 分支推送本地版本库中的 commits,这里不再对分支展开,以后用到再分享。

在之后的推送中可以不再指定 main 分支,只需要执行 git push 命令就默认向 main 推送了。

接下来说说如何回退代码。

回退

暂存区到工作区(不涉及仓库)

假设暂存区中存在文件 file1,也就是说 file1 执行过 git add file1 命令。此时,如果你将工作区中 file1 的代码改得一塌糊涂,或者说 file1 直接被你删除了,那么可以用下面这条命令将工作区中的 file1 回退到暂存区中的 fiel1

也就是从 暂存区 拉取到 工作区

1
git restore file1

当前工作区的 file1 将会 丢失

回退之前可以用以下命令对比当前工作区的file1与暂存区中的file1的区别

1
git diff file1

版本库到暂存区(不涉及工作区)

假如说你把 working direcroty 的代码改得乱七八糟(或者删除)之后,还将代码 add 到了 staging area,为了避免被你修改得面目全非的代码在下一次 git commit 时混入仓库,可以用下面这条命令将暂存区中的 file1 回退到上一次 commit 时的状态

也就是从 版本库 拉取到 暂存区工作区

1
git restore --staged file1

同理,当前暂存区的 file1 将会 丢失

总结

本文其实是对我过去几个月使用 git 的一个总结。

对于个人项目的代码管理,本文中涉及的命令已经够用了。

但是对于多人合作的项目管理还不够,所以我创建了 这个仓库

欢迎克隆仓库,向我发送 pull request, 跟我一起学习 git 和 github !

This post is licensed under CC BY 4.0 by the author.