常用git命令

文章目录

  • 一.git 简介
  • 二、git 基本知识
    • 2.1 git 关键字
    • 2.2 git 文件的四种状态
  • 三、创建一个gitee仓库并下载
    • 四.git常用命令
    • 4.1 status add commit push代码提交、推送命令
      • status命令
      • add 命令
      • Commit 命令
      • push命令
    • 4.2 git checkout reset revert (撤销修改、撤销提交的命令)
      • log 命令
      • diff 命令
      • checkout命令
      • reset命令
      • reflog命令
      • revert命令
    • 4.3 git分支
      • git分支基本命令
      • git解决冲突
      • stash命令
  • 总结

一.git 简介

Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人员也可以用。
Git 来做自己的文档版本管理工具。 Git 的api很多,但其实平时项目中90%的需求都只需要用到几个基本的功能即可,所以本文将从实用主义去谈如何在项目中使用 Git,一般来说,看完这一节就可以开始在项目中动手用。
如果我回到当初,开始学习java的时候,git绝对是我最急迫要学习的东西之一了。Java程序员的核心技能之一就是提供服务能力,服务能力说白了还是代码,服务想要顺畅提供能力,必然少不了我们对代码的管控和维护,那么git就显得尤为重要,毕竟它是当今最先进的分布式版本控制系统。

二、git 基本知识

2.1 git 关键字

  • HEAD 当前版本的指针,当切换本地版本的时候会快速指向指定版本文件
  • master git为我们创建主分支
  • origin 远程仓库的名称

2.2 git 文件的四种状态

常用git命令_第1张图片

  • 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仓库并下载

按照箭头提示初始化一下仓库,点击创建即可
常用git命令_第2张图片
下载代码到本地
常用git命令_第3张图片
本地随便找个地方新建一个文件夹,使用git clone将仓库初始化下载
常用git命令_第4张图片

四.git常用命令

4.1 status add commit push代码提交、推送命令

status命令

git status [file-name] 查看指定文件状态
git status 查看所有文件状态

 一般在工作中使用的都是git status命令,便于我们快速定位文件的状态.现在我们在
 git-study目录下新建一个a.txt文件,然后git-study目录下右键点开Git Bash Here,
 执行git status查看文件状态.显然当前文件属于Untracked文件,这时候就要用到add命令了

常用git命令_第5张图片

add 命令

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

常用git命令_第6张图片
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命令_第7张图片

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

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命令

a.txt文件目前已经在本地仓库中,实际工作中当然得推送到远程仓库才行,这样才算是完整地
完成了一个分支上从本地到远程的代码维护。从上面commit之后的提示也能看出来,我们需要
将代码推送至远程。
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

这边利用git push -u origin master进行推送。-u表示本次需要本地和远程进行联系。
常用git命令_第8张图片
推送完成之后再次查看状态,本地和远程已经完全同步了。
下一次的push可以不再使用-u参数,我们改下a.txt文件的内容
常用git命令_第9张图片
再推送一次
常用git命令_第10张图片
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命令_第11张图片
很清晰,我们一共执行过两次提交。如果你觉得这个显示不够简洁,可以在git log后面加上–pretty=oneline 这样提交记录就会变成一行显示了.
在这里插入图片描述

diff 命令

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

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

checkout命令

先来新建一个文件,b.txt并推送远程
常用git命令_第12张图片
随后修改下a.txt、b.txt的内容
常用git命令_第13张图片
a.txt中xxx和b.txt中的www是新加上的内容。突然此时我发现,这两句话是凌晨两点半我胡乱写上去的,这要是搞到远程,估计要被经理一顿臭骂。那么这时候该怎么办呢,我要撤销这两个地方的修改,此时就要用到git checkout 命令
git checkout -- [file-name]

  • 最好加--,没有的话就把它当作切换分支看待,切换到另一个分支了,如果没有这个分支也会把它当作文件执行。
  • 用暂存区的文件覆盖掉工作区的文件
  • 如果暂存区没有可更新的就会用commit的文件更新工作区的文件
  • 常用git命令_第14张图片
    再来查看两个文件,他们的修改的确都被撤销了。
    常用git命令_第15张图片

reset命令

现在是凌晨两点了,我无意中修改了a.txt的内容
常用git命令_第16张图片
最要命的是我已经将它提交到了本地仓库
常用git命令_第17张图片
现在怎么办呢,这时候就可以用到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命令_第18张图片
如果使用git reset --soft commitid
常用git命令_第19张图片
如果使用git reset --hard commitid
常用git命令_第20张图片
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等
常用git命令_第21张图片
你可以借助这个命令回到后悔的地方重新来过。

