一文看懂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添加文件需要addcommit一共两步呢?因为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.txt


git 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

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin branch-name推送自己的修改;

  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

  3. 如果合并有冲突,则解决冲突,并在本地提交;

  4. 没有冲突或者解决掉冲突后,再用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给官方仓库来贡献代码。

 

 

 

 

 

 

 




posted @ 2017-07-13 14:54  kyo.stone  阅读(64)  评论(0)    收藏  举报