学Git,为自己(上篇)
今天是生信星球陪你的第223天
大神一句话,菜鸟跑半年。我不是大神,但我可以缩短你走弯路的半年~
就像歌儿唱的那样,如果你不知道该往哪儿走,就留在这学点生信好不好~
这里有豆豆和花花的学习历程,从新手到进阶,生信路上有你有我!
豆豆写于18.12.18-19
了解到Git其实就是因为很红的Github,但Git包含的东西比Github多多了。Git的魔力一直吸引着我,但目前还是只看到了Git的冰山一角,再次接触希望有新收获。这两天写的东西有点多,所以我决定分两次来推送
关于设定
开始使用git,先要设置使用者的email和名称,比如在终端中输入
git config --global user.name "Bioplanet"
git config --global user.email "Bioplanet520@outlook.com"
可以用git config --list
查看当前的设定
当然使用--global
是针对整个环境来讲,如果想要根据不同的项目设定不同作者,就可以在项目目录下替换为--local
设定
我们都知道,工程师的美德之一就是懒惰,抛弃重复性工作,因此可以设置一些快捷方式帮助git更快处理
-
与文本编辑器无缝连接
我们都希望git可以直接在终端中打开编辑器如Sublime或者VS code,进行代码编写,然后直接上传到github备份。于是可以找到sublime的安装目录,在它的bin
目录下有一个subl
,然后编辑bash_profile
【针对mac环境】,添加export PATH=$PATH:/Applications/Sublime Text.app/Contents/SharedSupport/bin
就好。之后就可以利用subl FILE
在terminal中直接用Sublime打开相应的代码了 -
少打重复的字或者少打错字
设置缩写是比较不错的选择,例如:git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.st status
git config --global alias.l "log --oneline --graph"当然,这些都可以在
~/.gitconfig
中进行修改
全新的开始
第一次使用最重要的就是git init
,想对哪个目录进行版本控制(简称“版控”),就在哪个目录下进行该操作,结果就是在该目录下生成了.git
的隐藏目录。
别看我们平时看不到它,它可储存了整个Git的精华(也许正因如此,才让目录隐藏,避免用户删除)。因此,如果有一天,我们不想对这个目录进行版控了,那么只需要移除.git
目录就好
豆知识 Doodle Tip:针对mac系统,建议练习文件都放在一个名为/tmp的目录下进行,这个目录有个最大的好处:在电脑重启后里面的东西都会被清空,不需要手动清理。但是,切记,重要内容不要放在这个目录下
文件放心交给Git吧
以下内容都是作为新手的我踩过的坑,并且不止一次踩过,以至于多个文件丢失,好在不是什么重要的。后来结合搜索的知识总结了一些重点,感觉还是很有用的
先把文件添加进暂存区
首先看看git status
这个命令,它是用来查询目录当前的状态,如果是一个新的目录执行这个指令,会返回nothing to commit
表示当前没有什么东西可以提交;
但是如果新建了一个文件,那么就会提示Untraced files
,就是说这个文件还没有被加入Git版控系统中,并没有被Git正式追踪,仅仅是检查到有这个东西;
我们有了Untracked
文件,下面就是把新建的文件交给Git,让它来管理、追踪,也就是使用git add
+ 文件名称或整个目录,随后不会提示任何信息,但是可以再次使用git status
来查看当前状态。
只要git add
后,文件的状态就会变成new file
,而不再是Untracked
,表示此时文件被放在了暂存区(Staging Area),随后看看有没有一起做伴的,去到储存库中。
豆问题1: 如果在git add之后,我们又修改了文件的内容,会发生什么?
【例如:我们之前新增一个文件叫
a.txt
,然后我们使用git add a.txt
将文件添加到暂存区,突然想起来有个地方需要修改,于是又在终端中修改了a.txt
】作为刚接触Git的我们,一般会在修改完直接
Commmit
提交,把刚做的修改保存下来(因为默认commit命令是时刻跟随我们的脚步的,我们修改到哪里,它就帮我们保存到哪里。其实并不是,它并没有这么智能,还是需要我们的指令)回到上面👆的问题,我们对文件做了修改,再
git status
一下(这里是不是就发现了:最常用的是status命令,我们是需要时刻提醒的,自己做到了哪一步)。得到的结果就变成了两个a.txt
文件了,一个new file: a.txt
,一个modified: a.txt
。这里的原因就是:我们在第二步添加文件到暂存区是没错的,Git也帮我们记录下来了;但是问题出现在重新编辑后,这里编辑的内容其实并没有再次被加入暂存区。因此,实际上暂存区的内容还是我们刚才第二步加入的原始内容
当然,也不是不能保存修改。如果确认无误,可以再次使用
git add a.txt
,将修改后的文件添加到暂存区豆问题2:在添加文件时,如果想全部添加,是使用
git add .
还是git add -all
呢?这二者在git 2.0以上版本中确实都表示全部文件;但是还有有其他的差别,例如在git主目录下有这几个目录,其中main.css和index.html都做了改动。如果在根目录下执行
git add .
,那么这两个改动的文件都会被放如暂存区;但是如果在css目录下执行git add.
,那么就只有mian.css会被放入暂存区。但是,我们用
git add -all
就不用担心这个问题,因为即便是在css目录下执行这个操作,还是会把两个修改文件都加入
再从暂存区提交到仓库中
上面的一大段文字都是在描述:如何将文件加入暂存区,但是仅仅这样是不够的。暂存暂存,顾名思义它不会长久。如果想让暂存区的东西永久保存下来,我们还需要用到git commit
一般用法就是:git commit -m "first commit"
,其中的-m
以及后面的字符都是在说明:你在这次commit的操作中干了啥。比如第一次提交这个文件就可以用first commit
,简单清楚,让别人和自己都能看懂就行,不限中英文。
这个操作结束后,Git就把暂存区的东西储存到了仓库(Repository)中,也就是说:我Git完成了一个文件的存档/备份,也就是做了第一份的版本建立。
直到Commit结束,才算完成了整个流程!
关于commit,还有一点知识需要了解:
-
Commit到底做了啥?
其实它就是负责了暂存区的东西,也就是说,我们在执行
git commit
的时候,那些没有添加到暂存区中的档案,就不会被Commit到仓库中 -
另外,可不可以不加
-m
以及后面的啰嗦话?答案是:不能!因为没有这个看似啰嗦,实际非常有用的语句,Git是不会允许你完成Commit的操作的。并且添加的话,那些模糊的话就不用加了,比如
trouble shooting
,我们就是想看shoot了什么trouble,这个重要的问题需要指出,例如可以#12 bug fixed
,表示改正了12号错误 -
Commit可不可以提交“空”?
因为在R里,空也是被当成字符来处理的(虽然很绕,它为空,应该没东西,但却还占据着位置)。那么Commit其实也是可以的,但是除了作演示Git的合并以外一般没啥用,可以使用
git commit --allow-empty -m "empty"
提交一个“空”文档,然后描述就是“empty”
三大重要空间
Git中的三大重要空间就是:工作区(Working directory)、暂存区(Staging area)、仓库(Repository),它们的关系是:

