初次接触Git,写下一些使用心得,也是第一次写博客,有不足之处望批评指正,十分感激。
在软件开发中 通过版本控制,除了可以控制每个人可以提交的修改内容,还可以随时的退回到某个版本上。而且这个回退还不是基于“完全备份”的数据,而是版本控制软件记录的“修改”内容。这种修改的记录数据要比整个源代码备份容量要小很多。而且还可以通过分支功能,保持不同的源代码修改再同一个数据树上进行管理。
本地仓库由 git 维护的三棵“树”组成。第一个是你的 工作目录,它持有实际文件;第二个是 暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。
1.下载
本教程基于GitHub官方Git 1.9.2,现最新版本为2.06,下载地址如下:
Windows: GitHub for Windows 2.06
Mac: GitHub for Mac 2.06
Linux可采用对应系统的包管理工具进行下载,十分方便:
$ apt-get install git
$ yum install git
更多版本的下载安装请参考:Download for Linux and Unix
2.安装
下载后解压,点击Git setup文件
然后一步一步按提示进行,安装结束
根据需求,如果只在本地使用,就不需要创建Git帐号,如果想协作,就需在GitHub注册一个帐号。
1.初始化仓库
右键鼠标,选择Git Init Here,这样便在工程目录下初始化了一个本地仓库,或者,进入工程目录,打开Git Bash,输入$ git init
回车,文件夹内会增加一个隐藏的.git文件夹(工具>文件夹选项>查看>隐藏和显示文件夹>选择显示隐藏的文件、文件夹和驱动器,即可看到此文件夹),这就是仓库所在,仓库是什么,就当是数据库吧。
2.添加文件到Index(暂存区)
在仓库目录下右键鼠标,选择Git Bash,进入命令行模式:
在命令行输入,批量添加文件:
$ git add .
“.”代表当前目录下所有文件
也可以指定特定目录或文件
$ git add <filename>
执行了add命令后所有add的文件都会进入git暂存区,等待提交。
3.删除文件并通知索引
删除工作目录文件:$ rm <filename>
通知暂存区已删除此文件:$ git rm <filename>
4.查看跟踪状态
将文件add后可以马上执行:
$ git status
列出所有已跟踪和未跟踪的文件变化(modified,removal,new…),确认要提交的信息都在已跟踪列表后,就可以执行提交了。
5.提交
$ git commit -m <commit text>
“commit text”为提交时要说明的信息,如文件的增删说明,Bug的修复说明,版本号的设置说明等。”commit text”为必填项。执行此命令后,你的改动就提交到了 HEAD。
6.查看提交日志
$ log [-number]
[]中为可选项,number表示要列出的记录数
7.对比已暂存内容和工作目录内容
$ diff
所谓工作目录就是你初始化仓库的目录,暂存内容是你已经add到暂存区的内容。当修改了工作目录中的某文件而未add到暂存区时,执行此命令就会显示两文件的差异。
8.撤销和修改提交
有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 –amend 选项重新提交,amend意为修改:
$ git add error.txt
$ git commit -m "error.txt"
$ git add names.txt
$ git commit --amend
9.撤销已缓存文件
有时我们不需要提交的内容已经在暂存区了,这时候可以撤销暂存:
$ git add names.txt
$ git reset HEAD names.txt
我们看到,names.txt已经加入了暂存:
执行撤销语句后,names.txt离开了暂存区,成为Untracked file:
10.恢复当前分支的HEAD(最新commit)到某一历史版本
指令样式:
$ git reset [<mode>] [<commit>]
其中commit为每次提交生成的160位SHA数字签名,这个操作将当前分支的HEAD复位到commit,并且可能更新索引(将其复位到commit状态),工作目录是否更新取决于mode,如果没有加mode参数,默认mode为 “–mixed”,mode可以取下列值:
“–soft ”
不会影响索引文件或者工作目录,但会把HEAD复位到commit状态,这会让所有相对commit已改变的文件变为“Changes to be committed”(即暂存)状态,和用$ git add
加进来的效果一样 。
“–hard ”
与soft相反,它会将索引文件和工作目录都复位,忽略掉所有从commit到HEAD之间做的更改。
“–mixed ”
会复位索引,但不影响工作目录,所有更改都为“not marked for commit”(即未暂存)状态,同时报告未更新的内容,–mixed是reset的默认行为。
“–merge”
复位该索引并更新工作目录下中HEAD与commit之间不相同的文件,例如,HEAD中都有文件names.txt,但内容不同,那么reset后,names.txt就会被reset。但是会保留当前工作目录下修改但并未add到该索引下的文件,例如,当前目录下error.txt已被修改,但是没有暂存,复位后,它将得到保留。如果该索引和commit之间不同的文件有未暂存的修改,复位将会取消。如Shape.java已存在于该索引中,但还没有暂存对它的更改到该索引,同时该索引中的Shape.java和commit中的不同。如果reset的话,就会丢失我们对Shape.java所做的更改。到此合并的意味就来了。
“–keep”
复位该索引并更新工作目录下中HEAD与commit之间不相同的文件(如果该文件有未暂存的更改,则复位取消)
以“–soft”模式为例
reset之前的暂存区:
reset之后的暂存区:
reset之前的HEAD:
reset之后的HEAD:
对复位程度进行排序:
hard>merge>keep>mixed>soft
当我们需要参与协作的时候,就会用到远端仓库。首先注册一个GitHub帐号:GitHub
注册好以后登录,进入主页,点击“New repository”创建新的GitHub仓库,如图:
复制仓库的URL地址到剪贴板,打开Git Bash,执行(联网状态):
$ git clone https://github.com/Ycreact/testRepository.git
则会在当前目录下生成一个名为“testRepository”的目录,这就是你从远端克隆生成的本地仓库。如图:
如果想自定义仓库名,就执行:
$ git clone https://github.com/Ycreact/testRepository.git <repositoty_name>
“repositoty_name> “为自定义的仓库名称。
$ git remote
或者
$ git remote -v
v为--verbose
的简写
$ git remote add upstream https://github.com/Ycreact/testRepository.git
$ git fetch upstream
$ git merge upstream/master
抓取:抓取远程分支到本地
合并:将远程分支与当前分支合并
抓取并合并
$ git add .
$ git commit -m "my update"
$ git push upstream
推送
帐号密码验证
参考
1.GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
2.Git详解之二 Git基础
3.Git - 简易指南
4.GitHub