维基百科:git 是一个分散式版本控制软体,由Linus Torvalds创作,于2005年以GPL推出
开发动力来自对Linux核心采用来自BitKeeper的付费版本控制软件的不合,尽管BitKeeper母公司授权Linux社区免费使用该软件。其他的开源集中式版本控制系统如CVS/SVN则被Linus所不喜(集中式,速度慢且必须联网使用),于是Linus用了10天时间用C编写了分布式版本控制Git软件,其特点是不需服务器端软体,就可运行版本控制且速度很快,其中最出色的功能是合并追踪(merge tracing)。
简介
关于Git 的详细介绍可参见廖雪峰老师的Git介绍,有详细的比喻。
简要来说就是通过分布式版本控制,每个人电脑上都有一个完整的git版本库,自动记录每次文件及目录的改动,并提供协作编辑的能力(通过服务器实现修改的交换),可追踪多个版本的开发及维护工作,相比CVS/SVN等SCM(Software Configuration Managemen) 工具,有着cheap local branching, convenient staging areas, multiple workflows等优点,且不管是小项目还是大项目,都有很快的速度和极高的效率。
安装
使用
-
git init
在当前目录下创建版本库(.git目录下), git将用该目录来跟踪管理仓库(repository),该命令会创立唯一的master分支. -
git add sample.txt
将文件sample添加到暂存区(stage或index),以便后续提交到分支中.
每次修改后,必须用git add命令将修改添加到暂存区再提交.
git commit -m "wrote a sample file"
将文件提交到当前分支进行保存,-m后表示提交说明.
可多次add不同文件,最后提交一次,类似选中多个后提交. -
git status
掌握仓库当前的状态, 想了解文本文件详细的变化可用以下命令:
git diff sample.txt
列出文本文件所修改的地方,确认无误后,重新添加提交
git add sample.txt
git commit -m "modify some words"
以上即是对文本修改后的重新提交至仓库,生成新版本 -
git log
显示从最近到最远的commit历史,将输出commit_id及提交说明。其中commit_id是由SHA-1校验和作为版本id.
命令末尾可添加--pretty=oneline
,输出简要的id及修改信息. -
git relog
查看命令历史,可用于确定要回到未来的哪个版本. -
git reset --hard commit_id
git通过HEAD指针指向commit的不同版本的Master分支,HEAD^
可表示上个版本分支,类似HEAD^^
,HEAD~**
,回退到上上个版本或往上100个版本. -
git checkout -- file.txt
撤销对file的修改,回到上一次commit的状态,用版本库里的替换工作区的。
checkout -b xxx 表示切换到其他分支
小结:
场景1:改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
-
git remote add origin git@server-name:path/repo-name.git
将本地仓库关联到一个远程仓库
git remote -v
将用于查看远程分支的信息. -
git push -u origin master
将本地master分支与远程的master分支连接,并将本地所有提交推送到远程
以上两步通常是远程库为空,将本地库推送到远程的步骤 -
git clone git@github.com:repo-name.git
从远程复制仓库到本地,clone仅仅将复制master分支。若要对其他分支进行操作,需要建立与远程分支一致的分支,例如
git checkout -b dev origin/dev
,后续pull,push进行推送即
git branch --set-upstream-to=origin/<branch> dev
(链接本地与origin)
git pull
(注:若有冲突需要先解决冲突再commit后进行push)
git push origin/dev
注:从Github上获取clone的地址。
地址有两种,一种是SSH,一种HTTPS
HTTPS除了速度慢,每次推送都必须输入口令,在某些只开放HTTP端口的公司内部就无法使用ssh协议而只能用https,而通过SSH支持的原生Git协议速度最快。 -
git branch
用于查看当前的分支
git branch name
创建name分支 -
git merge branchA
将指定branchA分支合并到当前所在分支
合并有Fast-forward模式,即将当前分支指针指向指向指定的提交,将不保留分支信息,即看不出进行过合并.
若通过--no-ff禁用Fast-forward模式,Git将通过新建commit进行提交以保留分支信息,即git merge --no-ff -m "merge with no-off" A -
git branch -d branchA
删除branchA
git branch -D <name>
将强制删除,适用于删除一个没有被合并过的分支 -
git log --graph
显示分支合并图
小结:
通常实际中,master分支十分稳定,通过派生出的dev分支进行开发工作,每个人在自己的dev分支上进行开发新功能,再将新功能合并到dev分支上,大版本更新时将dev分支合并到master分支,在master分支上发布新的大版本. -
git stash
将当前工作状态保存后留待后续使用,提供干净的环境,以便处理新的紧急情况 -
git stash list
列出保存的工作状态 -
git stash pop
orgit stash apply
git stash drop
恢复有两种方式,pop将恢复并删除stash,apply恢复但不删除而通过drop进行删除 -
git rebase
将本地未push的分支提交历史整理为直线,使我们查看历史提交更容易,缺点是本地的分叉提交被修改过。 -
git tag v1.0
给当前分支取标签,便于记忆及使用,默认是在当前分支最新提交上commit上打标签,即有该commit的分支均可看到该标签
git tag v0.9 commit_id
对某个commit打标签
git show tag_name
显示标签信息
git tag
显示所有的标签
git tag -d tag_name
从本地删除某个标签,然后从远程删除git push origin :refs/tags/tag_name
git push origin tag_name
推送某个标签到远程, push origin --tags将推送所有未推送过的标签