文档章节

Git 版本控制管理 总结

asjoker
 asjoker
发布于 2016/11/17 12:01
字数 2765
阅读 25
收藏 0
点赞 0
评论 0
Git

Git

CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统

先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

CVS作为最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用。由于CVS自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。同样是开源而且免费的SVN修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统。

Git是一款免费、开源的分布式版本控制系统,

命令

  • pwd 命令用于显示当前目录

  • git init 命令把这个目录变成Git可以管理的仓库

  • git reflog 用来记录你的每一次命令

  • git log 命令显示从最近到最远的提交日志 git log --pretty=oneline 简化日志信息 git log --graph 命令可以看到分支合并图 一大串类似 3628164...882e1e0 的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示

回退指定版本

  • git reset --hard HEAD^ 回退到上一个版本,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
  • git reset --hard 3628164 回退到指定版本,版本号没必要写全,前几位就可以了,Git会自动去找

文件

  • git status 命令可以让我们时刻掌握仓库当前的状态,告诉你有文件被修改过
  • git diff 可以查看修改内容
  • git add 文件名.扩展名 把文件修改添加到暂存区
  • git commit -m '本次提交的说明' 把暂存区的所有内容提交到当前分支
  • git checkout -- readme.txt 把readme.txt文件在工作区的修改全部撤销 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

远程仓库

  • git push -u origin master 由于远程库是空的,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
  • git push origin master 把本地分支的最新修改推送远程
  • git remote add origin git@server-name:path/repo-name.git 关联一个远程库
  • git clone git@github.com:michaelliao/gitskills.git 克隆仓库到本地

分支

Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

  • git branch dev 在当前分支基础上创建 dev 分支

  • git checkout dev 切换到 dev 分支

  • git checkout -b dev 在当前分支基础上创建并切换到dev分支 相当于 git branch devgit checkout dev 2个命令

  • git branch 会列出所有分支,当前分支前面会标一个*号。

  • git merge dev 用于合并 指定分支dev 到当前分支

  • git merge --no-ff -m "merge with no-ff" dev 注意--no-ff参数,表示禁用Fast forward 合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

  • git branch -d dev 删除dev分支

  • git branch -D dev

  • git stash 可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作

  • git stash list 查看工作现场

    Git把stash内容存在某个地方了,但是需要恢复一下

    • 一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
    • 另一种方式是用git stash pop,恢复的同时把stash内容也删了
  • git push origin branch-name 从本地推送到远程分支,如果推送失败,先用 git pull 抓取远程的新提交

  • git remote -v 查看远程库信息,显示了可以抓取和推送的origin的地址

  • git checkout -b branch-name origin/branch-name 在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致

  • git branch --set-upstream branch-name origin/branch-name 建立本地分支和远程分支的关联

  • git fetch [branch-name] 取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名,将某个远程主机的更新,全部取回本地

标签管理

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

  • git tag <name> 就可以打一个新标签,默认标签是打在最新提交的commit上的
  • git tag v0.9 6224937 给 历史提交的commit id 打标签
  • git tag -a v0.1 -m "version 0.1 released" 3628164 给 历史提交的commit id 创建带有说明的标签,用-a指定标签名,-m指定说明文字
  • git tag 查看所有标签,标签不是按时间顺序列出,而是按字母排序的
  • git show <tagname> 查看标签信息
  • git push origin <tagname> 推送某个标签到远程
  • git push origin --tags 一次性推送全部尚未推送到远程的本地标签
  • git tag -d <tagname> 可以删除一个本地标签
  • git push origin :refs/tags/<tagname> 可以删除一个远程标签。 如果标签已经推送到远程,要删除远程标签,先从本地删除: git tag -d v0.9 然后,从远程删除: git push origin :refs/tags/v0.9

常用问题总结

让Git显示颜色,会让命令输出看起来更醒目

git config --global color.ui true

合并分支文件冲突

git merge dev 用于合并 指定分支dev 到当前分支 文件冲突,必须手动解决冲突后再提交。 git status 也可以告诉我们冲突的文件 Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

