像大多数新手一样,我一开始是在 StackOverflow 上搜索 Git 命令,然后把答案复制粘贴,并没有真正理解它们究竟做了什么。

Image credit: XKCD[1]

我曾经想过:“如果有一个最常见的 Git 命令的列表,以及它们的功能是什么,这不是极好的吗?”

多年之后,我编制了这样一个列表,并且给出了一些最佳实践,让新手们甚至中高级开发人员都能从中发现有用的东西。

为了保持实用性,我将这个列表与我过去一周实际使用的 Git 命令进行了比较。

几乎每个开发人员都在使用 Git,当然很可能是 GitHub。但大多数开发者大概有 99% 的时间只是使用这三个命令:

  1. git add --all

  2. git commit -am "<message>"

  3. git push origin master

如果你只是单枪匹马,或者参加一场黑客马拉松或开发一次性的应用时,它工作得很好,但是当稳定性和可维护性开始成为一个优先考虑的事情后,清理提交、坚持分支策略和提交信息的规范性就变得很重要。

我将从常用命令的列表开始,使新手更容易了解 Git 能做什么,然后进入更高级的功能和最佳实践。

经常使用的命令

要想在仓库repo中初始化 Git,你只需输入以下命令即可。如果你没有初始化 Git,则不能在该仓库内运行任何其他的 Git 命令。

  1. git init

如果你在使用 GitHub,而且正在将代码推送到在线存储的 GitHub 仓库中,那么你正在使用的就是远程remote仓库。该远程仓库的默认名称(也称为别名)为 origin。如果你已经从 Github 复制了一个项目,它就有了一个 origin。你可以使用命令 git remote -v 查看该 origin,该命令将列出远程仓库的 URL。

如果你初始化了自己的 Git 仓库,并希望将其与 GitHub 仓库相关联,则必须在 GitHub 上创建一个,复制新仓库提供的 URL,并使用 git remote add origin <URL> 命令,这里使用 GitHub 提供的 URL 替换 <URL>。这样,你就可以添加、提交和推送更改到你的远程仓库了。

最后一条命令用在当你需要更改远程仓库时。如果你从其他人那里复制了一个仓库,并希望将远程仓库从原始所有者更改为你自己的 GitHub 帐户。除了改用 set-url 来更改远程仓库外,流程与 git remote add origin 相同。

  1. git remote -v

  2. git remote add origin <url>

  3. git remote set-url origin <url>

复制仓库最常见的方式是使用 git clone,后跟仓库的 URL。

请记住,远程仓库将连接到克隆仓库原属于的帐户。所以,如果你克隆了一个属于别人的仓库,你将无法推送到 GitHub,除非你使用上面的命令改变了 origin

  1. git clone <url>

你很快就会发现自己正在使用分支。如果你还不理解什么是分支,有许多其他更深入的教程,你应该先阅读它们,再继续下面的操作。(这里是一个教程[2])

命令 git branch 列出了本地机器上的所有分支。如果要创建一个新的分支,可以使用命令 git branch <name>,其中 <name> 表示分支的名字,比如说 master

git checkout <name> 命令可以切换到现有的分支。你也可以使用 git checkout -b 命令创建一个新的分支并立即切换到它。大多数人都使用此命令而不是单独的 branch 和 checkout 命令。

  1. git branch

  2. git branch <name>

  3. git checkout <name>

  4. git checkout -b <name>

如果你对一个分支进行了一系列的更改,假如说此分支名为 develop,如果想要将该分支合并回主分支(master)上,则使用 git merge <branch> 命令。你需要先检出(checkout)主分支,然后运行 git merge develop 将 develop 合并到主分支中。

  1. git merge <branch>

如果你正在与多个人进行协作,你会发现有时 GitHub 的仓库上已经更新了,但你的本地却没有做相应的更改。如果是这样,你可以使用 git pull origin <branch> 命令从远程分支中拉取最新的更改。

  1. git pull origin <branch>