那么就有一个问题:难道所有的流程都要通过
add
、commit
后才能完成吗?能不能简化流程?其实可以在commit的时候加上一个参数,如:
git commit -a -m "update"
,但是这个参数只对已经在仓库中的文件有效,对新加入的文件(即Untracked)的文件无效
其实用分段式管理还是不麻烦的,并且对所有文件通用:可以想象有个仓库,仓库门口是个中转站,中转站上有货物有进有出,要存放到仓库的货物可以先放到中转站(git add),然后等待货物达到一定数量了,就打开仓库门,把中转站的货物一起运进仓库(git commit),并且对每一批货物都做好记录(干嘛的、谁送的)
为什么要攒一段时间再开一次仓库门呢?
其实来一件货物开一次门是可以的,但是问题就是记录次数太多,让Commit记录变得太零散,如果让别人看的时候,大家希望看到一个比较完整的内容,而不是一个Commit接着一个看
因此,问题又来了:什么时候选择进行Commit比较好?
没什么硬性规定,当完成一个任务时或者一天紧张的工作学习时光结束时,可以备份也作为记录
保持看记录的习惯
回顾一般的操作流程:
touch a.txt # 建立文件 a.txt
git add a.txt # 把 a.txt 加进暂存区
git commit -m "first submit" # 进行 Commit
查看之前的记录是用git log
,其中会包含几项重要信息
-
Commit作者是谁
-
什么时候进行的commit
-
每次Commit都做了什么
另外,还会看到commit cc797cdb7c7a337824a25075e0dbe0bc7c703a1e
这种信息,看似乱码,其实是非常关键的内容:它其实是SHA-1 (Secure Hash Algorithm 1)演算得到的结果,特点就是重复率极低,因此可以当做Commit的ID号【一般使用6-8位就足以区分不同的Commit了】
当然,如果在git log
后加上--oneline --graph
,结果就会变得更精简,一次显示的结果更多
利用log信息,我们可以做的事情可以包括:
-
查找某个人的Commit(团队协作中很重要)
git log --oneline --author="doodle"
-
查找包括某个字符的
git log --oneline --grep="btw"
-
还可以对Commit的文件进行查找,比如想找提到“生信星球”的文件
git log -S "生信星球"
-
查询历史资料时,可以限定时间
git log --oneline --since="9am" --until="5pm" --after="2018-12"
点击底部的“阅读原文”,获得更好的阅读体验哦😻
初学生信,很荣幸带你迈出第一步。
我们是生信星球,一个不拽术语、通俗易懂的生信知识平台。由于是2018年新号,竟然没有留言功能。需要帮助或提出意见请后台留言、联系微信或发送邮件到Bioplanet520@outlook.com,每一条都会看到的哦~
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!