Git 简介(下):基本命令介绍与简单教程

兄弟篇:Git简介(上):版本控制 与 Git 的崛起


写在前面

文章内容:主要介绍一下 Git 中的一些基本命令,这些命令都是最基本最常用的
目标读者:Git 初学者
需具备知识:至少需要知道什么是版本控制,以及什么是 Git 。可以参考我的这篇文章:Git简介(上):版本控制 与 Git 的崛起
所需时间:纯阅读文章大概需要 10min,边做边实践大概 30min~50min

注意:git 包含很多概念性和技术性的细节,这些细节纷繁复杂,有些还不易理解,本文只是基础性的介绍,为了保持行文的清晰简明,除了必要的说明,我忽略了这些细节。各位读者遇到不懂的细节需要自己查阅相关文档。

文章较长,可以使用 Control + F 查找相关内容阅读


〇、命令列表

命令 意义
git config 配置相关信息
git clone 复制仓库
git init 创建版本库
git add 添加更新内容到索引中
git commit 提交
git status 获取当前项目状况
git diff 比较内容
git branch 分支相关
git checkout 切换分支
git merge 合并分支
git log 查看日志

一、配置自己的 git 信息

第一次使用 git 需要使用命令git config修改自己的信息,以方便项目其他成员查看是谁提交的,一般包括提交人的名字、邮箱地址等。命令格式为:git config --global <配置名称> <配置值>

具体操作:

git config --global user.name "foo"
git config --global user.email "bar@jianshu.com"

二、你得有一个版本库先

两种方法,一种是从别人的版本库中克隆一份一模一样的;一种是自己创建一个新的版本库。分别使用命令git clonegit init

  1. 克隆一个版本库

命令格式为:git clone <远程仓库地址>

远程仓库地址 Git URL 支持ssh://, http(s)://, git:// 等协议。有些仓库(例如 GitHub)可以通过不只一种协议来访问。

具体操作:

git clone git_URL

clone 操作完成后,当前目录下会多一个目录,该目录下的文件就是刚刚 clone 下来的项目文件。

  1. 自己创建一个版本库

只需在已有的项目目录中执行一条命令 git init 即可。

具体操作:

cd project_dir
git init

操作完成后仓库就被初始化了。

无论方法 1 还是方法 2,操作完成后都会在项目目录下自动创建一个 .git 目录,里面有一些进行版本控制的相关文件,请勿手动修改这些文件,否则会破坏版本库。

三、添加文件到版本库

需要用到两个命令:git addgit commit

假设我们现在已经新建了一个 README.md 文件,需要把它加入到版本库中,需要进行如下操作:

git add README.md
git commit -m "add new file"

这里的两个命令会很让人困惑。事实上,Git 有工作区、版本库的两个概念,Git 的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫index)的暂存区,还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。我们编辑文件时都是在工作区进行的,编辑完成后使用 git add 命令将修改放进暂存区中,而不是将修改直接加进版本库中。当所有的编辑修改完成后使用 git commit 命令将暂存区的内容提交到版本库的分支(master或其他),这才是真正存放版本信息的地方。而且git commit提交的只是暂存区中的内容,如果你在git add将修改添加到暂存区之后又做了一些修改但没有add时,commit只会提交你add的版本,之后的修改仍留在了工作区并没有提交到版本库。

图片来自廖雪峰 Git 教程

当项目已经做了一些修改,但还无法提交到仓库时,应当git add file1 file2 file3 ...将当前的修改添加进暂存区。

当只做了一次修改就完全可以提交时,可以使用git commit -a -m "..."命令来一次性提交。这里增加了一个-a的命令选项,它会将工作区的所有文件都提交到仓库,即使还没有添加到暂存区。

-m "..."的意思是后面输入的是本次提交的说明,会保存到版本库的日志文件中。可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

四、查看当前状态和对比不同


命令:git statusgit diff

意义:假如对文件做了修改,这时版本库的状态显然和之前是不一样的,使用git status可以查看;在新的内容添加到暂存区或者提交到版本库后,可以使用git diff查看当前版本与上次版本的不同。

假设我对README.md文件增加了新内容,但还没添加到暂存区,此时查看状态显示如下:

$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

    修改:     README.md

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

此时查看README.md文件的不同:

$ git diff README.md
diff --git a/README.md b/README.md
index a9fd153..1ac9d3a 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
 Hello, git!
 new line
 new line2
+new line3

使用git addgit stage添加到暂存区后查看状态:

$ git add README.md
$ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

    修改:     README.md

此时再git diff README.md将不会有任何内容,因为修改已经添加到了暂存区,需要使用git diff --cached来查看暂存区的修改情况:

$ git diff --cached
diff --git a/README.md b/README.md
index a9fd153..1ac9d3a 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
 Hello, git!
 new line
 new line2
+new line3

