专栏首页编程拯救世界开源世界大冒险 | 第 4 期:Git 基础

开源世界大冒险 | 第 4 期:Git 基础

在上一章中我们说到GitHub 并不等同于 Git,在这一篇文章中我们就来了解 Git 和它的基本使用。

Git 简介

在第二期《开源世界大冒险 | 第 2 期:聊聊版本控制》中,我们对版本控制进行了讲解。Git 就是目前世界上最先进的分布式版本控制系统,它支持离线工作且高度自由,如今已成为了当代程序员必须要掌握的技能之一。

而它的诞生与 Linux 有着千丝万缕的关系。

Git 诞生

Linux 之父 Linus Tovalds[1] 在 1991 年创建了开源的 Linux[2]

Linus Tovalds

随着 Linux 的发展,参与 Linux 的开发者也越来越多,开发者间的相互协作成了令人头疼的问题。

手工合并

在 1991-2002 年期间,Linus 都在用手工合并的方式维护代码,提交补丁、保存归档等繁琐事务占据了内核维护工作的大量时间。

BitKeeper

2002 年,Linus 决定使用 BitKeeper[3] 进行 Linux 的版本管理。

BitKeeper

BitKeeper 是一套闭源的商用分布式管理工具。使用闭源工具进行开源项目的代码管理,这个决定在 Linux 社区备受质疑和争议。

2005 年,一位 Linux 开发人员 Andrew 试图破解 BitKeeper 的协议,开发 BitKeeper 的商业公司 BitMover 认为他反编译了 BitKeeper,因此决定终止 Linux 免费使用 BitKeeper 的授权。

这一导火索迫使 Linux 开源社区,特别是 Linus 本人,开发一款属于自己的版本管理工具。

于是十天后,Git 诞生。

Git

是的,你没有看错,Linus 仅用了两周时间就用 C 语言开发了一款分布式版本控制系统 —— Git。

git」一词源自英国俚语,大致意思是「混账」。Linux 曾自嘲说:

I'm an egotistical bastard, and I name all my projects after myself. First Linux, now git.(我是一个自负的混蛋,我以自己的名字命名所有的项目。先是 Linux,现在是 Git。)

2005 年,Git 以 GPL[4] 发布,它最初的目的仅仅是为了更好管理 Linux 内核代码。而后,Git 凭其优势迅速成为最流行的分布式版本控制系统。

安装 Git

Git 在各平台的安装方式各不相同,在这里就不多做介绍了,为大家提供各个平台的安装链接:

  • Mac: https://git-scm.com/download/mac
  • Linux: https://git-scm.com/download/linux
  • Windows: https://git-scm.com/download/win

基本概念

三大分区

Git 本地数据管理,大概可以分为三个区:

  • 工作区(Working Directory):直接编辑的地方,就是你电脑中能看到的那个目录
  • 暂存区(Stage):数据暂时存放的地方
  • 版本库(Repository):存放已提交的数据。在初始化 Git 版本库后会生成一个 .git 隐藏文件,这就是 Git 的版本库

三大分区

四种状态

使用 Git 进行版本控制的文件都处于以下四种状态之一:

  • 未跟踪(Untrack):文件在文件夹中,但没有加入版本库,不参与版本控制
  • 未修改(Unmodified):文件已加入版本库,且版本库中的文件快照内容与文件夹中完全一致
  • 已修改(Modified):文件被修改,即版本库中的文件快照内容与文件夹中的文件不一致
  • 已暂存(Staged):暂存状态,使用 commit 可以将修改同步到版本库

文件的状态变化周期

常用命令

想要熟练使用 Git 需要掌握很多命令,在这里先介绍一些日常工作中最常使用的命令。

新建版本库

在当前目录新建一个 Git 版本库:

$ git init

从远程克隆一个版本库:

$ git clone [project-url]

版本库配置

Git 的配置文件是 .gitconfig。用户主目录下的 .gitconfig 为全局配置(global),项目目录下的 .gitconfig 则为项目配置。

设置提交代码时的用户信息:

$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

显示当前 Git 配置:

$ git config --list

增加文件

添加指定文件到暂存区:

$ git add [file1] [file2] ...

添加当前目录的所有文件到暂存区:

$ git add .

添加指定目录(包含子目录)到暂存区:

$ git add [dir]

删除文件

删除工作区文件,并将删除操作同步到暂存区:

$ git rm [file1] [file2] ...

停止追踪文件:

$ git rm --cached [file]

修改文件名,该修改会被放入暂存区:

$ git mv [file-original] [file-renamed]

提交代码

将暂存区文件同步到仓库区:

$ git commit -m [commit-message]

提交暂存区的指定文件

$ git commit [file1] [file2] ... -m [commit-message]

分支

分支列表

列出所有本地分支:

$ git branch

列出所有远程分支:

$ git branch -r

列出本地分支和远程分支:

$ git branch -a

新建分支

新建分支,但依旧停留在当前分支:

$ git branch [new-branch-name]

新建分支,且切换到新分支:

$ git branch -b [new-branch-name]

新建分支,并指向特定的 commit:

$ git branch [new-branch-name] [commit]

新建分支,并与远程分支建立追踪关系:

$ git branch --track [new-branch-name] [remote-branch]

分支切换

切换到上一个分支:

$ git checkout -

切换到指定分支:

$ git checkout [branch-name]

分支合并

合并指定分支到当前分支:

$ git merge [branch]

分支删除

删除指定分支:

$ git branch -d [branch-name]

删除远程分支:

