一、什么是Git?
假设你在的公司要上线一个新功能,你们开发团队为实现这个新功能,写了大约5000行代码,上线没2天,就发现这个功能用户并不喜欢,你老板让你去掉这个功能,你怎么办?你说简单,直接把5000行代码去掉就行了,但是我的亲,说的简单,你的这个功能写了3周时间,但你还能记得你是新增加了哪5000行代码么?所以你急需要一个工具,能帮你记录每次对代码做了哪些修改,并且可以轻易的把代码回滚到历史上的某个状态。 这个神奇的工具就叫做版本控制。
版本控制工具主要实现2个功能:
1. 版本管理
在开发中,这是刚需,必须允许可以很容易对产品的版本进行任意回滚,版本控制工具实现这个功能的原理简单来讲,就是你每修改一次代码,它就帮你做一次快照。
2. 协作开发
一个复杂点的软件,往往不是一个开发人员可以搞定的,拿微信来举例,现在假设3个人一起开发微信,A开发联系人功能,B开发发文字、图片、语音通讯功能,C开发视频通话功能, B和C的功能都是要基于通讯录的,你说简单,直接把A开发的代码copy过来,在它的基础上开发就好了,可以,但是你在他的代码基础上开发了2周后,这期间A没闲着,对通讯录代码作了更新,此时怎么办?你和他的代码不一致了,此时我们知道,你肯定要再把A的新代码拿过来替换掉你手上的旧通讯录功能代码, 所以此时需要一个工具,能确保一直存储最新的代码库,所有人的代码应该和最新的代码库保持一致。
二、Git的安装
在Linux上安装Git
首先,你可以试着输入git,看看系统有没有安装Git:
$ git The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git
三、创建版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
$ mkdir git_trainning $ cd git_trainning/ $ git init Initialized empty Git repository in /Users/alex/git_trainning/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
现在我们编写一个txt文件:
$ vim first_git_file.txt first time using git, excited! 第一次用git哈哈
第一步,用命令git add告诉Git,把文件添加到仓库暂存区:
$ git add first_git_file.txt
第二步,用命令git commit告诉Git,把文件提交到仓库:
git commit -m "备注"
当然,如果你编辑完文件后发现你编辑错了,需要改回到原来的代码,此时如果你没有git add到暂存区的话,可以使用下面命令撤回:
git checkout -- 文件名
如果已经是git add后的话,也可以撤回,使用下面命令:
$git reset HEAD 文件名
三、回滚
好了,现在我们启动时光穿梭机,准备把first_git_file.txt回退到上一个版本,也就是“update again”的那个版本,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交be02137bb2f54bbef0c2e99202281b3966251952(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
现在,我们要把当前版本回退到上一次修改的时候,就可以使用git reset命令:
$ git reset --hard HEAD^ HEAD is now at be02137 update again
如果需要回滚到指定的版本,我们也可以通过查看日志,git log或者git reflog命令查看相应版本的“ID号”,然后使用下面命令撤回:
git reset --hard 343sd23 回滚到指定的版本
四、删除
rm file 本地删除 git add/rm file 提交/删除暂存区
五、远程仓库Github
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第一步:创建SSH Key。
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "ray@126.com" //邮箱是注册github的邮箱
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第二步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
第三步,验证是否成功,在git bash里输入下面的命令:
$ ssh -T git@github.com
第四步,接下来就是把本地仓库传到github上去。
$ git remote add origin git@github.com:triaquae/example.git #添加远程仓库 $ git push -u origin master #关联后,第一次推送master分支的所有内容命令,此后,每次本地提交后,就可以使用命令git push origin master推送最新修改
六、分支
分支(dev): git checkout -b branch_name 创建分支 git branch 查看当前所在分支 git checkout branch_name 切换到分支 git pull 从远程更新代码到本地 git push 把本地代码推到远程 git merge branch_name 合并分支 Bug分支: git stash 把当前工作环境临时保存 git stash list 查看临时保存的列表 git stash apply 恢复之前保存的临时工作 git stash drop 删除当前临时保存的环境备份 git stash pop 恢复并删除临时保存的备份
ps:
一、上传项目到Github事例:
二、在dev分支上修改文件后,切换到master分支上把在dev分支修改后的代码合并在一起(前提是master分支并没有在此期间修改文件)事例:
三、在feature1分支上修改文件后,但是master分支也修改了文件,切换到master分支上把在feature1分支合并后上传到远程仓库github事例:
七、忽略特殊文件.gitignore
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。
所有配置文件可以直接在线浏览:https://github.com/github/gitignore,在里面搜索python.gitignore然后下载下来
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。