--- 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 ` | 在指定的文件夹``里创建一个空的Git仓库。 | | git clone | `git clone ` | 将``中的仓库复制到自己的电脑上。 | | git config | `git config user.name` | 定义在当前仓库中所有提交的作者名,`system`、`global`、`local`来进行设定。 | | git add | `git add ` | 将中所有变更暂存到下一次提交中。也可以使用`add `和`<.>`来进行操作。 | | git commit -m | `git commit -m ""` | 提交暂存的快照,使用来说明提交了什么。 | | git status | `git status` | 列出已暂存、未暂存和未追踪的文件。 | | git log | `git log` | 使用默认格式显示所有的提交记录。 | | git diff | `git diff` | 显示索引和工作目录中未暂存的更改。 | ### Git的撤销更改 | 命令 | 例子 | 描述 | | --------------- | ------------------------------------- | ------------------------------------------- | | git revert | `git revert ` | 新建一个提交,撤销中所有的变更,并应用在当前分支上。 | | git reset | `git reset ` | 将从暂存中移除,但当前文件不会改变。这是将文件改为未暂存并不改变内容的方式。 | | git clean | `git clean -n` | 显示哪些文件没有被暂存并将被删除。用`-f`可以强制执行删除清理。 | ### Git重写历史记录 | 命令 | 例子 | 描述 | | ---------------|------------------------ |----------------------------| | git commit | `git commit --amend` | 用暂存的变更替换掉上次的提交,合并上次的提交。当没有暂存时,编辑上次提交的信息。 | | git rebase | `git rebase ` | 从当前分支嫁接到可以是对应提交ID、分支名称、标签tag 或是对HEAD的相关引用。 | | git reflog | `git reflog` | 显示本地仓库HEAD的变更记录。添加 --relative-date 来显示日期时间信息,或 --all 来显示所有信息。 | ### Git的分支 | 命令 | 例子 | 描述 | | ---------------|-----------------------------|------------------------| | git branch | `git branch` | 显示仓库中所有的分支。添加参数来新建一个叫的分支。 | | git checkout | `git checkout -b ` | 新建并检查一个叫的新分支。去掉 -b 来检查一个已存在的分支。 | | git merge | `git merge ` | 将合并到当前分支中。 | ### Git的远程仓库 | 命令 | 例子 | 描述 | | ------------------|-----------------------------------------|------------------------------------------------------------------------| | git remote add | `git remote add ` | 新建连接一个远程仓库。添加后,你可以使用作为的简写。 | | git fetch | `git fetch ` | 从仓库中抓取特定的。没有特定时,抓取所有远程的索引。 | | git pull | `git pull ` | 抓取当前分支的特定的更新,并马上将它合并到本地文件夹中。 | | git push | `git push ` | 将当前分支中的提交推送到。若远程仓库中不存在,则新建。| ### Git的差异比较 | 命令 | 例子 | 描述 | | ---------------|-----------------------------|------------------------| | git diff HEAD | `git diff HEAD` | 显示当前目录与上次提交不同的部分。 | | git diff --cached | `git diff --cached` | 显示暂存的变更与上次提交不同的部分。 | ### Git的配置 | 命令 | 例子 | 描述 | | ---------------|-----------------------------|------------------------| | git config --global user.name | `git config --global user.name ` | 设置当前用户每次提交时使用的作者名称。 | | git config --global user.email | `git config --global user.email ` | 设置当前用户每次提交时使用的作者邮箱。 | | git config --global alias | `git config --global alias ` | 新建git命令的缩写。 | | git config --system core.editor | `git config --system core.editor ` | 设置每个用户预设的文本编辑器。是打开对应编辑器的命令。 | | git config --global --edit | `git config --global --edit ` | 用文本编辑器打开全局配置文件,并进行编辑。 | ### Git的嫁接(rebase) | 命令 | 例子 | 描述 | | ---------------|-----------------------------|------------------------| | git rebase -i | `git rebase -i ` | 将当前分支嫁接到。打开编辑器来输入命令,每个提交将如何转移到新的分支上。 | ### Git Pull | 命令 | 例子 | 描述 | | ---------------|-----------------------------|------------------------| | git pull --rebase | `git pull --rebase ` | 将远程仓库的内容抓取到文件夹中。使用`--rebase`来避免合并分支。 | ### Git的重置 | 命令 | 例子 | 描述 | | ---------------|-----------------------------|------------------------| | git reset | `git reset ` | 重置暂存的内容,但不改变当前文件夹。 | | git reset --hard | `git reset --hard` | 重置暂存的内容和文件夹,匹配最近的提交,并改写所有变更。 | | git reset | `git reset ` | 重置当前分支到,重置暂存的内容,但不改变当前文件夹。 | | git reset --hard | `git reset --hard ` | 与上一条类似,但重置暂存内容和文件夹。删除未提交的变更和所有在之后的内容。 | ### Git Push | 命令 | 例子 | 描述 | | ---------------|-----------------------------|------------------------| | git push --force | `git push --force` | 强制进行推送。不要使用`--force`,除非你明确清楚自己在做什么。 | | git push --all | `git push --all` | 推送当前分支的所有内容到特定远程仓库。 | | git push --tags | `git push --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)见