Git是非常流行的版本控制软件,本篇带领大家学习如何快速使用Git管理自己的代码。

Git 命令表

命令 说明
git init 初始化仓储
git clone https://clientco.co/project.git 克隆仓储
git add file1 stage 文件 file1
git commit -m "description" 提交commit
git add --all or git add -A 一次性stage所有更改
git rm file1 删除文件
git mv file1 file2 重命名文件

附件:

APPENDIX A: Git配置

Git有几个重要的配置文件:

配置文件 说明信息
/etc/gitconfig system级别的配置信息,通过 git config —system 读写
~/.gitconfig
~/.config/git/config
用户全局配置文件,通过 git config —global 读写
.git/config 用户特定项目配置文件,通过 git config —local 或 git config 直接读写

配置信息按照 system -> 用户全局 -> 用户特定项目 的顺序覆盖,即用户全局要比system级别配置信息优先级高,对于项目而言,用户特定项目配置具有最高优先级。

A.1 添加身份信息

开始使用Git前,让我们先设置身份识别信息,通过

  1. git config [--global] user.name "YourUserName"
  2. git config [--global] user.email "YourUserEmail"

告诉Git你是谁。添加 --global 参数意在指示Git为所有项目使用同一套身份识别信息。如果你想为特定的项目使用特定的身份识别信息,只需在项目的根目录不带参 --global 设置身份信息即可。身份信息可以在任何时候进行更改。设置项目特定身份识别信息时,请确认项目是已初始化的Git项目。

Git将使用身份信息修饰每一个commit,你提交的commit中包含个人身份信息,这主要作为一种溯源的手段,方便查看是谁提交了commit、做了哪些修改,实际上Git并不检查你设置的身份信息是否真实有效。

GitHub:如果要结合GitHub使用Git,GitHub需要进行额外的配置。Git与GitHub的交互是通过GitHub中设置的主邮箱进行的,所有为了与Github交互你可以将用于标记commit的邮箱添加为Github信任邮箱并设置为主邮箱,也可以将Github的主邮箱设置为身份识别邮箱。Git提交的commit包含身份识别信息,而commit又在多用户之间共享,如果你不想暴露自己的身份身份信息,Github提供保护隐私的手段,你可以在Github中配置隐藏私人邮箱并使用Github提供的 noreply 邮箱作为交互通行证。

默认情况下,你可以在Github中指定任意已认证邮箱为主邮箱用于交互。但如果启用的邮箱隐私保护,那么你只能通过Github noreply 邮箱来提交commits. 另外Git user.name 和 Github用户名不是一回事情。

参考消息:

  1. About commit email addresses
  2. Setting your username in Git
  3. Setting your commit email address in Git
  4. Setting your commit email address on GitHub
  5. Blocking command line pushes that expose your personal email address

APPENDIX B: 基本概念

B.1 初始化Git仓储

通常我们仅需要对感兴趣的工程进行版本控制,比如现在有一个工程目录project , 我们只对project 下的变动(i.e.:新建、更改、删除等)。

  1. cd project
  2. git init

B.2 克隆仓储

你可以克隆现有仓储:git clone [https://clientco.co/project.git](https://clientco.co/project.git) , 命令将:

  1. 创建新目录
  2. 在新目录创建仓储
  3. 在新仓储添加名为origin的remote
  4. 从origin remote 下载更新

默认情况下克隆仓储将使用仓储的名字(例如:上例中的project)新建目录,你可以自定义存放克隆仓储的目录名称:git clone [https://clientco.co/project.git](https://clientco.co/project.git) my-project

克隆或新建仓储后,你可以任意命名文件夹名称,因为Git只关心文件夹下内容的更改而不关心文件夹本身的更改。

“Git is generally concerned only about what’s inside your project, not the folder containing it, no matter what name you give when cloning the project, you can safely rename the folder anytime you like.”

B.3 关于Git Commits

A commit is a type of Git data called an object. Git 所知道的所有信息 —- 文件的内容、工程目录结构、内容更改记录等都以commits的形式保存下来,commit的名字是一串机读的指纹码,根据该commit所包含的内容生成,因此不同的commit拥有不同的名字。

commit 可以看成是仓储在该commit提交时的一个快照(snapshot)。尽管你可以对仓储文件进行更改、新建、删除等操作,但对Git而言你只是在做加法 —- 不停叠加新的commits,因为任何仓储的变化都应被track然后commit。

“ items in its database are lossless, immutable: they can never truly be changed; only added to. Git is a system of accumulation. It accumulates every change you tell it about, so that you can go back and explore that history later on.” Excerpt From: David Demaree. “Git for Humans.” Apple Books.

每一个commit都是自包含的 —- 它包含仓储的一切状态,包括没有更改的文件,而不仅仅是更改过的文件

在提交commit之前,你需要向Git表明身份,即是谁准备提交这个commit。如果你想对所有的Git仓储都使用一个身份,可以使用git config --global 设置用户级别的身份:

  1. git config --global user.name "YourUserName"
  2. git config --global user.email "YourUserEmail"

如果只是想为当前仓储设置身份,使用git config 设置仓储级别的身份:

  1. git config user.name "YourUserName"
  2. git config user.email "YourUserEmail"

身份优先级:仓储级别身份 > 用户级别身份。

B.4 关于git rmgit mv

git rm: 从仓储删除文件建议使用git rm path/to/yourfile , 它再删除文件的同时还会创建一个快照或commit来记录这次删除。如果你习惯用其他方式删除文件,比如 rm 命令、拖拽到垃圾桶等,删除后需要手动创建一个快照来记录这次删除,手动创建快照的方法不是git add & git commit , 而是直接再用一次git rm /path/to/yourfile ,既然文件已经删除了,这里使用git rm 命令只是为了记录这次更改并将文件从Git索引中删除。

git mv: 仓储文件重命名建议使用git mv /path/to/file1 /path/to/file2。命令git mv source target 要求 source 文件必须存在, 否则将出现 fatal error。因此,如果你不慎使用了别的重命名方式,使用git mv 将不能记录更改并更新Git索引。因为尽管Git知道file1和file2文件内容一样,它仍无法确定这是重命名的结果,git status 会告诉你Git检测到文件file1被删除了,还有一个新文件file2没有被索引。这时可以通过

  1. git rm file1
  2. git add file2

来告诉Git停止track 旧文件file1,开始track 新文件file2。再次git status会发现Git已经识别这是一次重命名操作。