Git是一种分布式版本控制系统(distriubted version control system),它能够追踪每个文件的历史记录,能告诉你在每个时间节点上的文件保存状态。每一次改变就相当于做了一次commit。
1、创建一个新目录
通过git init命令将该路径标记为Git路径。这个时候你可以通过git statuts查看该Git路径的状态
它告诉你了当前你在哪一个分支上(master),没有任何commit.
2、添加文件
在Git路径下创建并保存一个Python文件,如下hello.py
这个时候再查看status,会发现:
Git告诉你在该路径下发现了一个新文件,但是该文件没有被追踪,也就是这个文件仅仅是一个普通文件,不属于Git系统。那么怎样告诉Git这个文件是需要追踪的呢?
通过git add * 可以将hello.py文件添加到Git系统中。
3、commit(声明改变)
当你对文件作出修改的时候,你要告诉Git做一个快照,可以通过git commit来实现:
命令选择 -m 是你自己用来定义,提示哪些改变。
这儿创建了一个hello.py的文件,git statuts提示“clean”,也就意味着所有的修改都被Git所记录了。
4、.gitignore
status命令使用起来很方便,会经常用到。但是有时候你会看到很多你不希望被追踪的文件被标记为”untrack”,你希望Git能够忽略掉这些文件。这个时候就可以用.gitignore
比如,我们在当前路径下又创建了一个新的Python文件,myname.py
这个时候我们修改hello.py,在其中调用myname.py
注意在python3中,当我们把一个python文件作为模块导入另一个文件中时,python会自动创建一个__pycache__的文件:
这是时候查看status可以看到一个文件做了修改,另外两个文件没有被追踪(“untrack”)。
下面我们先整理一下文件,将myname.py和hello.py加入到Git中,并做快照(commit)。
因为__pycache__是python在导入模块的时候自动生成的,我们不想在Git中对它进行追踪,所以需要创建一个.gitignore文件,并把它加入到.gitignore文件中。方法很简单,只需要在.gitignore文件中写入该文件(夹)的名字即可。
注意.gitignore前面有一个点,不可以省略。
这个时候查看status,可以发现__pycache__已经不在被提示了。
当然,这个时候.gitignore还是一个普通文件,需要将它加入到Git中,并做快照。
这个时候就完美了:
这儿会有一个问题,为什么不把所有的文件都放入Git中追踪呢?为什么还要选择性忽略掉一些文件(比如__pycache__)?
记住一点:
只把源文件放入版本控制中, 不要放自动生成的文件
所谓源文件就是你自己编写的,自动生成文件是电脑生成的,通常是在执行源文件的过程中产生的。首先,把自动生成的文件加入到版本控制会占用很多资源,每次生成一个不同的文件,都要追踪,很复杂,而且同意造成文件之间的冲突;其次,自动生成的文件通常比较大,加入到版本控制中会使使用者下载该文件,即使他不一定用到这些文件。
所以对于二进制文件和大文件的版本控制一定要小心。这版本控制中,Git通常不会把整个文件进行快照备份,只是通过算法,将其中的修改的部分做标记,这对避免了很多大文件的占用空间,但是对于二进制文件,比如pg格式和mp3格式文件,通常难以确定修改的部分,所以会将整个文件都进行快照备份。
另外,还有一些含有个人信息或者不想公开的文件,也应该在.gitignore中。
5、git log
git log是另一个比较常用的命令,它能够显示你每一次commit的历史记录:
每一个commit之后都有一个长串字符,这个是所有文件的hash值,使用SHA的加密方法。
另外可以通过--graph选项,以简图的形式显示出git的树状结构,很直观形象。
6、查看历史版本
我们可以通过git checkout来查看历史版本,比如我们要查看第二次commit时候的文件。
可以看到很多信息。这个时候查看status,你会发现.gitignore已经不在了:
那么如何再回到最后的那个版本呢,如果我们知道SHA值,可以直接checkout,回到最后的版本:
不过最常使用的是通过git checkout master命令来回到最后的一个版本。
7、创建分支
如果你和你的同事一起在创建一个代码工程,在你未完成对代码的调试之前,不会进行commit,但是在master上进行你的代码调试是很为不安全的。这个时候你就需要创建一个分支。
-b选择项用来说明创建分支,创建完之后可以看到Git告诉你你现在在my_new_feature的分支上。
我们现在对hello.py进行修改:
然后将此修改添加到Git中。
这个时候查看log,可以看到:
我们已经在my_new_feature分支上完成了对hello.py的修改。
这个时候回到主支(master):
在主支上并没有出现你对hello.py的修改!如果要比较分支(my_new_feature)和主支(master)的区别可以:
8、合并
之前创建了my_new_feature的分支,讲过调试,认为代码没有问题。现在我们想把它合并到主支master上。
先检查一下比较各个分支,这次我们使用—sha1-name选项加上了SHA
这是仅仅需要git merge命令就可以将my_new_feature合并到master中:
除了merge之外,rebase也可以用来合并分支。
9、撤销创建
有两个常用命令, 一个是git reset,另一个是git revert.
reset相当于抹掉了分支,如果你将reset之后的Git上传,别人讲看不到你抹掉的内容;而revert相当于你重新创建了一个之前的版本,别人能够看到你的修改。
10、远程创建
上面所说的内容都是在本地完成的操作,如果我们想把我们的工程共享给其他人,或者发布,那么就需要远程Git.
常用到的远程Git命令有:
(1) clone
如果你知道一个Git的远程地址,那么可以直接使用clone将其拷贝到本地。例如
这就意味着你将在本地建立一个和远程一模一样的Git,包括所有的commit。
(2) fetch和pull相似,根据远程Git更新本地Git,只是fetch不对分支做合并,pull会合并相同的分支。
(3) push 将本地Git合并到远程Git.
总结,一个Git完整的流程为:
. git status - 查看状态,确保当前内容是”clean”
. git pull - 从远程获取最新的版本
. 编辑修改文件,测试修改的代码
. git status - 核实修改的文件,注意一些没有被track的文件
. git add [file] - 将修改的文件添加到git中
. git commit -m “message” - 快照,添加commit
. git push origin [branch-name] - 将修改推送到远程
最后一个很有意思很形象的学习git的网站:
https://learngitbranching.js.org/
========== THE END ==========
参考资料:https://realpython.com/python-git-github-intro/
领取专属 10元无门槛券
私享最新 技术干货