本章内容git
一、仓库的基本命令github
二、分支管理ruby
一、建立本地管理仓库app
git initssh
二、把文件添加到仓库学习
git add readme.txtspa
三、告诉Git,把文件提交到仓库版本控制
git commit -m ''wrote a readme file'code
四、git status
命令可让咱们时刻掌握仓库当前的状态,上面的命令告诉咱们,readme.txt被修改过了,但尚未准备提交的修改。 blog
$ 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")
五、虽然Git告诉咱们readme.txt被修改了,但若是能看看具体修改了什么内容,天然是很好的。好比你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,因此,须要用git 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 diff
顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,能够从上面的命令输出看到,咱们在第一行添加了一个“distributed”单词。
六、在实际工做中,咱们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,否则要版本控制系统干什么。版本控制系统确定有某个命令能够告诉咱们历史记录,在Git中,咱们用git log
命令查看:
$ git log commit 3628164fb26d48395383f8f31179f24e0882e1e0 Author: Michael Liao <askxuefeng@gmail.com> Date: Tue Aug 20 15:11:49 2013 +0800 append GPL commit ea34578d5496d7dd233c827ed32a8cd576c5ee85 Author: Michael Liao <askxuefeng@gmail.com> Date: Tue Aug 20 14:53:12 2013 +0800 add distributed commit cb926e7ea50ad11b8f9e909c05226233bf755030 Author: Michael Liao <askxuefeng@gmail.com> Date: Mon Aug 19 17:51:55 2013 +0800 wrote a readme file
$ git log --pretty=oneline #输出格式比较简洁
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
七、恢复到起先的版本
$ git reset --hard 3628164 HEAD is now at 3628164 append GPL
八、你恢复到起先的版本,如今又后悔了,想恢复回来,那怎么办?那就必须找到append GPL的commit ID
$ git reflog ea34578 HEAD@{0}: reset: moving to HEAD^ 3628164 HEAD@{1}: commit: append GPL ea34578 HEAD@{2}: commit: add distributed cb926e7 HEAD@{3}: commit (initial): wrote a readme file
获得这个ID 如今就能够去恢复了。
九、工做区和暂存区的概念
十、$ git checkout -- readme.txt
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工做区的修改所有撤销,这里有两种状况:
一种是readme.txt
自修改后尚未被放到暂存区,如今,撤销修改就回到和版本库如出一辙的状态;
一种是readme.txt
已经添加到暂存区后,又做了修改,如今,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另外一个分支”的命令
十一、用命令git reset HEAD file
能够把暂存区的修改撤销掉(unstage),从新放回工做区:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
git reset
命令既能够回退版本,也能够把暂存区的修改回退到工做区。当咱们用HEAD
时,表示最新的版本。
再用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")
还记得如何丢弃工做区的修改吗?
$ git checkout -- readme.txt $ git status # On branch master nothing to commit (working directory clean)
十二、 git rm test.txt #从版本库中删除该文件
$ git rm test.txt rm 'test.txt' $ git commit -m "remove test.txt" [master d17efd8] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt
如今,文件就从版本库中被删除了。
另外一种状况是删错了,由于版本库里还有呢,因此能够很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout
实际上是用版本库里的版本替换工做区的版本,不管工做区是修改仍是删除,均可以“一键还原”。
1三、在github上建立了一个新库,是空的,如今想把本地的库与之关联
git remote add origin git@github.com:帐号/learngit.git
添加后,远程库的名字就是origin
,这是Git默认的叫法,也能够改为别的,可是origin
这个名字一看就知道是远程库。
下一步,就能够把本地库的全部内容推送到远程库上:
$ git push -u origin master Counting objects: 19, done. Delta compression using up to 4 threads. Compressing objects: 100% (19/19), done. Writing objects: 100% (19/19), 13.73 KiB, done. Total 23 (delta 6), reused 0 (delta 0) To git@github.com:michaelliao/learngit.git * [new branch] master -> master Branch master set up to track remote branch master from origin.
把本地库的内容推送到远程,用git push
命令,其实是把当前分支master
推送到远程。
因为远程库是空的,咱们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在之后的推送或者拉取时就能够简化命令。
从如今起,只要本地做了提交,就能够经过命令:
$ git push origin master
1四、克隆远程库
$ git clone git@github.com:michaelliao/gitskills.git Cloning into 'gitskills'... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Receiving objects: 100% (3/3), done.
你也许还注意到,GitHub给出的地址不止一个,还能够用https://github.com/michaelliao/gitskills.git
这样的地址。实际上,Git支持多种协议,默认的git://
使用ssh,但也可使用https
等其余协议。
使用https
除了速度慢之外,还有个最大的麻烦是每次推送都必须输入口令,可是在某些只开放http端口的公司内部就没法使用ssh
协议而只能用https
。
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另外一个你正在另外一个平行宇宙里努力学习SVN。
若是两个平行宇宙互不干扰,那对如今的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!
一、建立与合并分支
*建立dev分支,而后切换到dev分支:
$ git checkout -b dev Switched to a new branch 'dev' 等同于 $ git branch dev $ git checkout dev Switched to branch 'dev'
用git branch命令查看当前的分支:
$ git branch * dev master
git branch
命令会列出全部分支,当前分支前面会标一个*
号。
而后,咱们就能够在dev
分支上正常提交,好比对readme.txt作个修改,加上一行:
$ git add readme.txt $ git commit -m "branch test" [dev fec145a] branch test 1 file changed, 1 insertion(+)
如今,dev
分支的工做完成,咱们就能够切换回master
分支:
$ git checkout master Switched to branch 'master'
切换回master
分支后,再查看一个readme.txt文件,刚才添加的内容不见了!由于那个提交是在dev
分支上,而master
分支此刻的提交点并无变:
如今,咱们把dev
分支的工做成果合并到master
分支上:
$ git merge dev Updating d17efd8..fec145a Fast-forward readme.txt | 1 + 1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支到当前分支。
合并完成后,就能够放心地删除dev
分支了:
$ git branch -d dev
Deleted branch dev (was fec145a).