之前只用过SVN,用的也比较傻瓜,买了本Git的书但是表示看不懂啊。现在项目里要用到了,本着一切学不会的东西都可以在项目里学会的态度,又一次开始研究Git,以下主要内容来自《廖雪峰的Git教程》(写得真的很通俗易懂),再结合一下我的实践。
所有的版本控制都是针对文本内容,word这一类二进制内容(?)所谓版本,是文件快照,不能比较其差异,只能当做备份的网盘使用。所有的版本控制,只能跟踪文本文件的改动。而图片、视频、word这些二进制文件没法追踪其变化。
集中式VS分布式:
集中式版本控制:比如SVN,版本库集中存放在中央服务器,干活的时候用自己的电脑从服务器获取最新版本,然后在本地修改再提交。集中式版本控制必须联网才能工作。
分布式版本控制:没有中央服务器,每个电脑上都有完整的版本库,这样工作不需要联网,多人合作时只需要将各自的修改推送给对方。安全性比较好,通常分布式版本控制里也 有一台中央服务器,方便大家交换修改信息,但没有它大家也是一样的干活。
1、创建版本库:
$git init
将当前目录变成Git版本库,此时目录里会出现.git目录,如果没有出现则是被隐藏了,ls -ah可以查看所有文件
千万不要采用Windows自带的记事本编辑文本文件。。。。。
2、创建文件、加入版本库
在含有.git的目录下创建一个新文本文件,git add将文件添加到仓库
$git add readme.txt
没有任何显示说明添加成功
git commit将文件提交到仓库,-m后面表示要输入的注释内容,一次commit可以提交多个文件
$git commit -m "comment"
修改readme文件内容,查看仓库状态
说明readme.txt被修改了,但是还没有将修改提交
$git diff
查看difference,这里面如果有中文会显示乱码,sad
提交修改和提交新文件是一样的两步,git add和git commit
git add readme.txt以后
和没有add之前状态稍有不同,再commit
版本回退:
HEAD:指向当前版本HEAD^:上一版本 HEAD^^:上上一个版本 HEAD~100:往上100个版本
回到当前版本:已经做了改动,但是想抛弃这些改动,回到上次提交时的状态
$ git reset --hard HEAD^//回到上一版本
查看状态、log时就跟最后一个版本没出现过一样
如果要找回就得往上查找删除掉的版本的commit id,然后:git reset --hard id
可以通过git reflog查看每次提交的命令和id
工作区和暂存区
工作区:电脑里能看到的目录,比如learngit。工作区里的.git文件,是Git的版本库,里面存放的最重要的东西就是称为stage或者index的暂存区,还有git自动创建的第一个分支master,以及指向master的第一个指针HEAD。
git add 添加文件,进暂存区
git commit 提交修改,将暂存区的所有内容添加到当前分支
需要提交的文件修改统统放到暂存区,然后一次性提交暂存区的所有修改
管理修改:
为什么Git比其他工具优秀?因为git跟踪并管理的是修改,而非文件。
测试:
第一次修改——add(放入暂存区)——第二次修改(没有放入暂存区)——commit(只将暂存区的第一次修改提交了)
撤销修改:
$git checkout -- file
修改后没有add到暂存区,撤销后回到上一个版本库
已经add以后又做了修改,撤销后回到添加到暂存区以后的状态
总之是回到最近的一次git commit或者git add时的状态(撤销一次修改)
删除文件:
$rm test.txt //非git命令
add或者commit一个新的文件以后,删除了文件,状态改变
$git rm test.txt
$git commit......
删错了,撤销删除
$gti checkout -- test.txt
远程仓库
目前为止的功能都是集中式版本控制工具里有的。
实际情况,用一台电脑充当服务器,全天开启,其他人每个人从服务器上克隆一份到自己的电脑,把各自的提交推送到服务器里,并从服务器中获取别人的提交,
Github就是提供Git仓库托管服务的,可以获取免费的Git远程仓库
本地Git仓库和Github仓库之间通过SSH加密,需要将本地的 用户/.ssh/id_rsa.pub的内容加入到Github里,这样Github才能识别是你的推送而不是别人
在Github上的Git仓库虽然只有自己能改动,但是任何人都能看到,要想让别人看不到,1是交钱把仓库变成私有的 2是自己搭建Git服务器
GitHub使用
$git remote add origin git@github.com:zChord/learngit.git
将本地仓库关联到Github仓库。添加后远程库的名字就是origin
$git push -u origin master
第一次push时带着-u参数,Git不但会把本地分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,以后的推送和拉取就不需要该参数了
$git push origin master
将本地master分支修改推送至Github,分布式版本库诞生!
$git clone git@git.com:zChord/gitskills.git
可以看到代码被下载到本地
$git push origin master
git命令:
查看用户名和邮箱地址:
$git config user.name
$git config user.email
修改用户名和邮箱:
$git config --global user.name "name"
$git config --global user.email "mail"
--global表示这台机器上的所有Git仓库都使用这个配置
查看修改日志:只有日期、作者、注释
$git log
$git log --pretty=oneline(简洁版)