Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件,Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

该篇将讲解以下几点:

  1. Git的安装
  2. Git的配置
  3. Git的工作流程

Git 的安装

在使用 Git 前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。Git 各平台安装包下载地址为:http://git-scm.com/downloads

Linux 平台上安装 Git

各大 Linux 平台可以使用包管理器(apt-get、yum 等)进行安装。

在Debian系上安装Git

1
apt update && apt install -y git

在红帽系(如CentOS/RedHat)上安装Git

1
yum -y install git-core

注:由于笔者不常用FreeBSD、OpenBSD、Alpine等其他发行版的Linux系统,所以在Git的安装上就不提及这些系统了

MacOS 安装 Git

MacOS安装Git有很多种方法,像用安装包安装、Brew包管理器、MacPorts包管理器、Xcode安装

  1. 安装包安装(最简单)
    可以到SourceForge上下载最新的软件安装包,根据指引进行安装即可使用Git

    注:该方法目前仅适合Intel芯片的MacOS,SourceForge上没找到支持M芯片的安装包

  2. 通过包管理器(如HomeBrew、MacPorts)

    1. 用HomeBrew安装Git
      在安装好包管理器后,我们在终端中输入brew install git等待进度条跑完即可使用Git

    2. 用MacPorts安装Git
      通过以下命令进行安装

      1
      2
      3
      4
      5
      6
      sudo port selfupdate
      #搜索最新可用的 Git 端口和变体:
      port search git
      port variants git
      #安装带有 bash 完成功能的 Git、OS X 钥匙链助手和文档:
      sudo port install git +bash_completion +credential_osxkeychain +doc
    3. 安装 git-credential-osxkeychain 助手(作为补充,因为按照上面的MacPorts或HomeBrew进行操作,则助手应该已经安装好了)

      Bitbucket 支持通过 SSH 和 HTTPS 推送和提取您的 Git 存储库。要通过 HTTPS 使用私有存储库,每次推送或拉取时都必须提供用户名和密码。git-credential-osxkeychain 助手允许您在 OSX 钥匙链中缓存用户名和密码,这样您就不必每次都重新键入了。

      1
      2
      3
      4
      5
      6
      7
      8
      git credential-osxkeychain # 可通过该命令查看是否安装好助手
      #使用 curl 下载 git-credential-osxkeychain(或者通过浏览器下载),然后将其移至 /usr/local/bin
      curl -O http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain
      sudo mv git-credential-osxkeychain /usr/local/bin/
      #将文件设为可执行文件:
      chmod u+x /usr/local/bin/git-credential-osxkeychain
      #将 git 配置为使用 osxkeychain 凭证助手。
      git config --global credential.helper osxkeychain
  3. Xcode安装
    当你在App Store安装完Xcode后,进入终端输入git --version此时如果MacOS中没有git,会通过xcode安装git并显示版本

    如果想要给旧系统像MacOS 12安装Xcode,但已经无法从app store上下载,可以去到macOS 版本对应的 Xcode 版本,以及 Xcode 历史版本下载上下载dmg安装包进行安装

Windows 安装 Git

Windows安装Git可以到官网上下载软件安装包,根据指引下一步即可,在此不做过多赘述。


Git 的配置

1
2
3
4
5
6
7
Git 提供了一个叫做 git config 的命令,用来配置或读取相应的工作环境变量,这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。
这些变量可以存放在以下三个不同的地方:
- /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
- ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
- 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Documents and Settings\$USER。
此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

一般来说,我们使用Git只需要配置一个name和一个email,再进阶一点的话就是配置credential进行登录凭证的一个存储。但如果我们需要生成patch文件并通过邮箱进行发送,那我们还需要配置smtp等相关信息。以下是相关的配置命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#配置用户名和邮箱
git config --global user.name ***
git config --global user.email ****@**.***

#配置凭证存储
git config --global credential.helper cache # 缓存密码,默认15分钟
git config --global credential.helper 'cache --timeout=3600' # 可以自定义缓存时间(例如设置1小时,单位:秒)
git config --global credential.helper store # 永久保存凭据(密码会明文存储在用户目录的.git-credentials文件中)
#首次操作时输入一次用户名和密码后,后续就会自动使用保存的凭据。

#配置smtp等相关信息
git config --global sendemail.smtpencryption tls # 加密方式,可选 tls 或 ssl
git config --global sendemail.smtpserver smtp.example.com # SMTP 服务器地址,在邮件服务商的文档中可以找到
git config --global sendemail.smtpuser your@email.com # 登录邮箱账号
git config --global sendemail.smtppass "your-application-specific-password" # 登录密码(建议使用应用专用密码)

#查看当前配置
git config --list # 查看所有Git配置
git config user.name # 查看用户名配置
git config user.email # 查看邮箱配置

#如果需要清除已保存的密码,可以使用:
git credential-cache exit # 清除缓存的凭据
rm ~/.git-credentials # 删除store方式保存的凭据(需要手动编辑文件)