$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

查看信息

变更

显示所有变更文件:

$ git status

日志

显示当前分支版本历史:

$ git log

显示 commit 历史与每次 commit 时发生变更的文件:

$ git log --stat

根据关键词搜索提交记录:

$ git log -S [keyword]

显示某文件的历史版本:

$ git log --follow [file]
$ git watchanged [file]

显示过去 10 次提交:

$ git log -10 --pretty --oneline

差异

显示暂存区与工作区的差异:

$ git diff

显示暂存区与上一次 commit 的差异:

$ git diff --cached [file]

显示工作区与当前分支最新 commit 之间的差异:

$ git diff HEAD

看看你今天写了多少代码:

$ git diff --shortstat "@{0 day ago}"

远程同步

从远程获取

获取远程仓库的所有变动:

$ git fetch [remote]

获取远程仓库的所有变化,并与本地分支合并:

$ git pull [remote] [branch]

从本地推送

上传本地分支到远程仓库:

$ git push [remote] [branch]

强制推送当前分支到远程仓库:

$ git push [remote] --force

推送所有分支到远程仓库:

$ git push [remote] --all

撤销

暂存区 -> 工作区

恢复暂存区指定文件到工作区:

$ git checkout [file]

恢复暂存区所有文件到工作区:

$ git checkout .

重置

重置暂存区的指定文件,让其与上一次 commit 保持一致:

$ git reset [file]

重置暂存区与工作区,与上一次 commit 保持一致:

$ git reset --hard

重置当前分支的 HEAD 为指定 commit,且重置暂存区,但工作区不变:

$ git reset [commit]

重置当前分支的 HEAD 为指定 commit,且重置暂存区和工作区,与指定 commit 一致:

$ git reset --hard [commit]

新建一个 commit,用来撤销指定 commit:

$ git revert [commit]

总结

  • Git 是由 Linux 之父 Linus Tovalds 编写的版本管理工具,最初被用来管理 Linux 内核代码。
  • Git 是目前最先进的分布式版本管理系统,没有之一。
  • Git 本地数据管理,大概可以分为三个区:工作区、暂存区、版本库。
  • 使用 Git 进行版本控制的文件都处于以下四种状态之一:未跟踪、已修改、未修改、已暂存。
  • Git 常用命令包括:新建版本库、配置版本库、添加文件、删除文件、提交代码、分支操作等。

参考资料

[1]

Linus Tovalds: https://en.wikipedia.org/wiki/Linus_Torvalds

[2]

Linux: https://zh.wikipedia.org/zh/Linux

[3]

BitKeeper: https://zh.wikipedia.org/wiki/BitKeeper

[4]

GPL: https://zh.wikipedia.org/wiki/GNU%E9%80%9A%E7%94%A8%E5%85%AC%E5%85%B1%E8%AE%B8%E5%8F%AF%E8%AF%81

本文分享自微信公众号 - 编程拯救世界(CodeWarrior_),作者:江子抑

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 开源世界大冒险 | 第 2 期:Git 基础

    在第二期《开源世界大冒险 | 第 2 期:聊聊版本控制》中,我们对版本控制进行了讲解。Git 就是目前世界上最先进的分布式版本控制系统,它支持离线工作且高度自由...

    江不知
  • 工具安利 | docsify 入坑指南与我放弃 Gitbook 的那些理由

    leetcode-notebook[1] 的题解越来越多,原先选择 Gitbook[2] 构建解题本的弊端逐渐显现出来,每次补充一道题解重新 build 项目时...

    江不知
  • 图解精选 TOP 面试题 006 | 进制转换

    与其他进制转 10 进制的计算方式相同。我们假设 n 位上的数字为 ,那么该位置所产生的 10 进制数值为:

    江不知
  • 收藏!史上最干货的Git命令整理,一文胜千言

    下图是Git基本操作的流程图,一般来说,日常使用只要记住下图7个命令就可以了。当然,不能靠这几个基础语法就以为熟练使用了Git哦,下面整理了详细的语法记录,结合...

    陈哈哈
  • Git使用教程

    用户1203875
  • 开源世界大冒险 | 第 2 期:Git 基础

    在第二期《开源世界大冒险 | 第 2 期:聊聊版本控制》中,我们对版本控制进行了讲解。Git 就是目前世界上最先进的分布式版本控制系统,它支持离线工作且高度自由...

    江不知
  • Git从入门到进阶,你想要的全在这里

    Git 是一个「分布式版本管理工具」,其具备太多的优点:更方便的 Merge、更方便的管理、更健壮的系统、对网络的依赖性更低、更少的“仓库污染” 等等,这使得G...

    Python编程与实战
  • Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!

    因为教程详细,所以行文有些长,新手边看边操作效果出乎你的预料。GitHub虽然有些许改版,但并无大碍。

    叫我龙总
  • 走在前沿的弄潮儿,怎能不会Git的那些奇技淫巧

    本文介绍了七十多种常用的 Git 命令与技巧,项目作者削微寒在开源工作上也做了非常多的贡献。目前 Git 奇技淫巧项目已经获得了 6.8K 的 Star,他还构...

    小小詹同学
  • 走在前沿的弄潮儿,怎能不会Git的那些奇技淫巧

    本文介绍了七十多种常用的 Git 命令与技巧,项目作者削微寒在开源工作上也做了非常多的贡献。目前 Git 奇技淫巧项目已经获得了 6.8K 的 Star,他还构...

    机器之心

扫码关注云+社区

领取腾讯云代金券