前言
复习下git,这个知识的特点和一些linux命令呀,shell脚本呀,其实是差不多的学习套路。熟练度,没有熟练度,一切都免谈。之后有时间的时候咱们多玩下git的操作。
一、git简介
Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人员也可以用。
Git 来做自己的文档版本管理工具。 Git 的api很多,但其实平时项目中90%的需求都只需要用到几个基本的功能即可,所以本文将从实用主义去谈如何在项目中使用 Git,一般来说,看完这一节就可以开始在项目中动手用。
如果回到当初,开始学习java的时候,git绝对是我最急迫要学习的东西之一了。Java程序员的核心技能之一就是提供服务能力,服务能力说白了还是代码,服务想要顺畅提供能力,必然少不了我们对代码的管控和维护,那么git就显得尤为重要,毕竟它是当今最先进的分布式版本控制系统。
二、git 基本知识
2.1 git 关键字
HEAD 当前版本的指针,当切换本地版本的时候会快速指向指定版本文件master git为我们创建主分支origin 远程仓库的名称
2.2 git 文件的四种状态
-
Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged. -
Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件 -
Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 -
Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
三、创建一个gitee仓库并下载
我在gitee已经有仓库了,就不再重新构建了,这个也非常简单,大家可以自己创建一个并下载下来。
clone下这个https的地址,然后git clone下载下来就可以了。
很清晰。
四.git常用命令
4.1 status add commit push代码提交、推送命令
status命令
git status [file-name] 查看指定文件状态
git status 查看所有文件状态
一般在工作中使用的都是git status命令,便于我们快速定位文件的状态.现在我们在
test_git目录下新建一个c.txt文件,然后test_git目录下右键点开Git Bash Here,
执行git status查看文件状态.显然当前文件属于Untracked文件,这时候就要用到add命令了
add 命令
add命令是用来操作工作区的文件的,将工作区的文件提交到暂存区是add命令的使命。
我们在刚才本地test_git目录下创建一个c.txt文件然后把它提交到暂存区,再次查看文件的
状态,发现它已经变为绿色了,此时它已经被提交到暂存区。
add命令的用法有很多种,下面四种不同情况下可以进行选择。其中1和4我认为是最常用的。
add 命令小结
git add [file-name1] [file-name2] ... 从工作区添加指定文件到暂存区git add . 将工作区的被修改的文件和新增的文件提交到暂存区,不包括被删除的文件- `git add -u . u指update,将工作区的被修改的文件和被删除的文件提交到暂存区,不包括新增的文件
git add -A . A指all,将工作区被修改、被删除、新增的文件都提交到暂存区
文件到暂存区以后,下一步是将它加入本地的版本库中,这时候commit命令就可以大显身手了
Commit 命令
Commit命令的作用是将存在于本地暂存区的文件提交到本地仓库。
关于git commit 这个命令多说一句,如果某次提交之后你觉得这次的提交还没有提交完又改了
些代码,但是你并不想本次再次commit,因为你又修改的代码和上次的提交本应属于一次提交。
那么可以使用git commit --amend命令去提交你想补充的暂存区文件到本地仓库,输入之后
会弹出编辑页面你可以修改提交的提示信息message等等,修改完之后先esc退出编辑界面,然后shift+:即可完成commit。
且这次的commit和上次会合并到一起。
commit 命令小结
git commit -m [massage] 将暂存区所有文件添加到本地仓库git commit [file-name-1] [file-name-2] -m [massage] 将暂存区指定文件添加到本地仓库
-git commit -am [massage] 将工作区的内容直接加入本地仓库,加-m是指直接在后面写上版本的注释,不加-m的话会用一个vim打开文件让你写入massage,有未追踪的文件将会失败,需要add加入暂存区。
push命令
假设现在你已经把一个文件成功推送到本地仓库了,那么git会提示你目前领先于远程。比方我现在
再修改下c.txt并提交本地仓库,给大家截图看下:
这边利用git push -u origin master进行推送。-u表示本次需要本地和远程进行联系。
推送完成之后再次查看状态,本地和远程已经完全同步了。
下一次的push可以不再使用-u参数,直接使用git push即可。\
git push 小结
git push 将文件添加到远程仓库git push -f 强制提交,当我们本地reset到旧的版本时,然后普通push会被拦截,因为此是本地HEAD指向比远程库还要旧git push origin [branch-name] 推送当前本地分支到指定远程分支
4.2 git checkout reset revert (撤销修改、撤销提交的命令)
廖雪峰老师的网站上有这么一句话,在git中,总是有后悔药可以吃的,当你看完
本小节的内容后,对这句话的理解可能会更深刻。哎,人生要是可以像git一样就
好了呀。
在学习撤销命令之前,先来学习一下git log命令
log 命令
git log是git为我们提供的查看命令,显示从最近到最远的提交日志
很清晰,我们一共执行过两次提交。如果你觉得这个显示不够简洁,可以在git log后面加上–pretty=oneline 这样提交记录就会变成一行显示了.
diff 命令
提交后,用git diff HEAD – readme.txt命令可以查看工作区和版本库里面最新版本的区别:
git diff HEAD -- . 查看最新本地版本库和工作区所有文件的区别git diff HEAD -- [file-name] 查看最新本地版本库和工作区文件的区别git diff HEAD^ -- [file-name] 查看本地上一个版本和工作区文件的区别
checkout命令
先来新建一个文件,d.txt,并推送远程
随后修改下d.txt的内容
d.txt中的领导可真是个sb是新加上的内容。突然此时我发现,这句话是凌晨两点半我胡乱写上去的,这要是搞到远程,估计要被经理一顿臭骂。那么这时候该怎么办呢,我要撤销这个地方的修改,此时就要用到git checkout 命令
git checkout -- [file-name]
最好加--,没有的话就把它当作切换分支看待,切换到另一个分支了,如果没有这个分支也会把它当作文件执行。用暂存区的文件覆盖掉工作区的文件如果暂存区没有可更新的就会用commit的文件更新工作区的文件
再来查看d.txt文件,他们的修改的确都被撤销了。
reset命令
现在是凌晨两点了,我无意中修改了d.txt的内容
最要命的是我已经将它提交到了本地仓库
现在怎么办呢,这时候就可以用到git reset命令了
git reset 命令有三个参数,下面进行详细的说明
git reset --{soft|(mixed)|hard} HEAD
--soft 其中可选参数soft表示单纯的切换HEAD指向的commit-id,此操作将
保留你的修改,无论跨越几个版本,每个版本的修改都会被保留
--mixed 默认值mixed参数表示先执行上面一步,然后再将commit-id里面的
内容更新到暂存区,此操作将保留你的修改无论跨越几个版本,每个版本
的修改都会被保留
--hard hard表示先执行上面两步,然后再将暂存区内容同步到工作区,此
操作将丢弃你的修改,慎用
我们挨个进行尝试
首先git reset --mixed commitid的效果
此时咱们已经可以结合git checkout --d.txt来撤销刚才的修改了。
如果使用git reset --soft commitid
如果使用git reset --hard commitid
git reset 命令总结
--soft 其中可选参数soft表示单纯的切换HEAD指向的commit-idmixed 默认值mixed参数表示先执行上面一步,然后再将commit-id里面的内容更新到暂存区--hard hard表示先执行上面两步,然后再将暂存区内容同步到工作区git reset --hard HEAD^^ 用上两个版本里的所有文件撤回到暂工作区git reset --hard [commit id] 用指定版本的所有文件撤回到工作区
当对单个文件进行操作
git reset HEAD [file-name]
-
对单个文件操作时候只能用mixed参数,而且还是可省略 -
对单个文件操作时候HEAD指向不会变 -
将commit中指定的文件同步到暂存区中git reset [commit-id] [file-name] 将指定commit-id中的文件替换掉暂存区的文件
reflog命令
此时,你刚执行了git reset --hard commitid命令,但是你突然后悔了,想找回自己最新的那一笔提交。可是执行git reset --hard
之后本地无论是工作区还是暂存区修改都已经不见了,怎么办呢?之前说了,git中总是有后悔药可以吃的
git reflog 显示操作本地版本库的命令,包括commit和reset等
你可以借助这个命令回到后悔的地方重新来过。
revert命令
revert代表重做,revert后面指定的版本会被视为bug版本丢弃,简单理解就是,你指定哪个版本,哪个版本的代码发生的修改就会被丢弃。
现在执行对d.txt文件的修改:
第一步:d.txt添加hhh,提交本地版本库并推送远程
Two:d.txt添加ggg,提交本地版本库并推送远程
现在git revert -n 6585f7ea4814a56fb3c178fa720494f7a64117ae 看看会发生什么
reset和revert撤回版本的比较
reset 切换版本是会删除丢弃最新的版本的,HEAD会直接跳到指定版本,但是还是可以通过reflog找回。
revert 会将指定的bug版本视为bug版,会将当前版本中的bug版的代码删除,生成新的commit覆盖掉当前commit,但是commit-id是不会变的。同理,你还是可以通过git reflog找回。