git使用说明
一、为什么要使用git管理工程
git全名叫做分布式版本控制系统,是一个版本管理工具。何为版本管理工具呢?做为一名码农,在编写代码的时候难免会碰到版本管理起来繁琐的问题,对于项目庞大的工程来说,更是如此了,因为很多时候,一个大工程并不是一个人单独完成的,这个时候,对于代码的整合就遇到了很大的问题。
打个比方,在一个多人参与的软件项目的编写过程中,每个人负责一个模块或者说功能的开发,在最后整合的时候,如果没有一个像git一样的版本管理工具,会显得尤为麻烦,还容易出错。项目周期一般不会很短,在这样一个周期长的代码汇聚过程中,每一个阶段的代码编写都应该有一些记录,方便后期的代码调整以及查错。
![](https://i-blog.csdnimg.cn/blog_migrate/11d1b12ef2d4bfeb2e6623d01e556af9.jpeg)
git拥有很强大的版本管理功能:
1、原子性操作(可回退,减少误操作);
2、本地修改(方便);
3、分支给予了组合开发的易操作性(减少了多份代码所带来的繁重程度,不同的分支都可以合并根自己的主分支进行合并,减少了解决冲突所带来的时间消耗);
4、tag以及提交的message方便了代码的整体管理(可根据tag号来回退代码版本,可根据提交的message来查询每次提交代码所做的修改内容)。
二、常用的版本管理工具
对于常用的版本管理工具,有这样三个:git、SVN、CVS。
![](https://i-blog.csdnimg.cn/blog_migrate/5d9fbfbec2d8897a0ef4805f62d22f87.png)
(1) git工作目录只能是整个项目。比如 checkout,建分支,都是基于整个项目的。而 svn 可以基于项目中的某一个目录;
(2) 在git 中的绝大多数操作都只需要访问本地文件和资源,不必联网就可以看到所有的历史版本记录,而SVN 却需要联网;
(3) SVN 断开网络或者断开VPN就无法commit代码,但是git 可以先commit到本地仓库;
(4) git 克隆一个完整项目的速度非常快,SVN 非常慢;
(5) 最大的区别是分支:
在git上,每个工作成员可以任意在自己的本地版本库开启无限个分支,只要我不合并及提交到主要版本库,没有一个工作成员会被影响。等到我不需要这个分支时,我只要把它从我的本地版本库删除即可。
而对于SVN来说,如果工作成员想要开启新的分支,那将会影响“全世界”!每个人都会拥有和你一样的分支,你改一个分支,还得让其他人重新切分支重新下载,而且这些代码很可能对稳定版本还是具有破坏性的。
三、常用的git基本操作
git clone
获取代码:git clone
此命令用于将存储库克隆到新创建的目录中。
git clone 命令默认的只会建立master分支
- 最简单直接的命令
git clone xxx.git
- 如果想clone到指定目录
git clone xxx.git "指定目录"
- clone时创建新的分支替代默认Origin HEAD(master)
git clone -b [new_branch_name] xxx.git
- clone 远程分支(如: branch_test)
1)git clone xxx.git
2)使用命令git checkout branch_test切换到branch_test分支
git add
添加新文件至暂存区中:git add
此命令用于将未被track的文件新增到暂存区中。
- 添加指定文件(夹)
git add [指定文件(夹)]
- 增加本目录中所有未被track的新文件(夹)
git add *
git status
展示状态信息:git status
此命令用于显示工作目录和暂存区的状态。使用此命令能看到哪些修改
被暂存到了,哪些没有,哪些文件没有被git tracked到
。git status不显示已经commit到项目历史中去的信息。看项目历史的信息要使用git log。
- 建议
在每次执行 git commit之前先使用git status检查文件状态是一个很好的习惯, 这样能防止你不小心提交了您不想提交的东西。 - status信息
2) modefied: tracked过但是做了修改的文件(红色);
3) untracked: 未被跟踪的文件(红色) ;
4) git add后commit前: 暂存区文件信息(绿色)。
git commit
提交代码至本地仓库:git commit
此命令用于将更改记录(提交)到存储库。将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中。
- 最简单直接的命令
git commit -m "填写关于本次提交的记录信息"
git忽略规则:关于对commit时的文件筛选—-.gitignore文件
![](https://i-blog.csdnimg.cn/blog_migrate/4f3b0382f2cfdce84a968daf75b0b10b.jpeg)
一般来说每个git项目中都需要一个“.gitignore”文件,这个文件的作用就是告诉git哪些文件不需要添加到版本管理中。实际项目中,很多文件都是不需要版本管理的,比如Python的.pyc文件和一些包含密码的配置文件等等。这个文件的内容是一些规则,git会根据这些规则来判断是否将文件添加到版本控制中。
下面我们看看常用的规则:
1)/mtk/不提交这个文件夹
2)*.zip不提交所有.zip文件
3)/mtk/do.c不提交某个具体文件
很简单吧,被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。
需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中:
1)!*.zip
2)!/mtk/one.txt
唯一的区别就是规则开头多了一个感叹号,git会将满足这类规则的文件添加到版本管理中。
为什么要有两种规则呢?想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件
,这个目录中的其他文件都不需要管理,那么我们就需要使用:
1)/mtk/
2)!/mtk/one.txt
假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!
最后需要强调的一点是,如果你不慎在创建.gitignore文件之前就push了项目,那么即使你在.gitignore文件中写入新的过滤规则,这些规则也不会起作用,git仍然会对所有文件进行版本管理。
简单来说,出现这种问题的原因就是git已经开始管理这些文件了,所以你无法再通过过滤规则过滤它们。因此一定要养成在项目开始就创建.gitignore文件的习惯,否则一旦push,处理起来会非常麻烦。
–常用方法–
1. 使用命令行增加排除文件
–排除以.class结尾的文件:
echo "*.class” .gitignore
[之后会在当前目录下生成一个.gitignore的文件]
注意: >>是在文件尾增加,> 是删除已经存在的内容再增加
–排除bin目录下的文件:
echo “bin/” >.gitignore
2. 用记事本打开.gitignore文件,增加需要排除的文件或目录,一行增加一个
git pull
获取代码至本地仓库:git pull
此命令用于从另一个存储库或本地分支获取并集成(整合
)。也可以说是用于取回远程主机某个分支的更新,再与本地的指定分支合并
。
- 最简单直接的命令
git pull
上面命令表示,当前分支自动与唯一的一个追踪分支(即远程对应的分支)进行合并。 - 拉取指定主机的指定分支到指定的本地分支
git pull <远程主机名> <远程分支名>:<本地分支名>
如: git pull origin next:master
上面的命令表示:要取回origin主机的next分支,与本地的master分支合并。
如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。上面命令可以简写为:
git pull origin next
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再执行git merge:
git fetch origin
git merge origin/next
git fetch和git pull的区别
git fetch:相当于是从远程获取最新版本到本地,不会自动合并。
git push
提交代码至远程仓库: git push
此命令用于将本地分支的更新,推送到远程主机。
- 最简单直接的命令
git push
上面命令表示,将当前分支推送至对应的远程分支。 - 推送本地修改至指定主机的指定分支
git push [主机名] [分支名]
如:git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。 - 推送本地修改至指定主机的对应分支
git push [主机名]
如:git push origin
上面命令表示,将当前分支推送到origin主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略。 - 推送本地tag至指定主机的对应分支
git push [主机名] <tag_id>
如:git push origin v1.0.0
该命令可以将本地中历史版本(尚未推送至远程仓库的版本
)推送至远程仓库。
git checkout
切换分支:git checkout
此命令用于切换分支或恢复工作树文件。
- 切换至已存在的分支
git checkout
以上命令表示切换至已存在的一个分支,如若忘记分支名,可以使用git branch或者git branch -a来查看分支,其中 -a 选项表示可以查看本地和远程分支,不加此选项只能查看本地的分支。 - 新建一个未存在的分支,并切换至该分支
git checkout -b <新分支名>
以上命令相当于git branch <新分支名> && git checkout <新分支名>
git log
查看提交日志:git log
此命令用于显示提交日志信息。
- 最简单直接的使用
git log
- 显示最近n次的提交
git log -n
- 根据提交ID查询日志
git log commit_id
#查询commit_id之前的记录,包含commit_id
git log commit1_id commit2_id
#查询commit1与commit2之间的记录,包括commit1和commit2
git log commit1_id..commit2_id
#同上,但是不包括commit1 - 按指定格式显示日志信息
git log --pretty=oneline --abbrev-commit
以上命令表示以oneline的形式显示commit的信息,此时commit_id也将是7位提交哈希值的简写模式。
此命令的更多信息请参考:https://www.yiibai.com/git/git_log.html
git tag
标签相关:git tag
此命令用于创建,列出,删除标签对象(指定版本)。
tag 用于创建一个标签,用于在开发阶段,某个阶段的完成,创建一个版本,在开发中都会使用到, 可以创建一个tag来指向软件开发中的一个关键时期,比如版本号更新的时候可以建一个version1.0, version1.2之类的标签,这样在以后回顾的时候会比较方便。
需要注意的是:除非指定 -f 选项,否则不能创建已经存在的标签。
![](https://i-blog.csdnimg.cn/blog_migrate/ec39382d765dff40e0ba9eabd184f3e4.jpeg)
- 列出现有标签
git tag
- 创建标签
git tag <tag_id>
最简单的标签创建方式
注意: 这种方式的标签默认是打在最新一次提交的commit之上的,所以,如果你是想要在本次的commit上打上标签,一定要先git commit,然后再git tag ,否则,这个tag就会打在上回的commit之上了。
顺序:git commit -> git tag [tag号] -> git push(对于用TortoiseGit提交代码的切记在提交时勾选Include Tags)。git tag -a <tag_id> -m "message" [commit_id]
以上命令中:
-a 用于指定标签名字;
-m 用于对标签进行说明(可选项);
另外,加上commit_id表示将标签打在指定的commit上,默认标签是打在最新提交的commit上的。 - 删除标签
git tag -d <tag_id>
git show
显示各种类型的对象:git show
此命令用于显示一个或多个对象(标签,提交,等等)。
对于提交,它显示日志消息和文本差异。
对于标签,它显示标签消息和引用对象。
- 最简单直接的命令
git show <tag_id或者commit_id>
git reset
回滚操作:git reset
此命令用于将当前HEAD复位到指定状态。一般用于撤消之前的一些操作(如:git add,git commit等)。
![](https://i-blog.csdnimg.cn/blog_migrate/b0450690e66f511d19848cca84356b8c.jpeg)
最简单直接的使用
git reset --hard <tag_id或者commit_id>
或者git checkout <tag_id或者commit_id>
也可以
借用tag_id或者commit_id来使用都可以实现回退
1) tag_id回滚最近一次提交
git reset --soft HEAD^
回滚最近几次的提交
git reset --hard HEAD~n
如:回滚最近三次的提交(注: 这样将永久删除这三个提交):
git reset –hard HEAD~3
四、总结
![](https://i-blog.csdnimg.cn/blog_migrate/c4d596485e18a56c6f85e6a2202841cd.jpeg)
- 对于首次建立工程
1) git clone获取代码;
2) 将工程拷贝至git目录;
3) 编写.gitignore文件以便过滤不需要提交的文件(也可手动删除垃圾文件)
4) git add;(提交未被跟踪的文件以及做了修改的文件,别忘了用git status查看前后的情况)
5) git commit -m “message”;
6) git tag ;( 不需要打tag可忽略此步)
7) git pull;(以防止代码冲突)
8) git push origin 。(将打过的tag提交至远程仓库,没有打tag可以忽略tag_id) - 对于历史项目进行拉取并修改
1) git clone获取代码;
2) git checkout (-b) [branch_name];(切换分支的情况使用之, -b 用于切换至一个新的分支)
3) git (reset –hard)或者(checkout) [tag_id或commit_id];(回滚至指定版本)
4) git add;(提交未被跟踪的文件以及做了修改的文件,别忘了用git status查看前后的情况)
5) git commit -m “message”;
6) git tag ;( 不需要打tag可忽略此步)
7) git pull;(以防止代码冲突)
8) git push origin 。(将打过的tag提交至远程仓库,没有打tag可以忽略tag_id)
本文参考:
1. https://www.yiibai.com/git/
2. https://www.cnblogs.com/kevingrace/p/5690241.html