如果您好奇地想看到哪些文件已被更改以及哪些内存正在被跟踪,可以使用 git status 命令。如果要查看每个文件的更改,可以使用 git diff 来查看每个文件中更改的行。

  1. git status

  2. git diff --stat

高级命令和最佳实践

很快你会到达一个阶段,这时你希望你的提交看起来整洁一致。你可能还需要调整你的提交记录,使得提交更容易理解或者能还原一个意外的有破坏性的更改。

git log 命令可以输出提交的历史记录。你将使用它来查看提交的历史记录。

你的提交会附带消息和一个哈希值,哈希值是一串包含数字和字母的随机序列。一个哈希值示例如下:c3d882aa1aa4e3d5f18b3890132670fbeac912f7

  1. git log

假设你推送了一些可能破坏了你应用程序的东西。你最好回退一个提交然后再提交一次正确的,而不是修复它和推送新的东西。

如果你希望及时回退并从之前的提交中检出(checkout)你的应用程序,则可以使用该哈希作为分支名直接执行此操作。这将使你的应用程序与当前版本分离(因为你正在编辑历史记录的版本,而不是当前版本)。

  1. git checkout c3d88eaa1aa4e4d5f

然后,如果你在那个历史分支中做了更改,并且想要再次推送,你必须使用强制推送。

注意:强制推送是危险的,只有在绝对必要的时候才能执行它。它将覆盖你的应用程序的历史记录,你将失去之后版本的任何信息。

  1. git push -f origin master

在其他时候,将所有内容保留在一个提交中是不现实的。也行你想在尝试有潜在风险的操作之前保存当前进度,或者也许你犯了一个错误,但希望在你的版本历史中避免尴尬地留着这个错误。对此,我们有 git rebase

假设你在本地历史记录上有 4 个提交(没有推送到 GitHub),你要回退这是个提交。你的提交记录看起来很乱很拖拉。这时你可以使用 rebase 将所有这些提交合并到一个简单的提交中。

  1. git rebase -i HEAD~4

上面的命令会打开你计算机的默认编辑器(默认为 Vim,除非你将默认修改为其他的),提供了几个你准备如何修改你的提交的选项。它看起来就像下面的代码:

  1. pick 130deo9 oldest commit message

  2. pick 4209fei second oldest commit message

  3. pick 4390gne third oldest commit message

  4. pick bmo0dne newest commit message

为了合并这些提交,我们需要将 pick 选项修改为 fixup(如代码下面的文档所示),以将该提交合并并丢弃该提交消息。请注意,在 Vim 中,你需要按下 a 或 i 才能编辑文本,要保存退出,你需要按下 Esc 键,然后按 shift + z + z。不要问我为什么,它就是这样。

  1. pick 130deo9 oldest commit message

  2. fixup 4209fei second oldest commit message

  3. fixup 4390gne third oldest commit message

  4. fixup bmo0dne newest commit message

这将把你的所有提交合并到一个提交中,提交消息为 oldest commit message

下一步是重命名你的提交消息。这完全是一个建议的操作,但只要你一直遵循一致的模式,都可以做得很好。这里我建议使用 Google 为 Angular.js 提供的提交指南[3]。

为了更改提交消息,请使用 amend 标志。

  1. git commit --amend

这也会打开 Vim,文本编辑和保存规则如上所示。为了给出一个良好的提交消息的例子,下面是遵循该指南中规则的提交消息:

  1. feat: add stripe checkout button to payments page

  2. - add stripe checkout button

  3. - write tests for checkout

保持指南中列出的类型type的一个优点是它使编写更改日志更加容易。你还可以在页脚footer(再次,在指南中规定的)中包含信息来引用问题issue。

注意:如果你正在协作一个项目,并将代码推送到了 GitHub,你应该避免重新引用(rebase)并压缩(squash)你的提交。如果你开始在人们的眼皮子底下更改版本历史,那么你可能会遇到难以追踪的错误,从而给每个人都带来麻烦。

Git 有无数的命令,但这里介绍的命令可能是您最初几年编程所需要知道的所有。