Git 的工作流程

在这里举一个最简单的工作流程

flowchart LR
    A["在代码托管平台<br/>创建仓库"] --> B["git clone<br/>克隆仓库到本地"]
    B --> C[编辑文件]
    C --> D["git add<br/>添加到暂存区"]
    D --> E["git commit<br/>编写提交信息"]
    E --> F["git push<br/>推送到远程仓库"]

在此借用菜鸟编程关于git-workflow的内容

Git工作流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1. 工作区 (Working Directory) —— 你的书桌    
这是你实际修改文件的地方。你在这里写代码、删删改改。

2. 暂存区 (Staging Area) —— 你的待邮寄篮子
当你觉得作业写得差不多了,你会把它放进一个篮子里,准备打包。
关键指令:git add
意义:告诉 Git,这些改动我确认要提交了,先帮我记着。

3. 本地仓库 (Local Repository) —— 你的个人保险箱
你把篮子里的东西打包好,贴上标签(提交信息),锁进自己的保险箱。
关键指令:git commit
意义:改动正式成为了项目历史的一部分。即便你之后改乱了,也可以随时从这里找回。

4. 远程仓库 (Remote) —— 老师的收件箱(如 GitHub/GitLab)
最后,你把保险箱里的代码通过网络发送给远程服务器,方便其他人查看或合作。
关键指令:git push
意义:备份代码,并与团队共享进度。

知识点说明
git stash (贮藏区):作业写了一半,突然要改另一个急活,但又不想把没写完的作业提交。这时可以先用 stash 把代码藏进抽屉,等忙完再拿出来继续写(pop)。
git pull (拉取):看看老师(远程仓库)那里有没有别人交的新作业,直接同步到你的书桌上。
git fetch & merge:先看看远程有什么更新(fetch),确认没问题后再合并(merge)到自己的代码里

相关命令及说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# ===== git clone:克隆远程仓库到本地 =====
git clone <url> # 克隆仓库到当前目录(目录名与仓库名相同)
git clone <url> <dir> # 克隆仓库并指定本地目录名
git clone -b <branch> <url> # 克隆指定分支
git clone --depth 1 <url> # 浅克隆,只拉取最近一次提交(节省空间)

# ===== git checkout:切换分支或恢复文件 =====
git checkout <branch> # 切换到已有分支
git checkout -b <new-branch> # 创建并切换到新分支
git checkout -b <new-branch> <remote>/<branch> # 基于远程分支创建并切换
git checkout -- <file> # 撤销工作区某个文件的修改(恢复到上次提交状态)
git checkout . # 撤销工作区所有文件的修改

# ===== git branch:管理分支 =====
git branch # 查看本地所有分支(* 标记当前分支)
git branch -a # 查看本地和远程所有分支
git branch <new-branch> # 创建新分支(不切换)
git branch -d <branch> # 删除已合并的分支
git branch -D <branch> # 强制删除分支(未合并也会删除)
git branch -m <old> <new> # 重命名分支
git branch --set-upstream-to=<remote>/<branch> # 设置当前分支跟踪的远程分支

# ===== git add:将修改添加到暂存区 =====
git add <file> # 添加指定文件到暂存区
git add . # 添加当前目录下所有改动(新增、修改)到暂存区
git add -A # 添加所有改动(包括删除操作)到暂存区
git add -p # 交互式选择要暂存的代码块

# ===== git commit:将暂存区内容提交到本地仓库 =====
git commit -m "<message>" # 提交并附上描述信息
git commit -am "<message>" # 自动暂存已跟踪文件的修改并提交(跳过 git add)
git commit --amend # 修改最近一次提交(可修改提交信息或追加文件)
git commit --amend --no-edit # 追加暂存区内容到上次提交,保持提交信息不变

# ===== git pull:拉取远程更新并合并到当前分支 =====
git pull # 拉取并合并当前分支对应的远程分支
git pull <remote> <branch> # 拉取指定远程仓库的指定分支并合并
git pull --rebase # 拉取后用 rebase 方式整合,保持提交历史更整洁

# ===== git push:将本地提交推送到远程仓库 =====
git push # 推送当前分支到其跟踪的远程分支
git push <remote> <branch> # 推送到指定远程仓库的指定分支
git push -u <remote> <branch> # 推送并设置该分支的默认上游(之后直接 git push 即可)
git push --force # 强制推送(慎用!会覆盖远程历史)
git push <remote> --delete <branch> # 删除远程分支

# ===== git merge:合并分支 =====
git merge <branch> # 将指定分支合并到当前分支
git merge --no-ff <branch> # 禁止快进合并,保留分支合并节点(推荐)
git merge --squash <branch> # 将目标分支的所有提交压缩成一个后合并
git merge --abort # 合并冲突时,放弃合并并恢复到合并前状态

引用

该篇引用了以下网站及文章:
git-scm.com
博客园-lotus
菜鸟编程
Atlassian