Git
安装Git
直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行命令xcode-select --install
安装“Command Line Tools”,点“Install”就可以完成安装了。
配置 Git 帐号
PS:可以填写你常用的用户名和邮箱
$ git config --global user.name "Your Name Here"
$ git config --global user.email "your_email@youremail.com"
这些配置信息将会添加进 ~/.gitconfig 文件中。
我们将推荐使用 HTTPS 方法(另一个是 SSH),将你的代码推送到 Github 上的仓库。如果你不想每次都输入用户名和密码的话,可以运行:
$ git config --global credential.helper osxkeychain
创建本地仓库======================
创建版本库
-
选择一个合适的地方,创建一个空目录:
$ mkdir learngit $ cd learngit
-
通过
git init
命令把这个目录变成Git可以管理的仓库:$ git init Initialized empty Git repository in /Users/Chaosky/Desktop/learngit/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
把文件添加到版本库
-
编写一个README.md文件,内容如下:
Git is a version control system. Git is free software.
一定要放到learngit目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git再厉害也找不到这个文件。
-
用命令
git add
告诉Git,把文件添加到仓库:$ git add readme.txt
执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
注:git add .
表示把所有的文件上传到仓库中去,建议这么使用。 -
用命令
git commit
告诉Git,把文件提交到仓库:$ 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 commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
git commit命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了两行内容(readme.txt有两行内容)。
为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt $ git add file2.txt file3.txt $ git commit -m "add 3 files."
工作区和暂存区
-
工作区(Working Directory)
就是你在电脑里能看到的目录。
-
版本库(Repository)
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区;版本库状态
第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。版本库状态
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
版本库管理
-
git status
查看仓库当前的状态,要随时掌握工作区的状态,使用git status命令。
-
git diff
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
-
git log
显示从最近到最远的提交日志。在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ ,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
-
git reset --hard commit_id
在版本的历史之间进行切换,
commit_id
为提交版本的id。 -
git reflog
用来记录你的每一次命令
-
撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- README.md
。场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD README.md
,就回到了场景1,第二步按场景1操作。 -
git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
远程仓库=======================
分布式版本控制系统通常也有一台充当“中央服务器”的电脑,而充当"中央服务器"角色的仓库就是远程仓库,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
如果有自己的私有仓库地址,则无需执行下面几个操作。
-
注册远程仓库账号
-
Git@OSC:开源中国Git托管平台
-
Github:世界最大的Git项目托管平台
-
Coding:国内新兴的Git托管平台
-
-
添加公钥到Git托管平台
-
生成公钥
SSH Keys:SSH key 可以让你在你的电脑和 Git托管平台之间建立安全的加密连接。
你可以按如下命令来生成sshkey:
$ ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
其中
xxxxx@xxxxx.com
需要填写邮箱信息生成SSH key时,如果不清楚需要输入的信息,可以全部输入Enter键。
-
查看你的public key,并把他添加到Git托管平台
$ cat ~/.ssh/id_rsa.pub
具体添加的位置,查看具体的托管平台。一般来说,在个人资料中可以找到
SSH-KEYS
类似的字样就是添加公钥的地方。 -
测试是否添加成功
测试Git@OSC输入命令:
$ ssh -T git@git.oschina.net Welcome to Git@OSC, yourname!
测试Github输入命令:
$ ssh -T git@github.com Hi chaoskyme! Youve successfully authenticated, but GitHub does not provide shell access.
生成SSH key只需要生成一次,不同的网站再将公钥拷贝到网站上即可。
-
-
在Git托管平台上创建项目
-
添加远程仓库
关联一个远程仓库命令:
$ git remote add origin git@server-name:path/repo-name.git
其中
origin
表示远程仓库的别名,默认为origin
git@server-name:path/repo-name.git
表示项目在Git托管平台上的ssh 地址。关联远程仓库只需要执行上面的命令一次即可。
关联后,第一次推送master分支的所有内容命令:
$ git push -u origin master
此后,每次本地提交后,只要有必要,推送最新修改就可以使用命令:
$ git push origin master
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
-
克隆远程仓库
$ git clone git@server-name:path/repo-name.git <repo-name>
-
从远程分支获取最新版本到本地,有2个命令
-
git fetch:相当于是从远程获取最新版本到本地,不会自动merge
$ git fetch origin master $ git log -p master..origin/master $ git merge origin/master
以上命令的含义:
首先从远程的origin的master主分支下载最新的版本到origin/master分支上;
然后比较本地的master分支和origin/master分支的差别;
最后进行合并。
-
git pull:相当于是从远程获取最新版本并merge到本地
$ git pull origin master
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并
-
分支管理
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph
命令可以看到分支合并图。
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
标签管理
git tag <name>
用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag -a <tagname> -m "blablabla..."
可以指定标签信息;
git tag -s <tagname> -m "blablabla..."
可以用PGP签名标签;
git tag
可以查看所有标签
git push origin <tagname>
可以推送一个本地标签;
git push origin —tags
可以推送全部未推送过的本地标签;
git tag -d <tagname>
可以删除一个本地标签;
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
Git常用命令速查表
集中式版本控制系统最大的毛病就是必须联网才能工作。
那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
网友评论