Git简介
下面是摘自官网的一段话:
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
简而言之,Git是一个优秀的分布式版本管理软件。
安装
打开Git官网:git-scm.com,下载并安装。
Debian或Ubuntu Linux
,通过一条sudo apt-get install git
就可以直接完成Git
的安装。
安装完成后,windows打开git-bash
,linux直接打开terminal
。
初始化配置
配置用户信息(和Github上一致):用户名和邮箱地址:
如果之前已经配置好了,可以使用如下命令查看:
|
|
还可以配置颜色和行尾。不同平台的行尾是有显著区别的。
|
|
其他配置:
配置的级别分为:global
、local
与system
三种级别,local
会覆盖global
。就像面向对象的继承那样,最近的是最有效的,也就是local
。
init&add——开始与添加
选择需要版本控制的文件夹,打开终端(linux)或者Git Bash(windows)。
初始化Git:
最好的方法是在开始一个项目之前,通过
git init xxx
来新建一个项目目录xxx
。git会自动创建该xxx
目录。
假设文件夹下存在需要版本管理的文件,使用如下命令查看是否已经被管理:
|
|
添加需要管理的文件:
可以在目录下创建一个名为.gitignore
的文件,在其中输入需要忽略的文件。
commit——提交修改
|
|
修改内容之后,使用commit
提交。
|
|
log
命令可以查看每次的更改。
目前都是在本地化的版本管理。
diff——显示不同
现在假设你修改了一个文件,但是过去了一段时间后忘记修改在什么地方了,此时你需要“diff”。
log——查看修改
log是一个非常强大的明了,不仅可以查看提交的历史记录,而且是了解仓库的进展、提交的内容以及文件的好帮手。
remove——删除文件
删除文件。两种方式,一种是git rm
,一种是git add
git rm
用来删除一个文件;并且会自动暂存修改。
此外,如果用rm
删除了一个文件,可以使用git rm
再次暂存修改。
现实情况中,往往会有很多文件被删除了,不可能通过命令行一个个修改。
改命令会遍历文件夹,并且查找出所有删除的文件,并且暂存。
有时候只是想要从git中删除,但是本地文件不删除,使用如下命令:
你是真的想在所有历史记录中删除这个文件的记录吗?这是另一个主题中会讲。或者你是不想要某个文件被追踪,之后也是这样,那么可以使用git ignore
文件,在之后也会介绍。
move——移动文件
移动文件。
|
|
找出所有的移动过的文件。(包括修改之后移动的文件)
追踪移动过的文件的历史:
在移动文件之后,commit给我们一个数字来告诉我们文件在移动前后的相似度。Git提供的默认阈值是50%的相似度,超过50%,在移动前后就会继续追踪该文件。
ignore——忽略文件
可以在目录/子目录下创建一个名为.gitignore
的文件,在其中输入需要忽略的文件/文件夹。
只能对当前目录的文件/文件夹进行忽略。 可以使用匹配符,在当前目录/子目录都有效。
子目录中,需要路径优先级??
也可以使用“!”反忽略某一个特定的文件。
注释行用“#”号开头。
查看忽略了的文件:
为什么我感觉不需要加上 --others
也可以。而且第二个命令更靠谱。
以上述的第一个命令为主。
如果你感觉第一个命令不行的话,那是因为在某些文件先前已经被纳入了版本管理中,就算是在.gitignore中已经声明了忽略路径也是不起作用的,这时候我们就应该先把本地缓存删除,然后再进行git的push,这样就不会出现忽略的文件了。git清除本地缓存命令如下:【参考资料二】
关于ignore规则的详细介绍,可参考这篇博文,写得很详细。
branch——开始新分支
创建与删除
|
|
switch——切换分支
|
|
checkout的其他用法
最主要的作用就是切换分支,上面已经讲过了。
都可以查看目前处于那个分支上面。
撤销内容:
会清理掉最后一次commit的内容。
|
|
一步到位,既创建了一个新的branch,也转移到了新的branch。
如果在使用checkout
命令的时候,不小心将头指针分离了,如下所示:
当我们发现头指针游离于分支之外的时候,不要惊慌,再次git checkout program
切换到已经存在的分支即可。
merge——分支合并
|
|
merge冲突的解决
merge冲突:两个文件都有变化,Git无法确定该怎么合并。该如何解决呢?
先用git status
查看是哪个文件冲突 ,然后用编辑器打开,进行修改。
先查找<<<<<<< HEAD
标志,表明是当前branch上的内容,直到=======
标志结束。
在=======
标志的下方,直到>>>>>>> branchNeedToMerge
标志结束,是另一个分支的内容。
找到位置后,需要手动地解决冲突:编辑文件,删去冲突的标签,决定该删去或保留哪些内容,保存即可。最后重新add、commit提交。
abort——放弃冲突
放弃这个冲突(不重要),从上次commit开始,并且清除暂存区。
squash压缩
|
|
意思是 你在分支branchNeedToMerge
里面做了很多次commit修改,但是修改很零碎;在master分支里只想要一次commit就更新到branchNeedToMerge
分支的进度。此时就可以使用--squash
参数。
判断是否使用
--squash
选项最根本的标准是,待合并分支上的历史是否有意义。
关于--squash
参数的举例可参考这篇文章。
-d 删除分支
|
|
Network
Remotes
|
|
<server>
是远程服务器的地址、目的地的url。
小技巧:仓库地址的格式写为:
https://用户名:密码@github.com/用户名/xxx.git
,可以免去每次都输入用户名以及密码的麻烦!!(最好在个人电脑中这样使用,因为每次push都会显示用户名密码。)
如果输错了或者忘记了也不要紧,可以输入如下命令重新设置:
查看远程的地址有哪些:
最后删除远端地址:
fetch/pull/push
|
|
fetch:去github.com上面下载信息,放在远程追踪分支。,
pull:与fetch非常像,下载下来放到远程,并且合并到本地。
push:电脑上完成了工作,发送到github上面。
fork/pull requests
fork:拷贝到自己的仓库进行修改,最好新建分支。
pull requests:对他人的代码进行修改,提意见
reset——重置
reset有三个等级,默认的是mixed
,除此之外还有soft
与hard
。
|
|
reset在对仓库历史提交的处理上比较有用,当然也是一个危险的命令啦。
checkout可以做类似的事情,checkout
更加关注的是一个目录或者文件级别的精度。也就是说,可以把某个文件拉回到几次提交之前的状态。
reflog
包括reset
做的那些不可恢复的操作,reflog
都有记录。
但默认提供的是30天的保存时间。
|
|
也可以图形化查看历史:
reflog
让我们有动力地去多做commit,commit了就有保障了。