Git 的安装

在 Arch Linux 上安装

直接用pacman安装即可
一般情况下 git 会作为其他包的依赖安装,所以一般不用主动安装

1
sudo pacman -S git

Git 的配置

Git 的三个配置文件

Git 自带一个 git config 工具来控制 Git 的外观和行为

  • /etc/gitconfig文件:用 sudo git config --system 进行配置,针对整个系统
  • ~/.gitconfig~/.config/git/config文件:用 git config --global 配置,针对当前用户
  • .git/config 文件:用 git config --local 配置,针对某一工作目录

每一个级别会覆盖上一级别的配置

配置用户信息和文本编辑器

用下面两条命令配置用户名和邮箱
用户名和邮箱会在每次提交的同时提交

1
2
git config --global user.name "你的用户名"
git config --global user.email 你的邮箱

用下面的命令配置文本编辑器,在每次 git 需要你输入信息时,就会打开这个文本编辑器(命令行模式下,当然还得是vim

1
git config --global core.editor vim

配置完成后,可以通过以下命令查看配置信息

1
git config --list

当不记得某些变量在哪里配置的时候,可以通过下面的命令查找

1
git config --show-origin 变量名

注:使用 git config --local(or global/system) -e 会使用默认的编辑器打开相应的配置文件

获取帮助文档

首先要安装 man,这个包的名字是 manual 的简写,用于查看系统中自带的各种参考手册

1
sudo pacman -S man
  • 通过 git help [verb] 获取详细的帮助文档,如 git help config
  • 通过 git [verb] -h 获得简洁的帮助文档,如 git config -h

配置远端仓库

配置 SSH 密钥

首先要生成本机 ssh 密钥

1
ssh-keygen -t rsa

Linux 系统下,这会在 ~/.ssh 文件夹生成两个文件 id_rsaid_rsa.pub
我们将 id_rsa.pub 中的内容复制(注意这个是公钥,另一个需自己保留)
然后进入 github/gitee,打开 设置 -> SSH and GPG keys -> New SSH key
在该页面中,将内容粘贴到 Key 文本框中,标题在粘贴时会自动生成,一般不用更改,Key type 一般也不用更改

通过下面的命令可以验证 SSH 密钥是否配置成功

1
2
ssh -T git@github.com
ssh -T git@gitee.com

出现下图的提示则说明添加成功

注意:若 ssh 命令不存在,可以手动下载 sudo pacman -S openssh

创建和连接远端仓库

在 Github/Gitee 创建一个仓库

然后复制其 ssh 链接

在本地创建一个文件夹,在这个文件夹打开终端,输入下面的指令

1
git init

通过下面的命令添加远程仓库的代号

1
git remote add 远程仓库代号 远端仓库的ssh地址

其中,远程仓库代号并不一定要与 Github 的仓库名相同,他只是作为本地连接到远端仓库的标识
到这里,Git 的基本配置就结束了

Git 常用指令

仓库的简单(常用)操作

1
2
3
4
git init # 将当前目录设置为工作区(workplace),并在当前目录创建一个 .git 文件夹
git add . # 将工作区(workplace)所有文件都添加到暂存区(index/stage)
git commit -m '提交信息' # 将暂存区的文件提交到仓库(repository)
git push 远程仓库名 本地分支名:远端分支名 # 将本次仓库的文件推送到远端仓库

工作区即本地目录,暂存区的文件都是被跟踪的文件被跟踪的文件可以被提交到仓库本地仓库的文件能被推送的远端仓库
提交信息能帮助我们快速地识别每次提交的内容,因此写提交信息需要有一定规范
此外,使用下面的命令可以查看各个文件的状态(即被跟踪,已修改等)

1
git status

该命令还可以加一个-s参数,以获取简短的信息

忽略文件 .gitignore

有时我们不希望所有的文件都被跟踪,比如日志文件,临时文件等
这时我们可以在工作区目录下创建一个名.gitignore的文件,在里面写上要忽略的文件,这样在使用git add的时候就不会将这些文件或文件夹加入暂存区

文件 .gitignore 的格式规范如下:

  • 所有空行或者以 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式 匹配,它会递归地应用在整个工作区中。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

当然,我们一般不需要自己写这个文件,在 这里 我们能找到大部分语言或项目常用的.gitignore文件,找到并将其复制到自己项目的.gitignore文件即可

当我们忘记添加.gitignore文件却将一些不需要提交的文件提交时,可以用下面的命令删除

1
git rm --cache 文件名/目录名

分支

在使用了git init后,git 会默认帮我们创建并转到master分支
分支允许我们在另一条“线”进行开发,而不会影响到“主线”,在分支完成开发后,还可以将分支和主线进行合并
例如现在有一个main分支,接下来在这个分支我们提交一个文件a.txt,然后创建并转到dev分支,这时该分支也会有a.txt
然后我们在dev分支提交一个文件b.txt,再回到main分支,操作正确的情况下,这时的工作目录中没有b.txt
而如果我们在main分支中,将dev合并到main分支,就能够看到文件b.txt

分支的基本操作

想要创建新的分支,可以用如下指令

1
git branch <分支名>

注意:只有在已经有文件提交的时候才能新建分支

如果想在新的分支进行操作,可以用下面的命令切换到新的分支

1
git checkout <分支名>

实际上,使用下面的命令可以直接创建并切换到新的分支

1
git checkout -b <分支名>

使用下面的命令可以查看分支

1
2
3
4
5
6
git branch # 查看所有本地分支
git branch -r # 查看远端所有分支
git branch -a # 查看本地和远端所有分支
git branch -v # 显示每一个分支及其最后一次提交
git branch --merged # 查看与当前分支已经合并的分支
git branch --no-merged # 查看没有与当前分支合并的分支

*表示的分支就是当前分支

使用下面的命令可以删除分支

1
2
git branch -d <分支名> # 安全删除分支(已经合并的分支可以安全删除)
git branch -D <分支名> # 强制删除分支

注:删除分支时,要先切换到其他分支

使用下面的命令可以给分支重命名

1
2
# -m 表示 move
git branch -m <原分支名> <新分支名>

合并分支

使用下面的命令可以将目标分支合并到当前分支

1
git merge <目标分支>

如在dev分支中有几个新文件,将其合并到master后,这几个新文件也会出现在master分支中
然而,在协作开发的过程中,常常会有合并冲突的情况
例如,在master分支中有一个文件a.txtdev分支也有一个文件a.txt
现在分别对里面的内容进行修改,然后尝试将dev合并到master

这里会发现合并失败,这是因为自动合并时git不知道该选择哪个分支的内容,因此需要我们手动修改
我们在master分支中打开a.txt,里面会变成这样

然后对其修改,保留我们要留下的东西即可,如下

然后进行合并即可

远程仓库的使用

远端仓库的增删改查

使用下面的命令连接(添加)远端仓库,详情在上文已经介绍

1
git remote add <远程仓库代号> <远端仓库地址>

使用下面的命令删除与远端仓库的连接

1
git remote remove <远程仓库代号>

使用下面的命令修改远程仓库代号

1
git remote rename <原来的名称> <新的名称>

使用下面的命令列出连接的远端仓库的信息

1
2
3
git remote # 显示所有远程仓库代号
git remote -v # 显示所有远程仓库代号和其地址
git remote show <远程仓库代号> # 显示远端仓库的详细信息

推送和拉取

使用下面的命令可以将本地仓库推送到远端仓库

1
git push <远程仓库代号> <本地分支名>[:远端分支名]

使用下面的命令可以将远端仓库的更新全部拉取回本地

1
2
3
4
5
# 将远程仓库所有分支的更新拉取到本地
git fetch <远程仓库代号>

# 将远程仓库某个分支拉取到本地
git fetch <远程仓库代号> <分支名>

将更新拉取到本地后,可以通过git branch -agit branch -r查看
然后我们可以手动将远端仓库和本地仓库进行合并,如将origin/master和当前分支合并

1
git merge orgin/master

想要免去合并的步骤,可以使用git pull,这个操作相当于拉取+合并

1
git pull <远程仓库代号> <远程分支名>[:本地分支名]

例如,将远端的origin/master分支和本地的dev分支合并,可以这样写

1
git pull origin master:dev

也可以先切换到dev分支再合并(到当前分支),如下

1
2
git checkout dev
git pull origin master

当然,既然涉及到merge,就可能会出现合并冲突,按照前面所讲的方式解决即可
同时,在多人协作过程中,我们在每次推送前,都应该先pull一下,手动解决可能存在的冲突

克隆

利用下面的指令可以从远端克隆一个仓库

1
2
3
git clone <https或ssh地址> # 直接克隆
git clone 地址 new_name # 克隆并重命名
git clone -o <远程仓库代号> <地址> # 默认远端仓库代号是 origin,用该命令可以修改代号

输出日志

使用下面的命令可以输出提交日志

1
git log

以下是可选的一些参数

  • --all 显示所有分支
  • -n 要显示日志的数量
  • --abbrev-commit 使得输出的 commit id 更简短
  • --oneline 将提交信息显示为一行(默认会添加 --abbrev-commit 参数)
  • --pretty=
    • oneline 将提交信息显示为一行(默认不会添加 --abbrev-commit 参数)
    • short,full,fuller 显示信息的详尽程度
  • --graph 以图的形式显示
  • --stat 输出对更改内容的统计
  • --patch 输出更改的内容
  • --no-merges 隐藏合并(merge)提交
  • 日志按日期筛选
    • --before='xxxx-xx-xx' 输出某日期(包含)之前的日志
    • --after='xxxx-xx-xx' 输入某日期(不包含)之后的日志
    • 日期还可以输入 todayyesterday30 days ago1 week ago
  • --author=用户名/邮箱 通过用户筛选日志
  • --grep=提交信息 按提交信息筛选日志

如果日志过长,会在在终端最下方出现 :,表示日志未显示完全
这时按下回车键方向下键能继续显示日志,按 q 推出日志

撤销操作

“修补”提交

使用下面的命令可以将该次提交并入到上一次提交

1
git commit --amend

改自官方文档的例子如下

1
2
3
git commit -m '第一次提交'
git add 少提交的文件
git commit --amend

这样少提交的文件第一次提交的文件就会共用一次提交

回滚版本

当我们想回到先前的版本时,我们可以用如下命令

1
git reset --hard <commit id>

其中,commit id可以是完整的hash值,也可以是简写的hash值(用git log --oneline等指令可以查看)

注意:回滚版本会修改目录的文件,回滚前一定要注意别让重要的文件丢失

回滚后,最新的几次提交就无法使用git log查看,如果想恢复到原来的版本,可以用下面的命令查看最新几次提交的commit id,然后用git reset即可

1
git reflog

打标签

git 中的两种标签

给某一个版本打标签表示该版本是个值得重视的版本,标签如 v1.0 v0.0 可以用来表示产品的版本号码
Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)
简单地说,附注标签可以给标签添加注释信息,而轻量标签不能

