你已经会用 Git 了吗?

图片发自简书App

工作中很多同学已经会使用 Git 了,然而对各个概念比较模糊,这里主要理清 Git 中的各个概念,更好的理解 Git。如果你还不知道如何使用 Git,可以参考 @廖雪峰 廖雪峰 的文章。我也是一名 Git 菜鸟,看完 @画渣程序猿mmoaay 写的 Git 教程后,自己利用业余时间从头学习了 Git。更多内容可以参考官网

命令行

使用 Git 时,我们完全可以利用 Git 命令行来完成我们的工作,但是通常情况下使用Git工具比较方便。比如:SoureTree。但是有时候不得不使用命令行,所以还是踏踏实实学习一下 Git 命令吧,当然详细的命令可以参考官方文档

  • git init: 初始化一个空的 Git。在桌面上创建一个文件夹,然后创建一个空的 Git,执行完 git init 命令后,会新建一个隐藏的文件夹 .git
$ mkdir lefeGit
$ cd lefeGit
$ git init

lefeGit 相当于一个仓库(repository)也称为我们的工作区,这里的文件将被 git 管理。

  • git add: 把工作区的内容提交到暂存区;
$ touch lefe.js // 创建一个 lefe.js 文件
$ git add lefe.js // 把 lefe.js 文件修改的内容提交到暂存区
$ git add * // 把当前工作区所以修改过的内容一次提交到暂存区
  • git commit: 把当前修改的内容提交到当前分支;
$ vi lefe.js // 编辑 lefe.js 文件
$ git add * // 把 lefe.js 文件修改的内容提交到暂存区
$ git commit -m 'add lefe' // 把当前修改的内容提交到当前分支,初始化git
的时候,会默认创建一个 master 分支,-m 后是提交时的备注
  • git log: 显示从最近到最远的提交日志
  • git log --pretty=oneline: 显示从最近到最远的提交日志,单行显示
  • git reflog: 查看命令历史
$ git log
commit a7fcde1af5f78af8e44290f3951bb159a9bbcac0 (HEAD -> master)
Author: wangsuyan <wsyxyxs@126.com>
Date:   Thu Nov 2 16:23:35 2017 +0800

    add lefe
    
$ git log --pretty=oneline
a7fcde1af5f78af8e44290f3951bb159a9bbcac0 (HEAD -> master) add lefe
  • git checkout -- file: 修改未提交到暂存区的文件
$ git checkout lefe.js // 撤销还没有提交到暂存区的更改,这是被修改的内容还在工作区中
  • git reset HEAD file: 修改添加到暂存区的文件
$ git reset HEAD lefe.js // 撤销修改的文件到暂存区
$ git checkout lefe.js // 撤销对 lefe.js 文件的修改
  • git reset --hard HEAD^: 回到上一次提交的
  • git reset --hard HEAD~100: 回到前100次提交的
  • git reset --hard b3a2ba0d9f92d3f: 回退到指定的版本
$ git reset --hard HEAD^
HEAD is now at a7fcde1 add lefe
  • git status: 查看修改的状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   lefe.js

no changes added to commit (use "git add" and/or "git commit -a")
  • git diff: 查看文件的差异
$ git diff
diff --git a/lefe.js b/lefe.js
index b245919..8999741 100644
--- a/lefe.js
+++ b/lefe.js
@@ -1 +1,2 @@
  Hello lefe
+wsy
  • git clone:克隆一个仓库到本地,当你在远程仓库创建一个库后,使用 git clone 把项目克隆到本地;
$ git clone git@github.com:lefex/wsyLefe.git
  • git remote add orgin git@github.com:lefex/wsyLefe.git 本地仓库关联一个远程库;
