技术

IT这个行当之需求与时间管理 golang结构体和包中的类型或基础类型定义方法 golang中结构体的初始化方法(new方法) 项目管理总结 python函数式编程之-装饰器(Decorators) python文件批量处理 Go,互联网时代的C Python推导式演变(Comprehensions) 项目管理感悟 golang学习简单例子 了解GitHub工作流【译】 PHP Socket的使用 Apache 日志文件格式及简单处理 Python脚本--下载合并SAE日志 PHP命名空间及自动加载 基于CSS3实现尖角面包屑 部署Ceilometer到已有环境中 OpenStack Ceilometer Collector代码解读 OpenStack Ceilometer数据存储与API源码解析 OpenStack Ceilometer中的Pipeline机制 OpenStack Ceilometer Compute Agent源码解读 学习Python动态扩展包stevedore 学习Python的ABC模块 Python包管理工具setuptools详解 OpenStack Horizon 中文本地化 WSGI学习 在虚拟机单机部署OpenStack Grizzly 学习使用python打包工具distutils python包工具之间的关系 给OpenStack创建Ubuntu镜像 OpenStack Grizzly Multihost部署文档 为什么使用pip而不是easy_install HTML中meta标签viewpoint的作用 交互式编程-IPython 页面提速之——数据缓存 给OpenStack创建Win7镜像 Ceilometer的命令行使用 部署一个ceilometer-horizon项目 给OpenStack创建Windows XP镜像 几种企业的存储系统 概念模型、逻辑模型、物理模型的区别 五中常见的开源协议整理(BSD,Apache,GPL,LGPL,MIT) OpenStack监控项目Ceilometer的一些术语 VNC和远程桌面的区别 OpenStack Ceilometer项目简介 虚拟化与云计算中KVM,Xen,Qemu的区别和联系 调试和修改OpenStack中的Horizon部分 JavaScript变量作用域 kanyun worker原理 kanyun server服务 在OpenStack中部署kanyun kanyun的api-client命令 sae下的python开发部署和一个简单例子 OpenStack Nova内部机制 PHP可变变量 JS中防止浏览器屏蔽window.open PHP操作Session的原理及提升安全性时的一个问题

标签


Pro Git

在读...
cover
作者Scott Chacon
出版商Apress
语言English
链接http://git-scm.com/book

这里只记录我在读书后容易遗忘的一些指令或者注意点,供以后查询。整本书写的非常通俗易懂,而且有大量例子和图示来简化理解过程,非常值得一读。

安装配置

mac下安装很方便,使用brew直接安装

brew install git

安装完成以后记得配置一下,最好不要乱变。我之前交到github上的代码各种名字都有,非常混乱...

git config --global user.name "SuYan"
git config --global user.email suyan0830@gmail.com

配置修改的文件其实是~/.gitconfig里的参数,也可以直接拿vim打开变更

Git基础

初始化项目

创建一个新项目

git init
git add README
git commit -m "initial project version"

如果不是从本地初始化项目,那么可以从远程克隆一个项目过来,例如从github上

git clone git://github.com/schacon/grit.git
git clone git://github.com/schacon/grit.git mygrit

文件更改、提交和回退

git的3种状态

untracked状态

untracked状态即未由git管理

mkdir test && cd test && git init && touch README && git status

将untracked转为tracked状态

git add README && git status

从tracked状态转成untracked

git rm README --cached

unmodified状态和modified状态

unmodified状态是一个文件已经成为git管理的对象,而且已经提交过

git commit -m "add README file" && git status

之后就是unmodified状态了,这个时候可以进行文件修改和删除功能。删除一个文件可以:

git rm -f README
rm README

移动文件

git mv file_from file_to

修改文件直接显示成为modified状态

echo "sss" > README

查看修改

git diff

从modified状态回到unmodified状态

git checkout -- README

staged状态

staged状态指提交到版本控制库里

git commit -m "add README file" && git status

直接从modified状态进入staged状态

git commit -a -m "add README file" && git status

查看最新一次提交的修改

git diff -cached

查看最近两次更改/更新