给版本添加标签

使用下面的命令打标签

1
2
3
git tag -a <标签名> -m <'注释信息'> # 为当前版本创建附注标签
git tag <标签名> # 为当前版本创建轻量标签
git tag -a <标签名> -m <'注释信息'> <commit id> # 给某一个版本打标签

使用下面的命令可以查看标签

1
2
3
git tags # 列出所有标签
git show <标签名> # 显示某个标签的详细信息
git tag -l '正则' # 通过正则表达式筛选标签

将标签推送到远程仓库

使用下面的命令可以直接推送所有的标签

1
git push <远程仓库代号> --tags

使用下面的命令可以推送某一个标签

1
git push <远程仓库代号> <标签名>

删除标签

使用下面的命令可以删除本地标签

1
git tag -d <标签名>

使用下面的命令可以删除远程仓库的标签

1
git push <远程仓库代号> -d <标签名>

其他可能用得到的指令

git diff 比较文件差异,主要用于查看哪些更新没暂存,哪些已经暂存但没有提交
git commit -a 把所有已经被跟踪的文件暂存并一起提交
git rm <file> 删除文件并删除其在暂存区的信息
git mv <file> 移动文件并修改其在暂存区的信息
git log --pretty=format:"" 格式化 log 输出,详情看 这里

一些问题的解决方法

使用 git branch 等指令会打开默认编辑器

关闭分页器即可

1
git config --global core.pager ""

参考链接