Git:
什么是“版本控制”?我为什么要关心它呢? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
在本书所展示的例子中,我们对保存着软件源代码的文件作版本控制,但实际上,你可以对任何类型的文件进行版本控制。
你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后
是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,
就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。
分布式版本控制系统:
于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 在这类系统中,像 Git、Mercurial、Bazaar
以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,
事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。更进一步,许多这类系统
都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定
不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。
三种状态
好,请注意。 如果你希望后面的学习更顺利,记住下面这些关于 Git 的概念。 Git 有三种状态,你的文件可能处于其中之一:
已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改
表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,
拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作`‘索引’',不过一般说法还是叫暂存区域。
基本的 Git 工作流程如下:
1.在工作目录中修改文件。
2.暂存文件,将文件的快照放入暂存区域。
3.提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。 在Git 基础一章,你会进一步了解这些状态的细节,并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。
git基本命令
查看本地git用户名如下
git --version //查看git的版本信息
git config --global user.name //获取当前登录的用户
git config --global user.email //获取当前登录用户的邮箱
如果没有获取到用户配置,则只能拉取代码,不能修改 要是使用git,你要告诉git是谁在使用,即告诉git你是谁,命令如下
git config --global user.name 'userName' //设置git账户,userName为你本地git的一个名字,名字可以随便取
git config --global user.email 'email'
创建文件夹和切换到文件夹如下
mkdir dirName //创建文件夹”dirName”
cd dirName //切换到” dirName” 下
git clone远程指定并设置深度分支:
git clone --depth=1 -b branch_name git_repo_url //--depth=1:表示指定深度为当前branch一个commit. branch_name:指定的分支名和路径. 远程的URL
git 在当前branch添加远程分支并fetch
git remote set-branches origin branch_name //set-branches 添加branch指令, branch_name 远程branch名字和路径
git fetch --depth 100 origin branch_name //fetch远程branch到本地
git checkout -b load_new_branch_name origin/branch_name //基于origin的branch_name在本地创建load_new_branch_name
git discard 单个文件
git restore path/fime_name //fime_name:需要discard的文件名
or
git checkout -- path/fime_name //-- 前后有空格, fime_name:需要discard的文件名
git commit -m 提交换行
git commit -m "第一行comment //输入第一行文字后enter
第二行 comment //输入第二行的文字后enter
第三行 comment" //输入第三行的文件后补全双引号结束 commit comment 输入
git 回退commit并保留更改
git reset --soft commitId //输入要回退到的commitId号.更改的文件会保留下来,只对commit号的回退
git最常用的命令如下:
git init //在当前文件夹下,初始化一个仓库,同时生成.git文件夹
touch filename //创建文件
ls –al //查看文件
ls -l
cat filename //查看文件
git status //显示目录的状态,有没有添加或者修改文件
git add filename //将文件增加到缓存出
git add –A //全部文件添加到缓存处
git commit –m “备注信息” //增加到版本库中
从stage(index,暂存区) 里面删除文件,当你提交(commit)之后文件就会删除了。如下
git rm -- cached filename
回退暂存区里的文件(还原为HEAD commit里面该文件的状态),会撤销从上一次提交(commit)之后的一些操作,如下
git reset HEAD filename
Git的checkout有两个作用,其一是在不同的branch之间进行切换,例如’git checkout new_branch’就会切换到new_branch的分支上去;另一个功能是还原代码的作用,例如’git checkout app/model/user.rb’就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚(用暂存区中的内容或者版本库中的内容覆盖掉工作区),命令如下
git checkout new_branch //切换到new_branch分支上
git checkout filename //回滚到上一个版本
查看版本命令如下
git log //查看版本
git reflog //查看所有commit版本
git log --oneline
将当前的工作目录完全回滚到指定的版本号,假设如下图,我们有A-D提交的版本,其中C的版本号是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,执行了’git reset –hard bc30124e8c32ee6e4f58f63015512f1c5ba5f7a7 '那么结果就只剩下了A-C三个提交的版本,命令如下
git reset –hard 版本号
标签管理,命令如下
git tag //查看所有标签 name是标签的名字,如:V1.0.1
git tag name //创建标签,为当前版本打标签
git tag –a name –m “comment” //指定提交信息, 指定标签说明
git tag –d name //删除标签
git push origin name //标签发布
git tag name 该版本ID //为历史版本打标签:
git show name //查看某一标签
分支管理branch,命令如下
git branch name //新建分支,name分支的名字
git branch //查看所有分支
git checkout name //切换到name分支
git branch –d name //删除分支
git merge name //合并分支
git commit –a –m “comment” //在分支上提交新的版本如果在合并分支是有冲突(在两个分支上都修改了同一个文件file),
//则使用git status 或者git diff查看两个分支上有什么区别,在其中一个分支上修改该文件file,然后 git add file 和git commit -m “comment”,就ok了。
与撤销有关,命令如下
git checkout --filename //撤销工作区的修改
git reset HEAD filename //撤销暂存区的修改
git reset --hard 该版本ID //回退到历史版本
git reset --hard HEAD^ //回退到上个版本(上上版本是HEAD^^,也可用HEAD~2表示)