git log -p -2
git log -2

提交完成后,文件进入staged暂存区,同时进入unmodified状态。如果想将REAMDE文件从staged状态回到提交前的modified状态

git reset HEAD README

再次修改如果不想重新生成commit,可以利用

git commit --amend

使用下面命令可以查看文件提交历史纪录

git log

回退到某次commit状态

git reset --hard HEAD^^
git reset --hard HEAD~2
git reset --hard as123s

忽略文件

在每个git控制的库中,都可以增加一个.gitignore文件来控制例外的文件,即不想被git控制的一些临时文件或私有文件。它的文件格式如下:

# 注释将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件
# 不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 忽略 doc 目录下的所有 .txt 文件
# 会忽略 doc/notes.txt 
# 但不包括 doc/server/arch.txt
doc/*.txt

远程仓库

查看远程仓库(如果仓库来自clone的话)

git remote -v

增加远程仓库(如果想提交到某远程仓库)

git remote add myremote git://github.com/schacon/grit.git

删除某远程仓库

git remote rm myremote

抓取远程仓库代码

git fetch myremote # 只获取更新
git pull # 获取更新并合并

提交代码到远程仓库

git push myremote master

查看远程仓库信息

git remote show origin

重命名远程仓库

git remote rename pb paul

删除远程仓库

git remote rm paul

打标签

标签可以用来标记仓库的版本号,如v0.1

列出现有标签

git tag
git tag -l 'v1.4.2.*'

含附注的标签

git tag -a v1.4 -m 'my version 1.4'
git show v1.4

签署标签

git tag -s v1.5 -m 'my signed 1.5 tag'

轻量级标签

git tag v1.4-lw

验证标签

git tag -v v1.4.2.1

后期加注标签

git log --pretty=oneline
git tag -a v1.2 9fceb02

分享标签

git push origin v1.5 # 只分享v1.5
git push origin --tags # 分享所有标签

技巧和窍门

自动完成:tab键

命令别名

git config --global alias.co checkout

Git分支

分支意味着从主线中分离出来,在不影响主线的同时继续工作。

基本分支

假设我们要做以下内容:

  1. 开发某个网站
  2. 创建一个分支,完成新的需求
  3. 收到bug修复任务,回到master分支
  4. 新建一个修复bug分支,直到修复完成
  5. 切换到之前开发新需求分支,继续工作

步骤如下:

新建分支并切换到其下工作

git checkout -b iss53

回到主分支

git checkout master

创建一个修复bug分支,并完成工作

git checkout -b 'hotfix'

修复完以后合并到master中

git checkout master
git merge hotfix

删除之前的hotfix

git branch -d hotfix

回到新需求分支

git checkout iss53

基本合并

把iss53中完成的新需求合并到master中

git checkout master
git merge iss53

冲突的合并

有的时候同一个文件被两个分支中都修改,合并时就会发生冲突。这个时候可以使用git status来查询冲突文件。

解决冲突的方式是手动修改冲突位置,并将其使用git add标记为已解决(resolved)。一但暂存,就表示冲突已经被解决。

然后通过git commit来将此次提交,合并即完成

分支管理

显示分支命令

git branch
git branch -v #附加详细信息
git branch --merged #已合并分支
git branch --no-merged #未合并分支

删除分支

git branch -d testing
git branch -D testing #强制删除

分支式工作流程

由于Git的分支特性,许多开发者喜欢以这种方式来工作。比如仅在master分支中保留完全稳定的代码,即已经发布或即将发布的代码。

另外有一个develop或next的平行分支,专门用于后续的开发,或仅用于稳定性测试。

远程分支

远程分支会有一个指针指向克隆时的位置

git clone xxx@git:project.git

自己修改并不会影响到origin/master的变化,如果远程分支发生了变化,可以用下面命令获得更新

git fetch origin

如果有多个远程分支,可以用下面命令来增加

git remote add teamone xxx2@git:project.git
git fetch teamone

推送

推送serverfix到远程serverfix分支

git push origin serverfix

推送到不同分支

git push origin serverfix:awesomebranch

未完待续....