什么是Git?
分布式版本控制工具
为什么要用Git?
因为需要版本控制,尤其多人协作开发的时候,用于版本回滚。
主流的版本控制器有:
SVN(Subversion)
CVS(Concurrent Versions System)
VSS(Micorosoft Visual SourceSafe)
TFS(Team Foundation Server)
Visual Studio Online
版本控制产品非常的多,影响力最大且使用最广泛的就是Git。
与SVN的区别?
SVN时集中版本控制工具,所有人在进行开发时都要在联网状态下从远程仓库中拉取最新代码才能进行开发,开发后还要上传到远程服务器。如果服务器损坏将无法继续工作。
Git是分布式版本控制工具,所有参与开发的人员手中都有完整的项目代码,内容变更时只需要将自己更新的内容推送给其他人即可。此外,开发过程中不依赖网络,服务器损毁对工作人员也无影响。
安装Git及环境配置
访问git官方网站下载适合自己硬件环境的安装包,无脑下一步即可。
Git的必要配置
1.配置用户名
1 | git config --global user.name "你的名字" |
2.配置邮箱
1 | git config --global user.email "你的@邮箱.com" |
工作原理
git中包含工作目录、暂存区、本地仓库和远程仓库4个工作区域。
工作区就是平时存放项目代码的路径;暂存区用于临时存放变更的内容,其本质是一个文件,保存即将提交到文件列表的信息;本地仓库是安全存放数据的位置,这里面有你提交的所有版本的数据。其中HEAD只想最新放入仓库的版本;远程仓库就是托管代码的服务器,简单理解就是github中后缀是“.git”的仓库。与使用者之间直接相关的只有工作目录和远程仓库,暂存区和本地仓库只涉及到一些命令操作。
在工作目录使用git add指令将变更内容推送至暂存区,暂存区的内容使用git commit推送至本地仓库,使用git push将本地仓库中的内容推送至远程仓库;反向操作时,使用git pull将远程仓库的内容回滚到本地仓库中,使用git reset将本地仓库的内容回滚到暂存区中,使用git checkout将暂存区中的内容回滚到工作目录中,上述命令的使用如下图所示。

Git项目创建及克隆
在工作路径中右键空白处,唤出git bash界面。
1.本地仓库搭建
在git bash界面中输入以下指令,初始化git项目。
1 | git init |
init结束后会在工作路径中生成一个隐藏的.git文件夹,表示当前工作路径已然是一个Git项目。git init后可以在将本地变动添加至暂存区和本地仓库。
2.配置远程仓库
init后如果需要将本地内容推送至服务器,需要使用git remote指令对远程服务器地址进行配置。
1 | git remote add origin url |
需要修改url时可以使用git remote set-url指令。
1 | git remote set-url origin url |
另外,remote指令还可以用来验证是否成功添加配置。
1 | git remote -v |
推荐姿势
使用init的方式创建项目后,还是需要在github中创建仓库之后再使用remote进行配置。不如先在github中创建库存然后使用gitclone的方式将库存下载到本地,省去一捏捏配置的步骤。
创建库存后制git链接,在工作路径中唤出git bash界面,使用git clone “.git链接”下载该项目的代码,复制git链接的方法如图所示。
1 | git clone xxx.git |

