赞
踩
集中式的版本控制(CVCS),中央服务器作为协同工作的版本控制系统,可以让在不同系统上的开发者协同工作。但是若中央服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
分布式版本控制系统(DVCS),客户端并不只是提取到最新版本的文件快照,而是把代码仓库完整的镜像下来,包括完整的历史记录。这么一来,任何一处协同工作的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
工作区:在电脑中能看到的目录。
暂存区:一般放在.git
目录下的index文件(.git/index)中。
版本库:工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
“index”标记的为暂存区,“master”标记的为master分支所代表的目录树
当对工作区修改(或新增)的文件执行git add
命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作git commit
时,暂存区的目录树写到版本库中,master分支会做相应的更新。即master指向的目录树就是提交时暂存区的目录树。
当执行git reset HEAD
命令时,暂存区的目录树会被重写,被master分支指向的目录树所替代,但是工作区不受影响。
当执行git rm --cached <file>
命令时,会直接从暂存区删除文件,工作区则不会做出改变。
当执行 git checkout .
或者 git checkout -- <file>
命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行 git checkout HEAD .
或 git checkout HEAD <file>
命令时,会用HEAD指向的master分支中的全部或者部分文件替换暂存区和工作区中的文件。这个命令也是极具危险的,因为不仅会清除工作区的未提交的改动,也会清除暂存区中未提交的改动。
使用当前目录作为Git仓库,我们只需使它初始化。
git init
该命令执行完后会在当前目录生成一个.git目录。
使用我们指定目录作为Git仓库。
git init newrepo
初始化后,会在newrepo目录下出现一个名为.git的目录,所有Git需要的数据和资源都存放在这个目录中。如果当前目录下有几个文件想要纳入版本控制,需要先用git add
命令告诉Git开始对这些文件进行跟踪,然后提交:
$ git add *.c
$ git add README
$ git commit -m "初始化项目版本"
以上命令将目录下以.c结尾及README文件提交到仓库中。
克隆仓库的命令格式:
git clone <repo>
克隆到指定的目录:
git clone <repo> <directory>
可以使用不同的协议克隆,其中最常见的是ssh,因为速度较快,还可以配置公钥免输入密码:
git clone git@github.com:fsliurujie/test.git --SSH协议
git clone git://github.com/fsliurujie/test.git --GIT协议
git clone https://github.com/fsliurujie/test.git --HTTPS协议
使用git config
命令配置git
$ git config --list
credential.helper=osxkeychain
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
编辑git配置文件
$ git config -e #针对当前仓库
或者:
$ git config -e --global #针对系统上所有仓库
设置提交代码时的用户信息:
$ git config --global user.name "wyfboy"
$ git config --global user.email test@wyfboy.com
如果去掉**–global**参数,只会对当前仓库有效。
要更新本地仓库至最新改动,执行:
git pull
要合并其他分支到你的当前分支,执行:
git merge <branch>
在这种情况下,git都会尝试去自动合并改动,但并非每次都成功。可能出现冲突,这时候,需要手动修改发生冲突的文件。改完之后,需要执行如下命令将他们标记为合并成功:
git add <filename>
在合并改动之前,可以使用如下命令预览差异:
git diff <source_branch> <target_branch>
创建分支命令:
git branch <branchName>
切换分支命令:
git checkout <branchName>
创建一个分支并切换过去:
git checkout -b <branchName>
切换分支时,Git会用该分支的最后提交的快照替换你的工作区目录的内容,所以多个分支不需要多个目录。
列出分支命令:
git branch
合并分支命令:
git merge <branchName>
一旦某分支有了独立的内容,可以使用以上命令将任何分支合并到当前主分支中,合并完后就可以删除分支了。
删除分支命令:
git branch -d <branchName>
除非你将分支推送到远端仓库,否则该分支就是部位他人所见:
git push origin <branch>
以下操作把README.md添加版本控制,这样在每个分支上都会看到
64845@DESKTOP-LIFUUP9 MINGW64 /e/wyfboy (master) $ git branch * master 64845@DESKTOP-LIFUUP9 MINGW64 /e/wyfboy (master) $ ls 64845@DESKTOP-LIFUUP9 MINGW64 /e/wyfboy (master) $ touch README.md 64845@DESKTOP-LIFUUP9 MINGW64 /e/wyfboy (master) $ git add README.md 64845@DESKTOP-LIFUUP9 MINGW64 /e/wyfboy (master) $ git commit -m "第一次版本提交" [master 31185f1] 第一次版本提交 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md 64845@DESKTOP-LIFUUP9 MINGW64 /e/wyfboy (master) $ ls README.md 64845@DESKTOP-LIFUUP9 MINGW64 /e/wyfboy (wyf) $ ls README.md
以下操作将add进暂存区的文件删除:
在wyf分支上移除了一个文件test.txt并添加了一个文件runoob.php,但我们切换回master分支,发现test.txt又回来了,并且新增的runoob.php不在主分支上。
这样使用分支将工作切分开来,从而让我们在不同的开发环境中做事,并来回切换。
将wyf分支合并到主分支上去,这样wyf分支中的runoob.php将会到master分支上,并且test.txt被删除。合并后,wyf分支就可以删除了:
注:以上学习记录包括部分图片整理自Git菜鸟教程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。