使用git一段时间,只是简单使用git pull、push、add、commit等命令,对git也是一直半解,最近才静下心来好好从头看了一遍,又有许多收获。
Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
下载:http://code.google.com/p/git-osx-installer/
下载最新的pkg文件
最早git是在linux环境下开发,所以在windows下使用git,需要Cygwin这样的环境,而且Cygwin的安装环境都比较复杂,不过好在有大神把git和Cygwin都打包好了–msysgit ,只需要下载一个单独的exe安装即可。
可以从http://msysgit.github.io 下载,或者百度搜索下载。
安装完成后再开始菜单里找到”Git”->”Git Bash”,点击运行就会出来一个类似命令窗口的东西。
git config – 初始化你的配置
安装完成后,git需要如下设置:
git config --global user.name "your name" 配置你的名字,也就是每次提交别人都可以根据名字知道是谁提交的
git config --global user.email "[email protected]"
–global参数 表示你电脑上所有git仓库以后都会使用这个配置。
如果你电脑上有两个git仓库,一个公司的,一个是个人的,肯定不希望使用同一个配置,你可以cd到你个人仓库底下重置该配置,去掉–global参数即可,即当前配置只针对当前仓库有效。
接下来就该创建版本库,即本地的工程目录
git init – 初始化一个本地仓库
你可以手动创建一个文件夹,然后cd到该目录下,运行git init
git init
运行完以后你会发现当前目录下会多出一个.git目录,该目录是用来跟踪你所有的文件操作
然后你就可以在本地进行一些文件的操作
git add – 把文件添加到仓库
新建一个文件cx.txt
git add cx.txt (添加cx.txt文件到仓库)
git add . (批量添加,添加所有文件到仓库,一般更多的采用该命令)
git commit – 把文件提交的仓库
git commit -m "本次提交说明" (-m 添加提交说明)
or
git commit -a -m "提交说明" (-a 代替git add,使用-a参数后就不用使用git add命令)
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: cx.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
git diff – 查看文件改动前和改动后的对比
git diff cx.txt
git log – 查看所有的提交日志
比如你自己早上提交了一个a.txt,下午改动了b.txt中的一行代码等,通过git log可以查到所有认的改动信息
git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
add a.txt
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 14:53:12 2013 +0800
modify b.txt
commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 19 17:51:55 2013 +0800
modify c.txt
如果感觉输出的信息太多,你也可以在git log后添加参数 –pretty=online
git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 add a.txt
ea34578d5496d7dd233c827ed32a8cd576c5ee85 modify b.txt
cb926e7ea50ad11b8f9e909c05226233bf755030 modify c.txt
说明:
看到的一大串3624...e1e0
等类似的字符串commit id
,即每次提交自动生成的唯一标识。你可以使用git show 命令查看更详细的提交信息。
git show
git show ea34578d5496d7dd233c827ed32a8cd576c5ee85
通过该命令,你就可以看到提交人对b.txt做了哪些修改
git reset – 版本回退
还是以上面为例,比如你提交了a.txt以后,突然感觉a.txt文件不该被提交,想要回到上一次提交的状态
git reset --hard HEAD^ 回退到上一个版本
git reset --hard HEAD^^ 回退到上两个版本
git reset --hard HEAD~100 会退到上100个版本
再比如你回退到上一个版本,即修改b.txt的那个版本,突然又感觉a.txt还是应该被提交(I 服了 you)
git reset --hard 3628164fb26d48395383f8f31179f24e0882e1e0
只需要找到那次提交的commit id即可。可以看到又回来了,如果commit id找不到肿么办。
如下:
git feflog – 用来记录你的每一次命令
git reflog
ea34578 HEAD@{0}: xxxx
3628164 HEAD@{1}: commit: add a.txt
ea34578 HEAD@{2}: commit: modify b.txt
cb926e7 HEAD@{3}: commit (initial): modify c.txt
git checkout – 放弃文件改动
比如你在a.txt里面添加了很多行代码,而且还没有执行git add命令,则使用git checkout a.txt可以恢复到修改前的状态。
git checkout a.txt(放弃a.txt文件的改动)
or
git checkout . (放弃所有文件的改动)
以上所有的操作都是在本地进行,但是如果你想要开源你的项目或者一个小组共同开发维护一个公司的项目,那么代码最终要提交的服务器上的一个仓库,所以就要添加远程库,每天把修改的代码推送到远程库上。
远程库中存放代码的服务器,你可以自己搭建一个git服务器,也可以使用github的仓库,但是存放到github上的代码都是共享的,所有人都可以看到你的代码。
github 一个神奇的网站
既然你需要把你的代码推送到远程库中,那么你的代码推送过去的时候肯定需要一个暗号 告知远程库是你提交的代码。(远程库:暗号! 你:天王盖地虎。 提交成功)
所以就需要:
SSH Key – 本地Git仓库和GitHub仓库之间的传输是通过SSH加密的
ssh-keygen -t rsa -C "[email protected]"
一路回车,就可以在.ssh目录下看到id_rsa 和 id_rsa.pub两个文件
登陆Github
打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
Github允许添加多个SSH Key,也就是你可以用多个电脑共同修改一个工程,在公司用公司的电脑,回家以后用自己的电脑。
扩展 – 配置多个git远程仓库的SSH Key切换
还有一种情况,可能你要在一台电脑上开发多个工程,比如自己的项目和公司的项目。这时候应该怎么办。
这种情况就需要去针对不同的仓库生成不同的id_rsa 文件
ssh-keygen -t rsa -C "[email protected]" -f id_rsa_second
这时候就会在.ssh目录中生成 id_rsa_second 和 id_rsa_second.pub两个文件;
1. 然后在把id_rsa_two.pub文件配置到你的github上。
2. 在~/.ssh目录下创建config文件,添加代码如下:
Host my.test ##可以随意命名,链接时使用这个名字
HostName github.com ## 上面配置的名字对应的链接地址
User git
Port 22
IdentityFile ~/.ssh/id_rsa_second
现在你从github上clone一个项目:
原clone地址:git clone git@github.com:second/test.git
但是如果你想用自己的账号配置(即上面配置)来clone这个项目:
则使用:git clone git@my.test:second/test.git
配置完以上信息后,现在就可以开始动手把你本地的项目推送到服务器上:
在github上创建一个仓库(repository):
1 . 然后把本地仓库与git仓库关联 – git remote
git remote add origin git@github.com:xxx/learngit.git
##注:origin后的[email protected]:xxx/learngit.git是你的github仓库的地址
2 . 把本地仓库内容推送到git仓库 – git push
git push -u origin master ##是把当前分支master推送到远程
第一次推送时加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git stash – 代码储藏
当你在开发中肯定会遇见这种情况,你正在dev分支开发一些新功能,但这时线上有个bug反馈,你需要去master分支修改bug,但是你dev上的代码还不能提交,因为提交上去可能会引起项目报错,导致其他同事拉去代码后无法运行,此时就需要使用git stash 命令。
git stash
此时在通过git status命令查看工作区,发现是干净的,等你在master上修改完以后再返回dev分支,运行
git stash list
stash@{0}: WIP on dev: 6224937 add merge ##刚才存储代码的日志
git stash pop ##恢复代码
也可以用
git stash apply atash@{0} ##恢复指定的stash
pwd – 查看当前路径
git remote – 查看远程库的信息
git remote –v – 查看远程库的详细信息
参考文章:
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
http://blog.jobbole.com/78960/
http://omiga.org/blog/archives/2269