BUG分支

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

  1. 可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
  2. 在master分支上修复,就从master创建临时分支 git checkout master git checkout -b bug002
  3. 修复bug并提交到 bug002
  4. 切换到master分支,完成合并,删除 bug002 分支 git checkout master git merge --no-ff -m "merged bug " bug002 git branch -d bug002
  5. 回到dev分支 恢复 stash

git reset

reset命令有3种方式: 1:git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息 2:git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可 3:git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容

# 回退所有内容到上一个版本 
git reset HEAD^ 
# 回退a.py这个文件的版本到上一个版本 
git reset HEAD^ a.py 
# 向前回退到第3个版本 
git reset –soft HEAD~3 
# 将本地的状态回退到和远程的一样 
git reset –hard origin/master 
# 回退到某个版本 
git reset 057d 
# 回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit 
git revert HEAD 

git checkout -- file 与 git reset

  • git checkout主要有三个作用:

    • 切换分支。例如你从远程仓库clone下来所有的源代码,你git branch一下会看到你通常是在master,如果你想切换到某一个分支上呢?git checkout <branchname>
    • 放弃对某个文件的修改。例如你想放弃对某个文件Hello.cpp的修改,git checkout -- <Hello.cpp>
    • 新建一个分支,git checkout <-b> <branchname>,不加-b的话只新建不切换到新的分支上,加-b新建并切换到该分支上
  • git reset主要是取消上一次的操作,具体用法有很多,说两个:

    • git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
    • git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
    • git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
  • git checkout -- file;

    撤销对工作区修改;这个命令是以最新的存储时间节点(add和commit)为参照,覆盖工作区对应文件file;这个命令改变的是工作区

  • git reset HEAD -- file

    清空add命令向暂存区提交的关于file文件的修改(Ustage);这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化

gitignore 忽略特殊文件

github/gitignore

  1. cd 项目根目录
  2. touch .gitignore 在文件夹就生成了一个.gitignore文件
  3. 编辑
  4. 提交到Git

git rm --cached XXX.xcodeproj/project.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate

© 著作权归作者所有

共有 人打赏支持
asjoker
粉丝 10
博文 108
码字总数 79411
作品 0
东城
程序员
Git 学习看这篇就够了!

Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 可能新手会问“git和github有什么关系啊?” git是一个版本控制工具; github是一个用git做版本控...

Michaelyn
2016/12/26
19
0
Git安装及配置5分钟快速教程

Git是什么 Git是一款免费、开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 与常用的版本控制工具CVS、Subversion等不同的是它采用了分布式版本库的方式,不...

架构之路
2017/11/27
0
0
git文章列表

关于gitlab默认clone协议 Git实现从本地添加项目到远程仓库 翻翻git之---一个简单的标签控件 LabelView (随手发了两张小宝宝的玩耍照) Git 项目推荐 | Java 版微信普通号机器人 翻翻git之---...

d_watson
2016/04/20
26
0
clearcase、Git之我见

软件配置管理一直以来是软件工程的基础。而配置管理本身对于开发者及软件工程生命周期管理来说,不但具备其基本的 版本控制功能,还需要具备工作空间管理、构建管理、流程管理等。其中各家的...

晨曦之光
2012/03/09
0
0
Git使用详解

1.1 关于版本控制 1.2 Git 简史 1.3 Git 基础 1.4 命令行 1.5 安装 Git 1.6 初次运行 Git 前的配置 1.7 获取帮助 1.8 总结 2.1 Git 基础 - 获取 Git 仓库 2.2 Git 基础 - 记录每次更新到仓库...

Bony
2016/05/17
20
0
使用GitHub(三):使用VSCode+GitHub进行版本控制

使用GitHub(三):使用VSCode+GitHub进行版本控制 本文简单介绍使用VSCode+GitHub进行项目或者代码的版本控制。本文主要目的是对学习内容进行总结以及方便日后查阅。 详细教程和原理可以参考...

