@yacent
2016-02-08T17:28:18.000000Z
字数 4453
阅读 1302
开发工具
本Git使用总结只适合于对Git还没有概念的搬运工进行阅读,并且只是对Git进行一些简单的介绍以及常用命令的使用总结,有错的地方望指出
Git是什么? 它是世界上最先进的分布式版本控制系统
以平时使用word的过程当中来说明,Git到底是一个什么版本控制工具以及如何实现协作。在使用word进行文档的编辑的时候,当有某部分内容需要进行修改,但是又不确定是不是应该这么修改的时候,通常我们会怎么做,因为如果直接在这个文档上进行修改的话,关闭之后,再也无法恢复到之前的版本了。我们通常都是将word另存为一个新的副本,在副本上进行修改。可当文档编辑量过大时,不久就会发现文档已经非常乱了,以及哪个副本是修改了哪一部分,版本之间已经对应不起了。
另外一个,如果要对word进行分工协作的话,即每个人负责某一部分,或者说你的文档需要同事进行协作帮助,通常你需要做的是将文档通过其他方式拷贝到同事电脑上,在同事完成之后,又需要从同事电脑上通过其他方式将补充好的文档拷贝到本地,然后进行手工合并。
在这些多个副本之间挣扎于每个版本都对应了什么内容以及修改了什么部分,当工作量巨大时或者需要进行快速开发时,通常会头昏脑涨而导致工作停滞不前,会想要一个工具来帮助你解决以上所提及的问题。
这就是Git,以下用表格模拟了通过Git来进行版本控制以及协作的表现形式
版本 | 用户 | 说明 | 日期 |
---|---|---|---|
0 | Yacent | 我提交了一个很高逼的修改 | 2.7 18:00 |
1 | Lucifan | 我修改了登陆页面 | 2.7 19:30 |
2 | Allen | 我对文档进行了最后修改,last modified | 2.7 21:30 |
以上是我对Git的一个简单的简介,下面会对Git的一些常用命令进行自己的一些总结,老司机自行绕开啦,新手我们就一起探讨吧。
开发还是通过*nix下进行,安装命令也比较简单,通过 sudo apt-get install git
repo可以认为就是一个目录文件,该目录下的所有文件都可以被Git进行管理,包括其修改、删除等,都可以被追踪。
什么目录可以被设置为版本库,可以创建空目录或者在已有文件的目录下设置为版本库。
创建空文件夹
$ mkdir yacent
$ cd yacent
$ pwd #用于显示创建空文件夹所在目录
初始化以及文件添加(通过命令行 进入到 所用文件夹根目录下)
git init
git add <file>
file的添加方式可以一次添加一个、多个、全部 git add readme.txt
git add readme.txt readhe.txt
git add *
git commit -m "×××"
git add → 将文件提交到 stage(缓存区)当中
git commit → 将stage当中的文件提交到 版本库 当中
git status
来掌握工作区的状态,What it can tell u? git diff <file>
可以进行简单地查询文件修改部分这么说好像有点点抽象,以一个例子来进行说明
repo目录下有一个readme.txt文件内容如下
Yacent join in the web apprentice
我们对readme.txt进行修改(windows下开发者不要用记事本进行打开,记事本对utf-8格式作了特殊处理,会导致网页第一行出行一个 ? 推荐使用sublime),修改后,内容如下
Yacent join in the web apprentice eventually
修改之后,使用 git status
查看结果
$ git status
# On branch master
# Change not staged for commmit
# (use "git add <file>... " to update what will be committed)
# (use "git checkout --<file>..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
因为刚才修改了readme.txt之后,还没有添加到远程仓库上,所以会告诉还没有到提交的阶段,只是告诉我们修改了.txt文件,需要先进行 git add readme.txt
执行 git commit
之前,再运行 git status
查看当前仓库的状态
$ git status
# On branch master
# Changes to be committed
# (use "git reset HEAD <file>... " to unstage)
#
# modified: readme.txt
#
这个状态告诉我们,被提交上去的修改包括 readme.txt,接下来可以进行提交,即 git commit
$ git commit -m "add eventually"
[master 914375c] add eventually
1 file change, 1 insertion(+)
提交后,再用 git status
命令查看仓库状态
$ git status
# On branch master
nothing to commit, working directory clean
版本回退、前进
在大家进行协作的时候,大家都不断地使用 git add
git commit
进行代码的提交,可是当项目进行到某一阶段,发现目前阶段的代码需要推倒重来,到之前某个节点的地方的时候,或者是不小心删除了某个文件而导致项目崩溃,Git提供了版本回退的功能,可以从最近的 commit
进行恢复,所以我们在commit的时候,写提交快照,一定要写有意义的句子,以便日后进行版本的查询
主要是用以下几个命令
$ git log
#查看提交历史记录
$ git reset --hard HEAD^
#HEAD^指 上一个commit,HEAD^^指上上个commit,也可以使用 commit id来进行指定commit的回退。 HEAD指向当前版本
$ git reflog
#当恢复到之前版本后,log当中回退之前的版本已经没了,此时若想回到"未来"的版本,只能使用reflog来查看每次的记录,可以查询到所有commit
-
撤销修改
当对文件进行了某些修改之后,但是发现修改错了,在用 git status
,会有提示 git checkout -- <file>
可以进行工作区文件的修改撤销
$ git checkout -- file #即回到最近一次 git commit 或 git add 时的状态
撤销的情况有以下两种
P.S. 但是,上面情况的第二种,已经是将修改提交到了暂缓区当中,倘若想要撤销提交到暂缓区的文件修改,可以用之前的版本回退的方法 git reset HEAD <file>
可以把暂存区的修改撤销,重新放回到工作区当中,然后再使用 git checkout -- <file>
的方法丢弃之前的修改
我们前面所说的Git主要是进行本地的版本管理,所有操作都是在本地实现,但是Git既然说是世界上最好的版本控制以及协作工具的话,到底是如何协作的,如果是代码都放在本地的话,别人是无法进行写作的。思想就是将代码放到某台服务器上,大家都从服务器上fork下来进行编辑,后再上传上去,有种类似C/S模式,但是我们自己搭建一个Git服务器,以后说吧,现在使用Github(最大的基友交流圈)作为远程仓库,将Git和Github关联起来就好,具体关联方法可以自行查询。
将Github和Git关联之后,就可以将Github上的远程仓库的版本库添加到本地。
$ git remote add origin git@github.com:yacent/yacent
添加后,远程仓库的名字即为origin,也可以改为别的名字,你开心就好!
将本地与远程仓库关联起来后,可以将本地内容推送到远程仓库上,即 git push
命令
$ git push -u origin master #也可以简化为 git push
-
远程库克隆
有时候,在Github上进行协作的时候,同事已经create a new repo之后,并且已经进行了简单的代码编写以及文件架构,这时候我们很容易想到的是,在平常的工作模式当中,会通过copy到本地之后,在别人的基础上继续工作。基于这种思想,我们可以通过"copy"的方法,即Git当中clone模式,将远程仓库上的代码clone到本地
$ git clone git@githunb.com:yacent/yacent
clone后面的地址可以有两种方式,上面使用的方式是ssh
协议,还有另外一种是使用https
协议,连接生成可以直接在Github上的仓库,选取ssh链接或者是https链接即可
在进行协作的时候,我们不想在master
目录下直接进行工作,想要自己另开一个工作区进行工作,称之为分支,在自己的分支上,将工作处理完之后,可以将自己的分支合并到master
上,主要命令如下
$ git branch #查看分支
$ git branch <name> #创建分支
$ git checkout <name> #切换分支
$ git checkout -b <name> #创建+切换分支
$ git merge <name> #合并某分支到当前分支
$ git branch -d <name> #删除分支
$ git branch -D <name> #强制删除分支
一般情况下,因为多人共享一个远程仓库,每个协作者都有权利向远程仓库提交自己的commit,但是有时候,由于不规范的操作,可能有些时候会发生冲突而不能正常merge上去,而导致master分支无法正常工作,这时候可能需要管理员进行人工排除冲突,我理解的协作模式应该要遵循如下的模式(4步)。
git add <file>
将本地文件提交到暂缓区git commit -m "×××"
将暂缓区的文件修改提交到版本库中git pull
先将远程仓库上面的代码拉取到本地,进行合并,有冲突就现在本地进行解决git push origin branch-name
pull没有冲突之后,再将本地做好的东西全部push到远程仓库上
如果在git pull
的时候提示 no tracking information
,即本地分支和远程分支的链接关系没有创建,则需要将本地的分支和远程仓库的分支进行关联。
git branch --set-upstream branch-name origin/branch-name
用以上命令即可以将本地分支和远程仓库的分支进行关联