Git Note:Git常用命令总结

想要学会使用Git,首先需要理解什么是分布式版本库,什么是工作区和暂存区,这几个概念是理解很多命令的基础。强烈推荐阅读廖雪峰老师写的Git教程,这是目前为止最好的中文Git教程,没有之一。如果你想要成为Git专家请参考《Pro Git》(Second Edition)

先简单地解释一下工作区、版本库和暂存区。看不懂没关系,先了解下后面的git addgit commit命令后再看就容易理解了。(如果还是没有明白,点这里。)

  • 工作区:你的工作目录,你的工程文件夹。
  • 版本库:就是你工作区中的.git文件夹,这里忠实地记录着你提交过的每一次改动。git commit命令就是把你的改动从暂存区提交到了版本库的当前分支,比如默认的master分支。
  • 暂存区:需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。也就是使用git add后文件修改就保存到了暂存区,以备使用git commit命令提交到真正的版本库。

这里只对常用命令做一下梳理,这些命令基本可以满足日常使用,注意所有git命令都要在你项目的根目录下使用。

创建仓库

$ git init

添加到暂存区

创建仓库之后就可以使用git管理当前目录下的代码了。同时该目录下多了一个.git的子目录,用ls -a可以查看。

$ git add filename

把修改添加到暂存区,每次修改后都需要运行git add命令,之前已经add过得文件也一样,如果不add到暂存区,那就无法commit。因为git记录的是修改而不是你文件的拷贝,这也是它可以如高效和节约空间的原因。(使用过git add命令的文件状态就是Tracked,新建的文件状态是Untracked。)

$ git add .

把所有文件添加到暂存区。

忽略某些文件

有些文件我们无需Git管理,也不希望看到它出现在Untracked列表里面,比如使用Vim时产生的.swp临时文件。我们只要创建一个名为.gitignore的文件,列出要忽略的文件模式即可,支持简单地正则表达式(其实是glob模式匹配,shell中使用的简化了的正则表达式)。
看一个《Pro Git》中给的.gitignore文件的例子就懂了:

# 此为注释,会被 Git 忽略
# 忽略所有 .swp 结尾和 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下地所有文件
build/
# 忽略 doc/ 目录下的所有 .txt 文件,但不包括 doc/ 子目录中的 .txt 文件
doc/*.txt
# 忽略 doc/ 目录下的所有 .txt 文件,包括 doc/ 子目录中的 .txt 文件
doc/**/*.txt

那些讨厌的临时文件再也不会在git add的时候捣乱,也不会出现在Untracked列表里了。

提交

$ git commit -m "wrote a new file"

把文件提交到版本库,-m后面输入的是本次提交的说明,方便以后从历史记录里找到改动记录。

如果不想每次都要git addgit commit怎么办,有一个简单地办法,使用-a参数:

$ git commit -a -m "I did some work"

这样即使是上次提交之后修改过的文件(Tracked)也可以直接提交到版本库中(当前的分支)。

查看状态

$ git status

查看版本库状态,就是告诉你哪个文件修改已经在暂存区了(to be commit),哪个文件已经add过但是最后的修改没有add(Changes not staged for commit),哪个文件是新建的还没有add过(Untracked)。

查看日志

$ git log

git log命令显示所有提交,从最早的提交到最近一次提交(当前HEAD所指向的提交,请参考版本回退)。

$ git log --pretty=oneline

加上--pretty参数后可以单行输出。

$ git reflog

用来记录你的每一次命令,包括回退命令。

版本回退

在Git中,用HEAD表示当前版本,也就是最新的提交。

$ git reset --hard HEAD^

这个命令表示回退到当前HEAD的上一个版本,也就是舍弃了最后一次提交。会退后再使用git log命令将无法查看最后一次提交的记录,只能看到当前HEAD,以及更早的提交。可以使用git reflog命令查看所有提交记录。

$ git reset fc142e435432984a95b46bb7b757b9bdcee0e8e8

git reset后的参数是通过git reflog查看到的你希望回退到的版本,可以是任意提交过的版本。

撤销修改

$ git checkout -- filename

命令git checkout -- filename意思就是,把filename文件在工作区的修改全部撤销,这里有两种情况:

  • 文件修改后还没有add到暂存区,撤销修改就回到最后一次commit时的状态;

  • 已经add后又作了修改,撤销修改就回到最后一次add时的状态。

如果你乱改了文件还add到了暂存区,想要回到上一次commit时的状态,先使用命令git reset HEAD filename,使暂存区文件恢复到和commit时一致,再使用git checkout -- filename

注意:git checkout -- file命令中的--很重要,没有--,就变成了“创建一个新分支”的命令。

删除文件

直接删除摸个文件,或者用rm filename命令删除,然后使用命令:

$ git rm filename

然后commit 就可以了。如果不小心删错了文件并且没有commit,没关系,冷静一下,使用上面一条命令git checkout -- filename就可以恢复了。

如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

查看分支

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。默认分支是master,也是HEAD指向的分支。

$ git branch

前面有*的分支是当前分支。

新建分支

$ git branch branchname

比如git branch dev命令创建了一个叫dev的分支,现在devmaster指向相同的提交。

切换分支

$ git checkout branchname

使用git checkout dev后,HEAD就指向了dev,现在提交的修改就会到dev分支上,而master分支会停留在当前状态。

创建+切换分支

$ git checkout -b branchname

前面两条命令合并成一条。

合并某分支到当前分支

$ git merge branchname

比如当前分支是master,使用git merge dev,会将dev分支上的提交添加到master分支上。这种合并方式是快速合并(Fast-forward)当两个分支都做过修改后合并是可能会产生冲突,无法进行快速合并,当Git无法自动合并分支时,就必须首先解决冲突

删除分支

$ git branch -d branchname

合并完成后,就可以放心地删除dev分支了。合并后再删掉分支,和直接在master分支上工作效果是一样的,但过程更安全。

查看文件差异

$ git diff

比较工作区和暂存区的差异。

$ git diff filename

比较同一个文件在不同分支的差异。

$ git diff branchname

比较当前分支和branchname分支的差异。

$ git diff --cached
// or git diff --staged

比较暂存区和HEAD的差异。

$ git diff --HEAD

比较工作区和HEAD的差异。

解决冲突

git merge命令会标记有冲突的文件内容,使用git status可以查看冲突文件,使用git diff filename可以查看文件内容,比较不同分支上的差异。

打开有冲突的文件,解决冲突,再提交,合并完成。

用带参数的git log --graph可以看到分支的合并情况:

$ git log --graph --pretty=oneline --abbrev-commit

现在,你已经可以使用Git在自己的机器上愉快地玩耍啦_

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

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,519评论 9 163
  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,410评论 1 26
  • 第二部分 盛年不重来,一日难再晨 第三十章 搬家不停歇 姥爷和姥姥这一生搬了很多次家,这不,在我小学六年级时,他们...
    W晓晓阅读 214评论 0 2
  • 最近在项目中遇到了涉及二维码相关的问题, 这里想记录总结一下二维码相关技术 一. 二维码的介绍 二维条码/二维码是...
    TitanCoder阅读 2,997评论 0 6
  • 这几天二宝睡得不太好,白天我没有陪他睡,在看书复习,中午饭点时也会偷懒看下电视,是爸的平板放的热播剧。 8点左右,...
    小丫屠阅读 189评论 0 1