马涛涛_风
03/16
0
0
谈谈分布式版本管理工具Git

一.主流的版本管理工具   目前在企业中比较主流的版本管理工具有:GIT、SVN、CVS等等。 二.什么是Git?   Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目...

hafiz.zhang
2017/09/04
0
0
【Git教程】入门安装客户端与服务器

Git介绍 Git是个快速的、开源的、分布式的版本控制工具。 集中式管理(SVN) 分布式管理(GIT) 通过以上的图形对比: 分布式管理有如下的好处: 1、去中心化:每个人开发人员都拥有一个完整...

Auhgnahz
2016/08/01
103
0
全栈必备——Git

为什么使用Git Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。大神就是大神,在开发了Linux之后,Git 是又一抗鼎之作。这是唯一的理由么? Git在软...

wireless_com
2016/07/02
0
0
总结大中小型项目的git流程

git作为源码管理工具出于流行趋势。这里和大家一起分享下我们是如何用git的分支(branch)功能管理不同规模的项目 小型项目 推荐工具:TortoiseGit 开发阶段(第一版上线前):2个分支 develo...

万里虎
2014/12/08
101
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用 Python 实现打飞机,让子弹飞吧!

所用技术和软件 python 2.7 pygame 1.9.3 pyCharm 准备工作 安装好 pygame 在第一次使用 pygame 的时候,pyCharm 会自动 install pygame。 下载好使用的素材。 技术实现 初始化 pygame 首先要...

猫咪编程
6分钟前
0
0
MySQL的行锁和表锁

简单总结一下行锁和表锁。 行锁 每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 表锁 每次操作锁住整张表。开销小,加锁快;不会出...

to_ln
8分钟前
0
0
Java IO类库之字节数组输入流ByteArrayInputStream

一、ByteArrayInputStream字节数组输入流介绍 ByteArrayInputStream是字节数组输入流,继承自InputStream。它的内部包含一个缓冲区,是一个字节数组,缓冲数组用于保存从流中读取的字节数据,...

老韭菜
10分钟前
0
0
iOS安全应该做哪些事情

1. 尽量使用HTTPS协议。 2. 密码提交的时候,密码使用SHA256加密后传输,MD5等经过哈希碰撞已经可以推算出原文。 3. 密码提交的时候,可以加盐。 4. 密码保存在本地的时候,尽量使用钥匙串保...

HOrange
16分钟前
0
0
react native 注意事项

1. 环境参考官网 android studio 必装 java jdk安装 1.8版本(环境建议自己一步一步配置,切记不要 apt ) 2.有改变编译内容发现 会白屏,然后APP消失,请卸载原来的测试 appinfo (连续两次...

304158
22分钟前
0
0
FOMO游戏代码解析

源代码在此处

怎当她临去时秋波那一转
27分钟前
1
0
EOS智能合约与DApp开发入门

EOS的是Block.One主导研发的一个区块链底层公链系统,它专门为支撑商业去中心化 应用(Decentralized Application)而设计,其代码开源。 比特币被称为区块链1.0,因为它开辟了数字加密货币的...

笔阁
40分钟前
1
0
编译cjson到dll

https://blog.csdn.net/mengzhisuoliu/article/details/52203724 编译完成后 是纯lua实现的json decode 的10倍以上...

梦想游戏人
50分钟前
0
0
JS基础- Date 对象

Date 对象 Date 对象用于处理日期和时间。 创建 Date 对象的语法: var myDate=new Date() 注释:Date 对象会自动把当前日期和时间保存为其初始值。 Date 对象属性 属性 描述 constructor 返...

ZHAO_JH
52分钟前
0
0
Python数据分析numpy(1)

Python开源的科学计算基础库 1.表示N维数组对象ndarray 2.线性代数、傅里叶变换、随机数生成 3.广播函数,整合c++、c 一.数据的维度 1.数据 2.数据维度 3.一维数据 (1)特点 (2)Python中的...

十年磨一剑3344
54分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部