一周工作所用的日常 Git 命令相关推荐

  1. 工作超级实用的git命令

    git 工作中常用命令 1.首次使用git 2.将代码加入git管理 1.将已有代码加入git管理 2.新建项目用git管理 3.git 重命名 4. 查看版本演练历史 5. 探究.git目录 6. ...

  2. 工作中常用的git命令记录

    1.拉取代码 git clone -b <branch>(要获取的代码对应的分支 ) .....xxx.git 2.合并代码 git merge (等同于git merge --ff): ...

  3. Python命令行之旅:使用argparse实现git命令

    前言 本文将以我们日常工作中最常见的git命令为例,讲解如何使用argparse库来实现一个真正可用的命令行程序. 本文默认使用 Python 3 作为解释器进行讲解. 若你仍在使用 Python 2 ...

  4. git add后取消_Python 命令行之旅:使用 click 实现 git 命令

    作者:HelloGitHub-Prodesire 一.前言 在前面五篇介绍 click 的文章中,我们全面了解了 click 的强大能力.按照惯例,我们要像使用 argparse 和 docopt 一 ...

  5. Python 命令行之旅:使用 argparse 实现 git 命令

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  6. Google 开源的 Python 命令行库:fire 实现 git 命令

    一.前言 在前面三篇介绍 fire 的文章中,我们全面了解了 fire 强大而不失简洁的能力.按照惯例,我们要像使用 argparse.docopt 和 click 一样使用 fire 来实现 git ...

  7. 常用GIT命令整理 - WIP

    目录 简介 GIT设置系列命令 GIT路径系列命令 GIT仓库系列命令 子模块 (Submodule) GIT Attributes GIT常见故障排除 Errno 10054 Permission ...

  8. 我在实际工作中用的最多的 git 命令,全在这里了,使用简单!

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了 3 个月总结的一线大厂 Java 面试总结,本 ...

  9. 我在实际工作中用的最多的 git 命令

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:你这代码写得真丑,满屏的try-catch,全局异常处理不会吗?个人原创+1博客:点击前往,查看更多 前言 最近 ...

最新文章

  1. Android 仿PhotoShop调色板应用(三) 主体界面绘制
  2. 周4早上搜索引擎分析 - crmim.com| MSCRM开发者之家
  3. 艺龙十万级服务器监控系统开发的架构和心得
  4. MySQL完整备份,还原
  5. js实现返回顶部功能的解决方案
  6. java 过滤攻击报文_Spring Boot XSS 攻击过滤插件使用
  7. IDEA 报错:找不到包或者找不到符号
  8. 我很喜欢玩游戏,那么我就适合做游戏程序员吗?
  9. 第六篇 JVM核心机制之JVM运行和类加载全过程(一)
  10. python怎么读取csv文件-python如何读取csv数据
  11. 东方通tongweb的安装及使用(图文详细版)
  12. 原装世嘉土星SS手柄(Sega Saturn)改USB接口,实现低延时USB格斗手柄
  13. 关于C++报错:“表达式必须含有常值”的解决办法
  14. 冰羚 example-icedelivery-README.md翻译
  15. SQL-sql常用的语句
  16. c51语言c100错误,KEIL C51错误的解决办法
  17. Enriching Local and Global Contexts for Temporal Action Localization ContextLoc论文阅读笔记
  18. 用RecyclerView实现动态添加本地图片
  19. 用python画樱桃小丸子_手机插画| 可爱的樱桃小丸子绘画全过程,你也可以画出来!...
  20. 大数据Spark入门案例5–统计广告点击数量排行Top3(scala版本)

热门文章

  1. GraphX的三大图算法
  2. DBA_实践指南系列7_Oracle Erp R12监控OAM(案例)
  3. Something about WMI
  4. 我找到一个价值5.5万美元的 Facebook OAuth账户劫持漏洞
  5. activeMQ 问题
  6. Centos下pure-ftpd安装配置详解
  7. spring boot框架学习2-spring boot核心(1)
  8. Java 多线程 - 线程 - 守护线程
  9. 大文件数据导出(后台执行,自动生成)
  10. jquery[学习心得]ajax的注意点