git基本知识

440 阅读10分钟

前言

复习下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已经有仓库了,就不再重新构建了,这个也非常简单,大家可以自己创建一个并下载下来。

image.png clone下这个https的地址,然后git clone下载下来就可以了。

image.png

很清晰。

四.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命令了

image.png

image.png

add 命令

add命令是用来操作工作区的文件的,将工作区的文件提交到暂存区是add命令的使命。
我们在刚才本地test_git目录下创建一个c.txt文件然后把它提交到暂存区,再次查看文件的
状态,发现它已经变为绿色了,此时它已经被提交到暂存区。

image.png

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命令的作用是将存在于本地暂存区的文件提交到本地仓库。

image.png

关于git commit 这个命令多说一句,如果某次提交之后你觉得这次的提交还没有提交完又改了
些代码,但是你并不想本次再次commit,因为你又修改的代码和上次的提交本应属于一次提交。
那么可以使用git commit --amend命令去提交你想补充的暂存区文件到本地仓库,输入之后
会弹出编辑页面你可以修改提交的提示信息message等等,修改完之后先esc退出编辑界面,然后shift+:即可完成commit。
且这次的commit和上次会合并到一起。

image.png

image.png

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并提交本地仓库,给大家截图看下:

image.png

image.png

这边利用git push -u origin master进行推送。-u表示本次需要本地和远程进行联系。

image.png

image.png

推送完成之后再次查看状态,本地和远程已经完全同步了。
下一次的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为我们提供的查看命令,显示从最近到最远的提交日志

image.png

很清晰,我们一共执行过两次提交。如果你觉得这个显示不够简洁,可以在git log后面加上–pretty=oneline 这样提交记录就会变成一行显示了.

image.png

diff 命令

提交后,用git diff HEAD – readme.txt命令可以查看工作区和版本库里面最新版本的区别:

  • git diff HEAD -- . 查看最新本地版本库和工作区所有文件的区别
  • git diff HEAD -- [file-name] 查看最新本地版本库和工作区文件的区别
  • git diff HEAD^ -- [file-name] 查看本地上一个版本和工作区文件的区别

checkout命令

先来新建一个文件,d.txt,并推送远程

image.png

随后修改下d.txt的内容

image.png

d.txt中的领导可真是个sb是新加上的内容。突然此时我发现,这句话是凌晨两点半我胡乱写上去的,这要是搞到远程,估计要被经理一顿臭骂。那么这时候该怎么办呢,我要撤销这个地方的修改,此时就要用到git checkout 命令

git checkout -- [file-name]

  • 最好加--,没有的话就把它当作切换分支看待,切换到另一个分支了,如果没有这个分支也会把它当作文件执行。
  • 用暂存区的文件覆盖掉工作区的文件
  • 如果暂存区没有可更新的就会用commit的文件更新工作区的文件

image.png

再来查看d.txt文件,他们的修改的确都被撤销了。

image.png

reset命令

现在是凌晨两点了,我无意中修改了d.txt的内容

image.png

最要命的是我已经将它提交到了本地仓库

image.png

现在怎么办呢,这时候就可以用到git reset命令了

git reset 命令有三个参数,下面进行详细的说明
git reset --{soft|(mixed)|hard} HEAD
--soft 其中可选参数soft表示单纯的切换HEAD指向的commit-id,此操作将
保留你的修改,无论跨越几个版本,每个版本的修改都会被保留

--mixed 默认值mixed参数表示先执行上面一步,然后再将commit-id里面的
内容更新到暂存区,此操作将保留你的修改无论跨越几个版本,每个版本
的修改都会被保留

--hard hard表示先执行上面两步,然后再将暂存区内容同步到工作区,此
操作将丢弃你的修改,慎用

image.png

我们挨个进行尝试

首先git reset --mixed commitid的效果

image.png

此时咱们已经可以结合git checkout --d.txt来撤销刚才的修改了。

image.png

如果使用git reset --soft commitid

image.png

image.png

如果使用git reset --hard commitid

image.png

image.png

git reset 命令总结

  • --soft 其中可选参数soft表示单纯的切换HEAD指向的commit-id
  • mixed 默认值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等

image.png

你可以借助这个命令回到后悔的地方重新来过。

revert命令

revert代表重做,revert后面指定的版本会被视为bug版本丢弃,简单理解就是,你指定哪个版本,哪个版本的代码发生的修改就会被丢弃。

现在执行对d.txt文件的修改:

第一步:d.txt添加hhh,提交本地版本库并推送远程

Two:d.txt添加ggg,提交本地版本库并推送远程

image.png

现在git revert -n 6585f7ea4814a56fb3c178fa720494f7a64117ae 看看会发生什么
在这里插入图片描述
在这里插入图片描述
reset和revert撤回版本的比较
reset 切换版本是会删除丢弃最新的版本的,HEAD会直接跳到指定版本,但是还是可以通过reflog找回。
在这里插入图片描述
revert 会将指定的bug版本视为bug版,会将当前版本中的bug版的代码删除,生成新的commit覆盖掉当前commit,但是commit-id是不会变的。同理,你还是可以通过git reflog找回。
在这里插入图片描述