revert命令

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

现在执行两个对文件的修改
One:a.txt添加一个字母h,提交本地版本库并推送远程
Two:b.txt添加一个字母g,提交本地版本库并推送远程
常用git命令_第22张图片
现在git revert -n 6585f7ea4814a56fb3c178fa720494f7a64117ae 看看会发生什么
常用git命令_第23张图片
常用git命令_第24张图片
reset和revert撤回版本的比较
reset 切换版本是会删除丢弃最新的版本的,HEAD会直接跳到指定版本,但是还是可以通过reflog找回。
常用git命令_第25张图片
revert 会将指定的bug版本视为bug版,会将当前版本中的bug版的代码删除,生成新的commit覆盖掉当前commit,但是commit-id是不会变的。同理,你还是可以通过git reflog找回。
常用git命令_第26张图片

4.3 git分支

分支是git最有魅力的概念之一了,在公司里,代码的master分支一般是不允许再上面直接做修改的,因为master分支一般都会直接像生产环境
提供服务。所以它的管理和维护显得异常重要。如果现在你和你旁边的同事正在维护相同的一个微服务user,他要开发用户登录功能你要开发
用户的注册功能,这时候一个最清晰的做法就是你们都基于user的master分支各自建立自己的分支,代码写好之后再merge到user的
master分支。
Git鼓励我们大量使用分支!

之前我们的操作一直在master分支进行,现在基于master创建dev分支并切换到dev分支
常用git命令_第27张图片
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
git branch dev
git checkout dev

然后,用git branch命令查看当前分支:
常用git命令_第28张图片
现在我们在dev分支对a.txt做修改,并且提交到dev分支。
常用git命令_第29张图片

之后回到master分支,并且merge dev分支所做的修改
常用git命令_第30张图片

git分支基本命令

总结下git 分支的基本命令
查看分支:git branch
创建分支:git branch
切换分支:git checkout 或者git switch
创建+切换分支:git checkout -b 或者git switch -c
合并某分支到当前分支:git merge
删除分支:git branch -d

git解决冲突

在分支合并的过程中出现冲突是很正常的事情,现在做这么一件事情
首先,还是回到咱们的dev分支,将最后一行改为下图所示
常用git命令_第31张图片
执行commit的动作
常用git命令_第32张图片
然后切换回master分支,将最后一行改为
常用git命令_第33张图片
同样执行提交
常用git命令_第34张图片
然后在master分支尝试执行对dev分支的合并
在这里插入图片描述
冲突的a.txt文件现在的内容是:
常用git命令_第35张图片
将文件的冲突修改掉
常用git命令_第36张图片
然后将a.txt进行提交
常用git命令_第37张图片
git log --graph可帮助我们查看分支的合并情况
常用git命令_第38张图片

总结
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图。

stash命令

如果某次分支切换时,例如要从deva分支切换到master分支,此时deva上你改了部分文件,但是你还没改好不想commit,那么要注意,
如果直接切换到master分支会将修改带到master分支,这显然不是你想看到的,这时候就需要git stash命令。先来演示一下刚说到
的情况

基于master创建分支devd,然后在a.txt文件加一行
常用git命令_第39张图片
此时直接切换到master,发现发生于devd未提交的修改直接被带了过来
常用git命令_第40张图片
我们将master以及deva的修改都提交,然后切换到devd分支,再添加一行,不同的是这次我们使用git stash 隐藏修改细节,再切换回master。
常用git命令_第41张图片
切换到master分支
常用git命令_第42张图片
之后咱们再次切换回devd分支,利用git stash list可以看到你的git隐藏列表。此时怎么找到被你隐藏的修改呢,此处有两种方式
第一种,使用git stash pop,此种方式不仅帮助你复现修改,而且会将stash的记录删除掉
第二种,git stash apply stash@{X}这个操作会帮助你复现,但不会将stash记录抹除掉,你需要执行git stash drop stash@{X}手动抹除
体验下第一种
常用git命令_第43张图片
第二种就不再进行演示,感兴趣的可自己试一下,可以多次stash,但是容易引起冲突!

总结

以上的git命令足够支撑工作中大部分需要使用git的场景了。建议多写一些,毕竟孰能生巧。愿各位看官看的高兴。有收获的话给点个关注哦,哈哈。

你可能感兴趣的:(工具,git)