Git学习笔记

楔子

如果入了程序员这一行,git应该是迟早都得弄明白的,对于初学者怎么理解这个东西呢。

用一个词概括就是“版本控制”。如果要学习的话廖雪峰前辈的教程非常不错,值得一看:git教程-廖雪峰,然后还有这个git简明指南

既然已经有如此优秀的教程,那本文的用意便在于对其中一些特别需要注意的点和使用频率特别高的命令记录下,方便以后快捷查看。

正文

初始化

  • cd到指定目录然后git init

状态查看

  • git status 查看当前的提交状态
  • git diff <filename> 对比文件的修改

提交(每次提交都需要add和commit)

  • git add <filename> 添加文件到暂存区
  • git commit -m "提交信息" 提交暂存区中的文件

版本回退

  • git reset --hard commit_id commit_id可以从以前的提交记录或者用git loggit relog命令得到,还可以用HEAD^以及HEAD^^表示上一个版本或上两个版本,用HEAD~100表示第上100个版本
  • git log可查看当前版本的所有提交记录(不显示回退后未来的提交记录)
  • git relog可查看版本库建立以来所有的提交记录

撤销修改

git中版本管理分成三个区域:工作区、暂存区和分支


git版本管理

在这里引用一段关于解释这个三个区域关系的话:

1).从工作目录,提交到stage。
2).从stage提交到master。

从工作目录提交到stage,需要用add或者rm命令,只提交到stage,而没有提交到master,是不会自动同步到master的。

从stage提交到master用commit命令。

退回也是要分两步,一个是从master退回到stage,然后再从stage退回到工作目录。

对于还没有提交到stage的,可以从stage用checkout命令退回,这一步会取stage中的文件状态,覆盖掉工作目录中文件的状态,跟master完全没关系。

对于已经到达stage的,想把state中的文件状态用master中的覆盖掉,就用reset命令,这样就把stage中修改用master的状态覆盖掉了,完全跟工作目录没关系

针对这三个区域的撤销修改如下:

  • 工作区:git checkout -- <filename> 此命令可以将工作区的文件修改成上一次addcommit的状态
  • 暂存区:git reset HEAD <filename> 通过此命令暂存区的版本回退至想要的版本,然后再用上面工作区的撤销修改命令将工作区文件进行撤销修改
  • 分支: 参考上面版本回退命令,直接将版本回退至指定版本,然后工作区的文件也会随之改变

删除

  • git rm <filename> 删除工作区的文件并将这个删除的修改操作add到暂存区

远程仓库

远程仓库的用法一般是:一台服务器,多台客户机,每次开发时用git clone从服务器取到最新版本,开发结束后用git push上传到服务器

  1. 推送到远程git push
    远程库是空的时,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
  • git remote add origin git@server-name:path/repo-name.git使用这个命令第一次关联远程库
  • git push -u origin master第一次推送master分支的所有内容
  • git push origin master推送最新修改
  1. 从远程克隆git clone
    Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https
    要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
    Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
  • git clone git@github.com:michaelliao/gitskills.git 使用示例

分支管理

创建、合并和删除分支

  • git checkout -b dev创建并切换到dev分支,其中-b分支表示创建并切换,相当于以下两条命令、
git branch dev
git checkout dev
  • git checkout <name>切换到指定分支
  • git branch此命令可以列出所有分支,显示结果中前面带*号的为当前分支
  • git branch <name>表示创建新分支
  • git branch -d <name>删除指定分支
  • git branch -D <name>强行删除一个分支
  • git merge <name>合并某分支到当前分支

解决冲突

合并分支时,若分支之间存在冲突,那么就需要先解决冲突然后再进行合并

分支管理策略

实际开发时,我们应该遵循一定的开发策略,以便于进行管理和开发。

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以 了。

所以,团队合作的分支看起来就像这样:


git分支管理策略

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

git merge --no-ff -m "merge with no-ff" dev

bug分支

一般修复bug会另外开一个专门的bug分支来进行修复,但是如果现在正在分支上进行工作,接到紧急任务需要修复一个bug就会出现一个冲突:工作区是被占用的。
此时可以用git stash命令来储存当前工作现场

  • git stash储存当前工作区
  • git stash list列出当前已经储存了的工作区
  • git stash apply <stash@{0}>恢复储存的工作区,此种恢复,不会删除存储的工作区,可以在后面加工作区名,表示要恢复到哪个工作区
  • git stash drop用来删除指定工作区
  • git stash pop用来恢复到一个工作区,并删除工作区记录

feature分支

用来开发新的功能

多人协作

因此,多人协作的工作模式通常是这样:

首先,可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

  • git remote -v查看远程库信息

标签管理

在git中,标签用于方便人的记忆,和某个commit绑定在一起,就像版本号(V1.0)一样,切换到分支后即可打标签

  • git tag <name>新增一个标签,默认打到最新的commit上
  • git tag查看所有标签
  • git tag v0.9 6224937将标签打到指定的commit上
  • git show <tagname>查看改标签的详细信息
  • git tag -a <tagname> -m "blablabla..."-a后加标签名,-m后加标签信息
  • git push origin <tagname>可以推送一个本地标签;
  • git push origin --tags可以推送全部未推送过的本地标签;
  • git tag -d <tagname>可以删除一个本地标签;
  • git push origin :refs/tags/<tagname>可以删除一个远程标签。

自定义git

git config --global color.ui true让git命令行显示颜色

文件忽略

.gitignore文件中写需要忽略的文件,然后提交上去

格式如下:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My configurations:
db.ini
deploy_key_rsa

配置别名

--global参数加上时表示全局,对本电脑下所有git仓库都有用,不加则只对当前仓库起作用

  • git config --global alias.st statusstatus起别名st
  • 给这一长串命令起别名lg
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"`

总结

至此git整理完毕,主要取材取git教程-廖雪峰,主要用于方便自己查阅。

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

推荐阅读更多精彩内容

  • Git教程 一、Git简介 1.1. Git的诞生1.2.集中式的vs分布式 二、安装Git 三、创建版本库 四、...
    曹渊说创业阅读 934评论 0 2
  • ----------------- Git 学习 ------------------ Git 简介 Git...
    Junting阅读 2,232评论 0 3
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,626评论 9 163
  • 自性的我 如尘世间真实的自我 觉察每个当下 如实体验每个发生 允许一切 于他原本的样子 允许我 平凡的样子 我知道...
    三月品阅读 211评论 0 0
  • 每天上班路过的公园却从来没进去过,今天带俩娃一起走走。 走在绿茵小道,孩子们发自内心的笑。 姐姐拉着弟弟一起爬上草...
    小静思阅读 383评论 1 0