一文看懂git
源自 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
Git是什么?
Git是目前世界上最先进的分布式版本控制系统
集中式vs分布式
CVS及SVN都是集中式的版本控制系统

集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
安装和基本操作
安装git
Linux
sudo apt-get install git
Mac OS X
Windows
从https://git-for-windows.github.io下载后安装即可
初始设置
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
创建版本库
$ mkdir learngit $ cd learngit $ git init
通过git init命令把这个目录变成Git可以管理的仓库
把文件添 readme.txt加到版本库
$ git add readme.txt $ git commit -m "wrote a readme file" [master (root-commit) cb926e7] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt
文件内容
Git is a version control system. Git is free software.
为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt $ git add file2.txt file3.txt $ git commit -m "add 3 files."
继续修改readme.txt文件
Git is a distributed version control system. Git is free software.
现在,运行git status命令看看结果:
$ git status # On branch master # Changes not staged for commit: # (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")
查看diff
$ git diff readme.txt diff --git a/readme.txt b/readme.txt index 46d49bf..9247db6 100644 --- a/readme.txt +++ b/readme.txt @@ -1,2 +1,2 @@ -Git is a version control system. +Git is a distributed version control system. Git is free software.
提交修改,提交修改和提交新文件是一样的两步
$ git add readme.txt $ git commit -m "add distributed"
git reset --hard commit_id 退回 git log git reflog 用来记录你的每一次命令
工作区和暂存区

用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别
$ git diff HEAD -- readme.txt diff --git a/readme.txt b/readme.txt index 76d770f..a9c5755 100644 --- a/readme.txt +++ b/readme.txt @@ -1,4 +1,4 @@ Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. -Git tracks changes. +Git tracks changes of files.
撤销修改
git checkout -- readme.txtgit checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
git reset HEAD readme.txt 可以把暂存区的修改撤销掉(unstage),重新放回工作区
删除文件
$ git add test.txt $ rm test.txt $ git rm test.txt $ git commit -m "remove test.txt"
git checkout -- test.txt其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原
远程仓库
只要注册一个GitHub账号,就可以免费获得Git远程仓库。请自行注册GitHub账号。
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。 Windows下打开Git Bash
$ ssh-keygen -t rsa -C "test@gmail.com"
添加远程库
git remote add origin https://github.com/kyoyo/learngit.git
$ git push -u origin master
$ git push origin master
从远程库克隆
git clone https://github.com/kyoyo/pip-pop.git
创建与合并分支
创建dev分支,然后切换到dev分支
$ git checkout -b dev git checkout命令加上-b参数表示创建并切换,相当于以下两条命令: $ git branch dev $ git checkout dev git branch命令查看当前分支: $ git branch readme.txt做个修改,加上一行 Creating a new branch is quick. 然后提交: $ git add readme.txt $ git commit -m "branch test" 现在,dev分支的工作完成,我们就可以切换回master分支: $ git checkout master 现在,我们把dev分支的工作成果合并到master分支上: $ git merge dev $ git branch -d dev
解决冲突
准备新的feature1分支,继续我们的新分支开发:
$ git checkout -b feature1 Switched to a new branch 'feature1'
git merge feature1
git log --graph --pretty=oneline --abbrev-commit 查看分支合并情况
多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
要查看远程库的信息,用git remote:
$ git remote 要查看远程库的信息
用git remote -v显示更详细的信息
推送分支
git push origin master
git push origin dev
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
-
master分支是主分支,因此要时刻与远程同步; -
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步; -
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
-
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!
抓取分支
git clone git@github.com:michaelliao/learngit.git
现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
git checkout -b dev origin/dev
git push origin dev
如果分支提交有冲突的时候git branch --set-upstream dev origin/dev
git pull
多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin branch-name推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin branch-name推送就能成功!
创建标签
git tag v1.0
git tag v0.9 6224937 针对commit id打标签
git tag查看标签
git show v0.9查看标签信息
git tag -a v0.1 -m "version 0.1 released" 3628164添加标签说明文字
操作标签
git tag -d v0.1
git push origin v1.0
git push origin --tags一次性推送全部尚未推送到远程的本地标签
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v0.9
git push origin :refs/tags/v0.9
使用GitHub
如何参与一个开源项目呢?比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页https://github.com/twbs/bootstrap,
点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:
git clone git@github.com:michaelliao/bootstrap.git
Bootstrap的官方仓库twbs/bootstrap、你在GitHub上克隆的仓库my/bootstrap,以及你自己克隆到本地电脑的仓库,他们的关系就像下图显示的那样:

如果你想修复bootstrap的一个bug,或者新增一个功能,立刻就可以开始干活,干完后,往自己的仓库推送。
如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。当然,对方是否接受你的pull request就不一定了。
小结
-
在GitHub上,可以任意Fork开源仓库;
-
自己拥有Fork后的仓库的读写权限;
-
可以推送pull request给官方仓库来贡献代码。
浙公网安备 33010602011771号