// 当你本地创建一个仓库后,需要提交到远程仓库时,就需要把本地仓库和远程仓库进行关联,这样就可以把本地的代码提交到远程仓库了,orgin 为远程仓库的名字,可以自定义
$ git remote add orgin git@github.com:lefex/gitLearn.git 
// 查看所关联的远程仓库
$ git remote -v
orgin   git@github.com:lefex/wsyLefe.git (fetch)
orgin   git@github.com:lefex/wsyLefe.git (push)
// 如果本地已经关联了远程仓库,需要删除后重新关联,当然也可以同时关联多个远程仓库
$ git remote rm origin
// 由于第一次提交,远程仓库是空的,需要把远程master仓库和本地的master仓库关联起来,以后可以直接使用 git push 来提交代码
$ git push -u orgin master
  • HEAD: 指向当前分支;

  • git checkout -b dev: 创建一个 dev 分支,并切换到 dev 分支;

$ git checkout -b dev
$ git branch hot  // 创建 hot 分支
$ git checkout hot // 切换到 hot 分支
$ git branch // 查看所有分支
$ git merge hot // 合并 hot 分支到当前分支
$ git branch -d hot // 删除 hot 分支
  • 如果分支合并时出现冲突,git 使用 <<<<<<< HEAD, ======= 和 >>>>>>> dev 标记冲突的分支,HEAD 表示当前分支,dev 表示 dev 分支;
 Hello lefe
<<<<<<< HEAD
wsy add master
=======
add dev
>>>>>>> dev
  • 当你正在dev分支上开发一个新功能时,突然老板说线上有个 bug 必须修复一下,然后提交个版本。咋办,新功能还需要1天才能写完,还不能提交。使用 git stash 可以暂存你所修改的内容。然后从主分支新建一个分支来修改bug,修改完后与主分支合并,bug修改完后可以继续开发新功能。git stash list 查看暂存的内容,git stash pop 恢复暂存的内容,也可以使用 git stash apply 恢复暂存的内容,但是恢复后,stash内容并不删除,你需要用git stash drop来删除。
  • git push origin master: 把本地的修改提交到远程,origin 为远程分支,master 为本地分支;

  • git pull: 从远程拉去内容;

  • git tag: 给某次提交打一个标签,比如给每一提交的版本打一个标签,方便以后查找;

// 给当前提交的代码打一个名字为 v0.1 的 tag,默认是打在最新一次提交的位置
$ git tag v0.1

// 查看所有的 tag
$ git tag
v0.1
v0.2

// 查看提交记录
$ git log --pretty=oneline --abbrev-commit
48cd742 (HEAD -> master, tag: v0.2, tag: v0.1, orgin/master) chang lefe.js remot
8c2fd8e create lefe.js file

// 某一次提交版本后,忘记了打 tag,可以使用这个命令给某一次提交打 tag
$ git tag v0.01 8c2fd8e

// 提交tag的备注信息 -a:标签名 -m:备注信息
$ git tag -a v0.3 -m '0.3 version release'

// 删除标签
$ git tag -d v0.2
Deleted tag 'v0.2' (was 48cd742)

// 把某个 tag 提交给远程仓库
$ git push orgin v0.1
// 提交所有的 tag 到远程仓库
$ git push orgin --tags

// push 这个tag不小心打错了,并提交到了远程仓库,需要删除,先删除本地,在从远程仓库删除
$ git tag -d push
$ git push orgin :refs/tags/push

  • git show: 显示某个 tag 的详细信息
$ git show v0.01
commit 8c2fd8ecec2f65f58ac1a531203ce520a78229d3 (tag: v0.01)
Author: wangsuyan <wsyxyxs@126.com>
Date:   Fri Nov 3 11:21:31 2017 +0800

    create lefe.js file

diff --git a/lefe.js b/lefe.js
new file mode 100644
index 0000000..37b455a
--- /dev/null
+++ b/lefe.js
@@ -0,0 +1 @@
+Hello lefe
  • 如何提交代码到别人的仓库中(以 Github 为例)
    fork 别人的代码到自己的账号下,从自己的账号下克隆刚才fork的项目,修改后提交到自己的代码仓库,如果需要提交给别人的代码中,需要发起一个 pull request,别人同意后,你的代码将出现在别人的仓库中。

  • .gitignore:忽略要提交的文件
    如果某些文件不希望提交到仓库中,可以使用 .gitignore 文件忽略它。.gitignore

Git Flow

图片发自简书App

简单介绍