git commit提交后查看状态:

$ git status
位于分支 master
无文件要提交,干净的工作区

五、分支管理


项目仓库的文件和各个修改的提交构成了一个被称为「分支」的概念,一个项目版本库可以有多个不同的分支,各分支间互相独立。当多人协作进行项目开发时,为了能够并行开发,每个成员在自己的分支下进行开发,提交的代码不会影响其他人,再所有开发都完成后,再将所有分支合并。

Git 提供了相较于其他版本控制系统性能更加优越的分支管理能力,提供了包括但不限于git branch创建分支,git checkout切换分支,git merge合并分支等功能。

  • git branch 创建分支
git branch branch_name

查看当前已有的所有分支:

$ git branch
*master
test

前面带*的表示当前所在的分支。

  • git checkout 切换分支
    切换到刚才创建的test分支:
$ git checkout test
切换到分支 'test'
$ git branch
 master
*test
  • 也可以使用 git checkout -b branch_name 表示创建并切换
  • ** git merge another_branch 合并分支**
    该命令的意思是将另一个分支合并到当前分支,例如
$ git checkout master
切换到分支 'master'
$ git merge test

合并分支时可能会出现冲突,典型的情况是两个分支对同一个文件都做了修改:

$ git merge test
自动合并 README.md
冲突(内容):合并冲突于 README.md
自动合并失败,修正冲突然后提交修正的结果。
$ git status
位于分支 master
您有尚未合并的路径。
     (解决冲突并运行 "git commit")
未合并的路径:
     (使用 "git add <文件>..." 标记解决方案)
双方修改:   README.md
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

这时查看冲突文件是这样的:

Hello, git!
<<<<<<<<<<HEAD
new line on master
============
new line on test
>>>>>>>>>>test

解决办法是手动删除冲突文件中的<<<====>>>>等行,之后git commit -a -m "..." 即可。

六、Git 日志

以下命令请读者在自己电脑上实验查看结果

  1. 查看日志

git log 命令可以显示所有的提交(commit),如果提交的历史纪录很长,回车会逐步显示,输入q可以退出。

git log有很多选项,可以使用git help log查看,例如下面的命令就是找出所有从"v2.5“开始在fs目录下的所有Makefile的修改:

$ git log v2.5.. Makefile fs/

Git会根据git log命令的参数,按时间顺序显示相关的提交(commit)。

  1. 日志统计
    如果用 --stat 选项使用 git log,它会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录:
git log --stat
  1. 格式化日志
    你可以按你的要求来格式化日志输出。--pretty参数可以使用若干表现格式,如oneline:
git log --pretty=oneline

或者你也可以使用short 格式:

git log --pretty=short

你也可用 medium, full, fuller, emailraw。 如果这些格式不完全符合你的相求, 你也可以用--pretty=format 参数定义格式。

--graph选项可以可视化你的提交图(commit graph),会用ASCII字符来画出一个很漂亮的提交历史(commit history)线:

$ git log --graph --pretty=oneline
  1. 日志排序
    日志记录可以按不同的顺序来显示。如果你要指定一个特定的顺序,可以为git log命令添加顺序参数。

按默认情况,提交会按逆时间顺序显示,可以指定--topo-order 参数,让提交按拓扑顺序来显示(就是子提交在它们的父提交前显示):

git log --pretty=format:'%h : %s' --topo-order --graph

你也可以用--reverse 参数来逆向显示所有提交日志。

本系列文章作为 Git 的基本介绍和简单教程到这里就完结了,写累死@_@ 有关于 Git 的更多内容网上有很多资源,请读者自行搜索。

兄弟篇:Git简介(上):版本控制 与 Git 的崛起


版权声明 自由转载 - 保持署名 - 不可商用 - 不可演绎 (CC3.0 创意共享3.0许可证

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 1.git的安装 1.1 在Windows上安装Git msysgit是Windows版的Git,从https:/...
    落魂灬阅读 12,649评论 4 54
  • 我一开始看到这个答案还犹豫了一下,因为比如说我到了level i层,但是只有一个元素啊,怎么知道整层元素呢? 这里...
    98Future阅读 989评论 0 0
  • 《拯救大兵瑞恩》,每次看这个电影给我印象最深刻的不仅仅是抢滩登陆的惨烈,这个桥段更是让我永远都无法忘怀:瑞恩的妈妈...
    法三章阅读 353评论 0 2
  • 每天早晨和中午睡醒的那一刻都总觉得是沉重的,思绪不知道被什么东西揪着。从睁开眼的那一霎那,一股莫名的压抑的感觉就席...
    安人阅读 409评论 0 1
  • 今天再和大家回顾刘备一生中的其他大事-失荆州。之前我们看到了刘备得益州,攻汉中,称汉中王。假使我们处在刘备那个位置...
    叹谁逍遥阅读 258评论 0 1