Git操作记录
恩首先说明下这只是为了避免自己忘记Git操作的时候重新跑去看一遍教程写的,只是作为记录,要教程的跑去下面的三个链接处。暂时这些内容都够个人用了。以后玩服务器了我就再更相关的内容。
昨晚部长在我电脑的Ubuntu系统上想将我的代码推上Github(来的本意是想为我整理后的django上线),发现我连配置都没配置好(之前学习的时候操作都是在VirtualBox上进行),随口问了我点问题也答得不好,被吐槽一番。于是花了一下午恶补了一下Git,顺便整理成这个记录。
恩,Github真的神器啊。重要性我就拿这次和部门的人一起写报名网页的事为例吧——我们是创了个Github项目然而并没有人用,还是用回QQ。结果:
1、 目前整体工作进程无法得以准确掌握,都只能在口头上模糊交代
2、 代码开发进度极不协调。其实这很大的坑是现任的部长引起的——开发文档一团糟,对接处交代不明①,整体缺乏进度交流②,给我的感觉就是还不如我自己一个写完全部(如果有报酬),毫无协作感。其实也不能全怪他,要不是私下特意的去问,不同部门之间交流真的就几乎为零了。
3、 代码整理。这部分都是由我和另一写后台的完成。感到不满的是,用QQ的话要等我们各自写完了③才能发给别人,由对方对现有代码进行一个整合。
① 比如说,设计的以为他弄的一草图,恩他弄的一草图,就是页面的设计图,于是后来部长和Ken(以下部长皆指带我一年的部长)跑来问我,我去问设计的时候,才发觉他们因为这一误会忽视掉了index(Fuck!!!)、succeed这些页面的设计,而前端又跟我讲在苦等设计图
② 我整合的时候发觉和我对应的前端人员并不熟悉template的写法,以致后来我要自行修改。其实问题不大,只是觉得如果能早点看到,说出来,进度能快一点。讨论组里就我和另一个写后台的干完一些事会说明进度。问题刚出现时现任部长并不见人,仅偶尔出现催进度而不过问事情。顺便吐槽一下吧反正也翻不出他名字,对MVC也不熟悉,以致在讨论组里说“我这前端改了的你们后台不跟着修改啊到时合在一起就很乱啊”,恩我和另一个写后台的都是苦笑一阵,一想到写开发文档的还得是这货心里真是…… 只是单纯的为下一届干事感到担忧。
③ 恩其实准确来说是,我们是等到自己写了个能成功测试的才好意思发出去给别人看。
这还只是很小很小的开发啊,顺利的话代码方面开发其实就只要三四天的啊(实际用时就呵呵了,我也不好意思)。万一大型一点的呢,这样的效率怎么活?
好吧以下正题:
首先要熟悉仓库结构(先忽略分支问题来说明吧) —— 本地的:工作区 暂存区 版本库 与Github交互的 —— 远程库 本地Git仓库 // 这里我不会插入图片,可以看下面第一个链接那,配图非常好
项目人Github仓库 →(Fork) 自己的Github仓库/项目仓库 →(git clone) → 本地git仓库
自己在github的项目克隆仓库修改后想要项目人接收你的代码,可发起pull request。但注意它只接收能被直接Merge的Pull Request // 不然项目负责人改冲突什么的都得累坏了啊
配置
apt-get install git 安装git
git init 把当前目录变为Git管理的本地仓库
git config --global user.email “[email protected]”
git config –global user.name “171767313” // --global 表示对本电脑所有git生效
基本操作
git add test/ 把工作区中的test添加到暂存区
git commit –m “explaination” 告诉git已有新修改的文件提交到仓库,并附加说明(恩,准确来说是扔到Objects那里去了
git status 当前仓库状态
git diff 查看working tree与index file的差别
git log 查看提交日志,包含commit ID, Author, Date.
git reset --hard HEAD^^^ 把暂存区的文件退回到前x个版本,其中x为^的数量,也可
git reset --hard commit_ID 此命令也可用于回复到新版本的文件
git reflog 查看所有分支的所有操作记录 ,包括commit和reset的操作
git checkout -- test.c 取消test.c的修改,退回到暂存区时候
git reset HEAD test.c 把暂存区里test.c的修改撤销,重新扔回工作区
git rm test.c 从版本库位置删除test.c
身份验证
接着说到一个验证的问题。恩,你和Github想相互验证对方的真实身份该怎么做的呢?这个和单纯的tell me who you are不同,就好像说我部长想在我电脑上推代码上他的Github那里,Github得验证他身份,不然要是那个是我手贱操作的,他就得哭了。Github则是用SSH Key来识别是不是你在用自己的电脑工作——恩所以我部长说干完活整理完自己想弄的资料,一定要删,不然会祸害到他= =
本地Git仓库和Github仓库是通过SSH加密的。以下则是廖雪峰博客上的内容:
1、 创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件(前者为私钥,后者公钥),如果已经有了,可以直接跳到下一步。如果没有,打开Shell,创建SSH Key
$ ssh-keygen –t rsa –C [email protected]
2、接着登录Github,打开”Account settings”, “SSH Keys”页面,点击”Add SSH Key”,填上任意Title,在Key文本框里粘贴”id_rsa.pub”文件的内容
分支问题
Github算是一个用服务器专门的为Git提供保存、管理代码的地方(恩…可以参考Pypi,个人觉得部分相似)。如果需要用Github来托管一个新项目的代码,则需要在上面创建一个新的仓库。据说还能自己局域网下搭一个玩,这个打算学服务器的时候再自己拿个硬件平台来玩玩吧,不扯这个了,况且一般情况下也用不到。
下面是在Github上建立远程库,也是廖雪峰博客上抄过来的内容 ——
Github右上角Create a new repo,填入Repository name ,一路默认OK~
目前,在GitHub上的这个learngit
(他的example_name) 仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的learngit仓库下运行命令:
$ git remote add origin [email protected]:michaelliao/learngit.git
请千万注意,把上面的michaelliao
替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
$ git branch dev // 创立分支dev
$ git checkout dev // 切换至dev分支
$ git branch // 查看所有分支。其中当前分支前会有 * 号
*dev
master
$ git branch -d dev // 删除dev分支
$ git merge dev 将dev分支的内容整合到当前分支上 // 如有更新内容上的冲突,会提醒且显示失败,需要手动解决冲动后再合并
$ git log --graph 可以看到合并分支图
附: git remote add <host_name> <website> 添加远程主机。相应的也有
git remote rm <host_name> 删除远程主机
分支管理的问题 —— 恩我上学期参与一个微信公众号开发的时候就因为这个被说了一次,当时我没建立自己的分支直接推上master去了,影响了工作。罪有应得啊= =。下面是阮一峰博客上的:
git fetch <remote_host_name> <remote_branch_name> 将某主机某分支(此项不写则视为取全部分支)更新整理到本地
git pull <remote_host_name> <remote_branch_name>:<local_branch_name> 取回远程主机某个分支的更新,再与本地的指定分支合并。其中最后一项可不写,此时则视为远程分支与当前分支合并
如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。
但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。如$git pull –p
git push <remote_host_name> <local_branch_name>:<remote_branch_name>将本地分支的更新推送到远程主机
如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
没错,我当初就是直接写了master……明明自己的只是写出了框架,还有一些页面细节等着别人修改来着的= =啊我错了!
资料参考 (教程的真的去看他们的吧,我只是简单记录)
http://blog.chinaunix.net/uid-10415985-id-4112861.html undeador博客
http://www.ruanyifeng.com/blog/2014/06/git_remote.html 阮一峰的博客
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 廖雪峰的git教程