Gitflow 是一个非常成功的分支模型,它主要分为2个(master, develop)主要的分支和3个(feature, release, hotfix)辅助分支。SourceTree 已经集成了它。它主要有以下几个分支组成:

  • master
    生产环境分支,它是非常稳定的版本,一但处于develop分支的代码没问题以后,将会被合并到这个分支用来发布代码。也就是说它处于随时待命的状态。

  • develop
    开发分支,最新的开发状态,它是基于 master 分支的,一旦开发完毕后,将被合并(merge)到 master 分支上。

  • feature
    功能分支,它是基于 develop 分支的,一旦功能开发完成,将被合并(merge)到 develop 分支

  • release
    发布分支,它是基于 develop 分支的,主要用来修改 bug,修改完 bug 后将被合并到 develop 和 master 分支。主要是测试版本供测试人员测试。

  • hotfix
    补丁分支,基于 master 分支的,等不到新功能版本发布,必须发布一个布丁,bug 修复完成后将被合并到 master 分支,同时 hotfix 分支将被删除。

使用

安装参考这里

  • 初始化 git flow init,这个命令主要创建了2个主要的分支(master 和 develop),当使用 git branch 查看时,发现它创建了 2 个分支,并把当前分支切换到了 develop 分支。
  • 假如想开发登录模块,使用$ git flow feature start login,主要创建并切换到 feature/login 分支,这时就可以在这个分支上开始工作了。当把登陆模块完成后,使用 git flow feature finish login 结束任务,它主要把 feature/login 分支合并到了 develop 分支,并删除了 feature/login 分支,同时切换到了 develop 分支。
  • 开发完成后需要发布版本,git flow release start 0.1.0 将创建并切换到 release/0.1.0 分支,如果中途有 bug 可以修改,修改完成后 git flow release finish '0.1.0 发布版本,这时将切换到主分支。
$ git flow release finish '0.1.0'
Switched to branch 'master'
Deleted branch release/0.1.0 (was c4958ec).

Summary of actions:
- Latest objects have been fetched from 'origin'
- Release branch has been merged into 'master'
- The release was tagged '0.1.0'
- Release branch has been back-merged into 'develop'
- Release branch 'release/0.1.0' has been deleted
  • 当有紧急 bug 需要处理时,使用 git flow hotfix start bugFix,这时将创建并切换到hotfix/bugFix分支,当修复完成后,使用 git flow hotfix finish bugFix 结束 bug 的修复。
$ git flow hotfix finish 'bugFix'

Summary of actions:
- Latest objects have been fetched from 'origin'
- Hotfix branch has been merged into 'master'
- The hotfix was tagged 'bugFix'
- Hotfix branch has been back-merged into 'develop'
- Hotfix branch 'hotfix/bugFix' has been deleted

注意 使用 Gitflow 并不会把代码自动提交到远程仓库,需要自己收到提交。远程仓库只有masterdevelop 分支,featurereleasehotfix 分支并不提交到远程仓库,仅本地自己使用。

===== 我是有底线的 ======
喜欢我的文章,欢迎关注我的新浪微博 Lefe_x,我会不定期的分享一些开发技巧

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

推荐阅读更多精彩内容

  • Git 命令 mkdir testcd testtouch a.md alias 设置别名 git config ...
    任教主来也阅读 662评论 0 0
  • 一、节点类型意义 看下面html结构,要求输出ul的所有后台元素标签名,也就是输出 li, b span 这三个,...
    神秘者007阅读 303评论 0 0
  • 我想做一个美好的梦 梦中我只能看见山清水秀 我只能听见鸟语溪流 我只能闻见花香四溢 我只能感到美好的事物 我也想做...
    fast_24fe阅读 219评论 0 1
  • 在使用git版本管理的时候,你想限制某些文件不上传至服务器,你可以使用".gitignore"; 一、忽略文件的原...
    mervinzhu阅读 402评论 0 1
  • 今天下午,我美丽的妈妈说:今天晚上,要上很快乐很有趣的新概念英语学习课。我很期待,因为我喜欢读新概念英语!
    祉延阅读 196评论 6 10