90DaysOfDevOps/2022/zh_cn/Days/day37.md

173 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: '#90DaysOfDevOps - 了解 Git - 第三十七天'
published: false
description: 90DaysOfDevOps - 了解 Git
tags: "devops, 90daysofdevops, learning"
cover_image: null
canonical_url: null
id: 1048707
---
## 了解 Git
很抱歉使用了双关的标题(Gitting to know Git)。但我肯定不是第一个开这个玩笑的人!
在[第三十五天](day35.md)的分享中我们对版本控制、git的基本工作流有了一定了解。然后[第三十六天](day36.md)我们在电脑上安装了git进行了更新和配置。同时也进一步学习了客户端服务器和Git的分布式版本控制。
现在我们要去学习一些常用的git命令及其案例。
### 在哪里查看git的帮助
有时候你可能不记得或者不知道该使用哪个git命令。这就需要寻找帮助(help)。
在查找帮助的第一时间,你可能会使用搜索引擎,百度一下。
第二步会是查看git上的官方内容和文档。这里([git-scm.com/docs](http://git-scm.com/docs))你不仅可以找到所有命令的可靠资料,还可以找到很多不同的资源。
![](../../Days/Images/Day37_Git1.png)
在离线环境下,我们也可以通过终端(terminal)来查看相同的文档。如果我们想使用`git add`命令,我们可以运行`git add --help`,这里会看到下面的说明内容。
![](../../Days/Images/Day37_Git2.png)
我们也可以在shell中用`git add -h`来查看简短的选项描述。
![](../../Days/Images/Day37_Git3.png)
### Git的错误认知
"Git has no access control" - 你可以授权一个领导者来维护源代码。
"Git is too heavy" - Git可以提供浅层存储库(shallow repositories),这在项目很大的时候,减少了历史记录的数量。
### 存在的缺点
对于二进制文件的处理并不完美。例如Git适用于源代码但不太适合可执行文件或视频文件。
Git对用户不是很友好我们也花了一些时间来讨论其中的命令和功能这也是它的一个关键标志。
总的来说git有学习难度但它很好用。
### Git的生态
我想简单聊一下围绕git的生态系统个人觉得有必要从宏观角度去了解这些。
几乎所有现代开发工具支持Git。
- 开发者工具 - 我们之前有提到过visual studio code你发现git的插件被集成到了如sublime text和其他文本编辑器和IDE中。
- 团队工具 - 用来做持续集成/持续部署的Jenkins信息传递框架的Slack和用于项目管理和问题追踪的Jira。
- 云供应商 - 所有大型云供应商都支持Git。 (Microsoft Azure, Amazon AWS, Google Cloud Platform)
- 基于Git的服务 - 有GitHub、GitLab和 BitBucket后续会进一步讨论。我听说这些服务是代码的社交平台
### Git备忘录
我们没有列出绝大部分的命令但查看了网上的一些备忘录后我想记录一些git的命令及其用途。你不需要把它们全部记下来只需多使用你会学到它的基本用法。
我是从[atlassian](https://www.atlassian.com/git/tutorials/atlassian-git-cheatsheet)那里找到的把它们整理下来也是了解Git命令的一种好方法。
### Git基本操作
| 命令 | 例子 | 描述 |
| --------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| git init | `git init <directory>` | 在指定的文件夹`<directory>`里创建一个空的Git仓库。 |
| git clone | `git clone <repo>` | 将`<repo>`中的仓库复制到自己的电脑上。 |
| git config | `git config user.name` | 定义在当前仓库中所有提交的作者名,`system`、`global`、`local`来进行设定。 |
| git add | `git add <directory>` | 将<directory>中所有变更暂存到下一次提交中。也可以使用`add <files>`和`<.>`来进行操作。 |
| git commit -m | `git commit -m "<message>"` | 提交暂存的快照,使用<message>来说明提交了什么。 |
| git status | `git status` | 列出已暂存、未暂存和未追踪的文件。 |
| git log | `git log` | 使用默认格式显示所有的提交记录。 |
| git diff | `git diff` | 显示索引和工作目录中未暂存的更改。 |
### Git的撤销更改
| 命令 | 例子 | 描述 |
| --------------- | ------------------------------------- | ------------------------------------------- |
| git revert | `git revert <commit>` | 新建一个提交,撤销<commit>中所有的变更,并应用在当前分支上。 |
| git reset | `git reset <file>` | 将<file>从暂存中移除,但当前文件不会改变。这是将文件改为未暂存并不改变内容的方式。 |
| git clean | `git clean -n` | 显示哪些文件没有被暂存并将被删除。用`-f`可以强制执行删除清理。 |
### Git重写历史记录
| 命令 | 例子 | 描述 |
| ---------------|------------------------ |----------------------------|
| git commit | `git commit --amend` | 用暂存的变更替换掉上次的提交,合并上次的提交。当没有暂存时,编辑上次提交的信息。 |
| git rebase | `git rebase <base>` | 从当前分支嫁接到<base><base>可以是对应提交ID、分支名称、标签tag 或是对HEAD的相关引用。 |
| git reflog | `git reflog` | 显示本地仓库HEAD的变更记录。添加 --relative-date 来显示日期时间信息,或 --all 来显示所有信息。 |
### Git的分支
| 命令 | 例子 | 描述 |
| ---------------|-----------------------------|------------------------|
| git branch | `git branch` | 显示仓库中所有的分支。添加<branch>参数来新建一个叫<branch>的分支。 |
| git checkout | `git checkout -b <branch>` | 新建并检查一个叫<branch>的新分支。去掉 -b 来检查一个已存在的分支。 |
| git merge | `git merge <branch>` | 将<branch>合并到当前分支中。 |
### Git的远程仓库
| 命令 | 例子 | 描述 |
| ------------------|-----------------------------------------|------------------------------------------------------------------------|
| git remote add | `git remote add <name> <url>` | 新建连接一个远程仓库。添加后,你可以使用<name>作为<url>的简写。 |
| git fetch | `git fetch <remote> <branch>` | 从仓库中抓取特定的<branch>。没有特定<branch>时,抓取所有远程的索引。 |
| git pull | `git pull <remote>` | 抓取当前分支的特定<remote>的更新,并马上将它合并到本地文件夹中。 |
| git push | `git push <remote> <branch>` | 将当前分支中的提交推送到<remote>。若远程仓库中不存在<branch>,则新建<branch>。|
### Git的差异比较
| 命令 | 例子 | 描述 |
| ---------------|-----------------------------|------------------------|
| git diff HEAD | `git diff HEAD` | 显示当前目录与上次提交不同的部分。 |
| git diff --cached | `git diff --cached` | 显示暂存的变更与上次提交不同的部分。 |
### Git的配置
| 命令 | 例子 | 描述 |
| ---------------|-----------------------------|------------------------|
| git config --global user.name <name> | `git config --global user.name <name>` | 设置当前用户每次提交时使用的作者名称。 |
| git config --global user.email <email> | `git config --global user.email <email>` | 设置当前用户每次提交时使用的作者邮箱。 |
| git config --global alias <alias-name> <git-command> | `git config --global alias <alias-name> <git-command>` | 新建git命令的缩写。 |
| git config --system core.editor <editor> | `git config --system core.editor <editor>` | 设置每个用户预设的文本编辑器。<editor>是打开对应编辑器的命令。 |
| git config --global --edit | `git config --global --edit ` | 用文本编辑器打开全局配置文件,并进行编辑。 |
### Git的嫁接(rebase)
| 命令 | 例子 | 描述 |
| ---------------|-----------------------------|------------------------|
| git rebase -i <base> | `git rebase -i <base>` | 将当前分支嫁接到<base>。打开编辑器来输入命令,每个提交将如何转移到新的分支上。 |
### Git Pull
| 命令 | 例子 | 描述 |
| ---------------|-----------------------------|------------------------|
| git pull --rebase <remote> | `git pull --rebase <remote>` | 将远程仓库的内容抓取到文件夹中。使用`--rebase`来避免合并分支。 |
### Git的重置
| 命令 | 例子 | 描述 |
| ---------------|-----------------------------|------------------------|
| git reset | `git reset ` | 重置暂存的内容,但不改变当前文件夹。 |
| git reset --hard | `git reset --hard` | 重置暂存的内容和文件夹,匹配最近的提交,并改写所有变更。 |
| git reset <commit> | `git reset <commit>` | 重置当前分支到<commit>,重置暂存的内容,但不改变当前文件夹。 |
| git reset --hard <commit> | `git reset --hard <commit>` | 与上一条类似,但重置暂存内容和文件夹。删除未提交的变更和所有在<commit>之后的内容。 |
### Git Push
| 命令 | 例子 | 描述 |
| ---------------|-----------------------------|------------------------|
| git push <remote> --force | `git push <remote> --force` | 强制进行推送。不要使用`--force`,除非你明确清楚自己在做什么。 |
| git push <remote> --all | `git push <remote> --all` | 推送当前分支的所有内容到特定远程仓库。 |
| git push <remote> --tags | `git push <remote> --tags` | 当你推送一个分支或使用`--flag`时Tags不会被自动推送。添加`--tags`后才推送所有tags到远程仓库。 |
## 相关资料
- [What is Version Control?](https://www.youtube.com/watch?v=Yc8sCSeMhi4)
- [Types of Version Control System](https://www.youtube.com/watch?v=kr62e_n6QuQ)
- [Git Tutorial for Beginners](https://www.youtube.com/watch?v=8JJ101D3knE&t=52s)
- [Git for Professionals Tutorial](https://www.youtube.com/watch?v=Uszj_k0DGsg)
- [Git and GitHub for Beginners - Crash Course](https://www.youtube.com/watch?v=RGOj5yH7evk&t=8s)
- [Complete Git and GitHub Tutorial](https://www.youtube.com/watch?v=apGV9Kg7ics)
- [Git cheatsheet](https://www.atlassian.com/git/tutorials/atlassian-git-cheatsheet)
[第三十八天](day38.md)见