.gitignore文件的配置使用
使用git过程中,有些文件比如日志、临时文件、数据等通常不会被提交到代码仓库当中,这时就需要设置相应的忽略规则,避免不必要的文件上传到远程仓库当中,.gitignore文件就是用于设定工作路径中哪些文件不会被上传。在Github中创建库存时,勾选生成.gitignore文件选项即可生成该文件。clone到本地后可以对其进行修改配置,.gitignore文件的内容书写方式如下。
1 | #不需要提交的目录 |
这里只对gitignore文件的基本用法进行介绍,详见[Git].gitignore文件的配置使用。
Git的基本操作命令
???Git中文件的4种状态
Git中,文件包含未跟踪(Untracked)、暂存状态(Staged)、未修改(Unmodify)和已修改(Modified)。下面用一个例子对这4种状态进行解释说明。
假设现在创建一个hello.py文件,该文件并未加入到git库中,不参与版本控制,所以处于“未跟踪状态”;使用git add . 指令将该文件存入暂存区后,则其状态为“暂存状态”;使用git commit指令将其推送至本地仓库后,暂存区为空,此时该文件所处状态为“未修改”。此时若对文件进行了修改,则其状态为“Modified”,使用add加入暂存区后,commit即可将其重新推送到本地仓库中。
暂存区
使用git add 指令可以将未跟踪文件和已修改文件添加至暂存区。
1 | git add . # “.” 表示将当前路径所有内容都添加至暂存区 |
如若想要撤回暂存区中的内容,可以使用git reset指令。
文件撤出暂存区,但保留修改:
1 | git reset --mixed |
撤销所有已经add的文件:
1 | git reset HEAD . |
撤销某个文件或文件夹
1 | git reset HEAD -filename |
本地仓库
git commit指令可以将暂存区中的内容提交至本地仓库中,在使用commit指令时一定要附带-m参数,为当前commit添加注释信息。
1 | git commit |
版本控制
本地版本控制
集中版本控制
Git的特点
1.分布式版本管理工具
2.敏捷开发
3.开源
十八般武艺
git stash
用于临时保存修改的文件。修改文件时,需要临时切换到其他分支,但是还不想提交,可以用stash临时保存。
1 | git stash save "xxx" |
git log
包含两个参数“–oneline”和“–graph”可以帮助看到日志的流程?
1 | git log --oneline --graph |
git push
用于删除远程分支:
1 | git push branch_name |
git rm
如果错误commit,想去除掉文件,可以使用rm命令,可以将暂存区未commit的文件去除?
1 | git rm --cached filename |
git commit
提交commit但是不创建新的提交记录,再上一次log中更新内容,可以用来压缩日志
1 | git commit --amend |
git cherry-pick
提交特定一次修改
1 | git cherry-pick commit-id |
git archive
文件快照打包
1 | git archive -o archive.zip master |
代码冲突
解决代码冲突的常见两个方法
1 | git merge master |
1 | git rebase -i master |
远程仓库
如何将本地文件和远程仓库文件关联起来?
项目路径要保证是被git管理的路径,即“git init”,然后使用-v参数查看与哪些远程仓库有关联,然后使用add参数添加关联。
可以使用rm指令删除关联。
1 | git remote -v #查看当前路径与哪些远程仓库关联,没有则为空 |
本地内容变更后,使用commit将内容推送至缓存区,想要推送到远程仓库时,需要用到push指令,-u用于指定上游分支
1 | git push -u prigin master |
?从远程仓库获取指定分支
1 | git checkout -b local_branch_yy origin/remote_branch_yy |
压缩提交记录
如果有多次提交记录,却只想保留一条记录怎么办?
reset
在当前commit中包含多个comit时,
1 | git reset commit-id |
amend
1 | git commit --amend |
rebase
1 | git rebase -i commit-id |
标签
1 | git tag tag_name |
使用经验
自己使用git的转变,这鬼东西好难学啊。
第一层
欸?这个项目好像不错欸,下下来康康!这时候git对我来说只是一个下载代码的地方,所用到的指令基本上也就是clone了。下载之后自己在本地跑一跑改一改,基本不设计到其他指令,甚至是直接下载压缩包。。不需要用指令。。
1 | git clone something.git |
第二层
以后我把我自己写的代码都存上云,谁想了解我我就丢他个github链接!这时候就是自己创建一个远程仓库,把自己更改过的代码上传到仓库当中,每次变动后只要add、commit、push就可以了。
1 | cd workspace |
第三层
跟一个小伙伴一起写代码~这个时候就需要开始接触分支了,各自在自己的分支上更新代码,两人同时编写一个文件时,上传的时候可能就要遇到冲突。所以在每次上传之前需要先从远程仓库将最新的内容pull下来,然后再把本地的变动推送到远程服务器。这时候就可以使用stash指令,暂时将本地的内容恢复到变动之前,从远程pull最新内容后使用stash pop指令恢复本地的改动,然后再进行add、commit、push上传自己的代码。
1 | git clone something.git |