当前位置:   article > 正文

git使用手册

git使用手册

工作流程简述

在这里插入图片描述
在这里插入图片描述

git基础命令

初始化本地仓库(init)

  • git init(在需要进行仓库化的文件夹内执行,一般为空文件夹)

查看修改的状态(status)

  • git status查看工作区和暂存区的文件状态,一旦文件被git commit提交至本地仓库则该命令查不到

添加工作区到暂存区(add)

  • git add将未跟踪或者被跟踪修改后的文件添加入暂存区,具体使用:git add 文件名或git add .(.表示添加所有文件)

提交暂存区到本地仓库(commit)

  • git commit -m “提交信息”
  • 注意:commit之前需要全局设置用户名和邮箱,这个是记录提交者的信息,可以随便写但一定要写不然无法提交(具体操作百度即可)

查看commit提交日志(log)

在这里插入图片描述
直接使用:git log --pretty=oneline --abbrev-commit --all --graph即可,可以实现和idea的线路图差不多的效果

具体演示:
在这里插入图片描述
注意:如果add进暂存区的文件被修改了,他的status也会变成红色,操作同上继续add再commit,这样查询git log就会有两次提交记录了,如下:
在这里插入图片描述

版本回退(reset)

  • 命令形式:git reset --hard commitID
    • commitID可以通过git log(git log --pretty=oneline --abbrev-commit --all --graph)命令查看,用括号内的命令执行,他的id显示开头部分但是可以 使用的不需要整串id
  • 注意1:这个版本回退并不会将版本删除掉,本质是切换版本,如果执行后后悔了可以再次执行该命令更换commitID切换回去
  • 注意2:如果切换版本后执行了清除控制台看不到之前用log打出来的commitID号,可以使用git reflog查看之前的所有操作也会显示commitID,具体演示如下:
    在这里插入图片描述
    在这里插入图片描述

分支branch

查看本地分支

  • git branch(也能看到当前使用的分支,会有箭头表示)

创建分支

  • git branch 分支名称
  • 注意:创建分支创建出来和它的主分支是一模一样的(包括提交记录log等都是可以查看得到的)

切换分支

  • git checkout 分支名(这里要求分支必须存在)
  • git checkout -b 分支名称(创建分支并切换到该分支)

具体操作:
在这里插入图片描述

合并分支(merge

  • git merge 分支名称
  • 具体操作:接着上面切换到的dev分支,在dev分支中创建一个456.txt文件夹并提交到本地仓库,然后切换回去主分支master,主分支中没有这个额456.txt文件,我们需要把他合并到master中,则执行git merge dev,如下所示:
    在这里插入图片描述
    这样master分支也有了这个456.txt文件了。

删除分支

  • git branch -d 分支名称(删除分支时需要各种检查)
  • git branch -D 分支名称(强制删除,不检查)

解释:假设有master分支和它的子分支dev01,我们在dev01上创建或者修改某些文件并add然后commit到本地仓库,此时还没有和master分支进行merge合并操作,当执行删除dev01分支是,git会认为你是误操作,所以会提示你,如果仍然需要删除执行第二个命令即可

解决冲突

该章节演示的为本地仓库多分支合并情况下的冲突问题,一般情况下开发人员克隆远端开发分支后会创建自己的功能分支,后续的开发都提交至远端功能分支,所以实际开发中在开发人员的本地仓库不会出现冲突(因为本地功能分支根本就没有进行merge操作,提交也是提交到远程仓库的功能分支),经过CodeReview之后在远程仓库中将功能分支合并入开发分支时可能出现冲突(这个和本章节的本地解决冲突一个道理【因为发生冲突是由远程仓库中的功能分支和开发分支合并引起的,和本地的两个分支合并出现冲突是一样的】-冲突问题还可参考下面的远程解决冲突章节)
当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时候就需要手动解决冲突,解决步骤如下:

  • 处理文件中冲突的地方
  • 解决完冲突的文件加入暂存区(add)
  • 提交到仓库(commit这里执行commit可以不指定-m修改信息)
    说明:现在dev分支和master是一模一样的,我们将dev分支的123.txt内容从qee修改为qqq,将master分支的123.txt文件内容修改为eee,两者都提交到本地仓库,然后切换到master分支执行合并git merge dev,此时会出现自动合并失败,在master分支中打开123.txt文件会变得不一样(两个123.txt的内容合并在一起了,手动删除掉不需要的保存即可),然后手动合并后的123.txt执行add和commit后再次执行git merge dev(可能会进入一个vi编辑界面无需操作直接退出即可)合并成功
    在这里插入图片描述
    在这里插入图片描述
    ===是隔开符号便于区分查看,<<<下的是master的内容,>>>上的是dev的内容

真实开发中分支的使用

常规下:

  • master主分支:和生产服务器上跑的代码一致
  • sit测试分支:master的子分支
  • dev开发分支:sit的子分支
  • feature功能分子:dev分支的子分支,各个开发人员统一创建开发功能,通过CodeReView后合并到dev分支,后续没用了可以删除这个分支
  • 特殊:hotfix快速修复分支,生产出现问题直接在master分支下创建子分支快速开发后合并到master和dev两个分支,然后可以删除
  • 这个分支规范具体看公司要求即可

远端仓库origin

执行本章节的前提是在gitee上创建一个远程仓库(空白的,主分支都没有的)

关联远程仓库

  • git remote add origin <远程仓库路径>
    • remote固定字段,和远程仓库相关操作的都会加上这个
    • origin是远端名称,就写这个基本不可能有别的情况
    • 仓库路径填写ssh,http的都可以
      说明:该命令作用是指定本地仓库对应的远程仓库,起到绑定作用,因此后续对origin的操作就是操作远程仓库

查看远程仓库

  • git remote(查看绑定的远程仓库,绑定了上一步就能查出origin)

推送到远程仓库

  • 命令:git push [-f] [–set-upstream] [远端名称 [本地分支名][:远端分支名]],示例:git push origin master:master

    • 如果本地分支名和远程分支名是一致的可以省略远端分支名称,示例:git push origin master
    • -f是强制推送的意思,会覆盖远端上面的代码(不建议使用,一般开发人员也没有权限使用)
    • –set-upstream是第一次推送时关联当前分支和远端分支,假设在dev分支上第一次push通过这个执行之后dev分支的push推送直接写git push即可,此命令有缩写可直接写为-u。之后如果想查看本地分支和远端分支的关联关系可以使用git branch -vv(一般不会用因为远端分支和本地分支都是一一对应一模一样的)
    • 本地仓库推送的不只是代码文件,所有的commit提交信息也会被提交上去,在远端仓库可以查看之前的commit记录

从远程仓库克隆clone

  • 克隆到本地仓库
  • 命令:git clone <仓库路径>

抓取和拉取

在这里插入图片描述

  • git pull等与git fetch+git merge

远程解决冲突(重点)

在实际开发中存在着另外一种情况,也就是远程仓库中只有开发分支没有功能分支,开发人员将远端开发分支克隆下后不需要创建功能分支直接进行修改,那么这时候假设有两个开发人员a和b同时克隆了开发分支,他们两对同一个文件123.txt文件的同一处地方进行了修改,下面分情况讨论:

  • a修改后比b先推送到了远程仓库,b在克隆修改后没有执行git pull拉取最新远端代码而直接push推送远程仓库,此时会提示push失败并提示你push前使用git pull
    在这里插入图片描述

  • a修改后比b先推送到了远程仓库,b在克隆修改后在push之前先执行了pull拉取操作,由于pull中包含了 merge合并操作,此时会提示自动合并是失败需要手动解决冲突,在这里插入图片描述
    这时123.txt文件会变成包含<<<===>>>内容的东西在这里插入图片描述
    ,这是git提示你需要手动解决冲突,此时手动修改这个文件(具体解决参考上述的本地解决冲突)并再次执行add->commit->push操作即可提交成功。

  • 因此可以得出在代码push推送前我们需要先pull拉取最新代码手动解决冲突

IDEA使用git

IDEA配置git

打开settings搜索git,在右侧选择git安装目录下的git.exe文件并点击Test测试,成功后点击apply保存即可

commit&push

通过实际操作展示

  • 首先在gitee上创建一个空白仓库(master分支都没有的空白仓库)
    在这里插入图片描述
    在这里插入图片描述
  • 在本地新建一个文件夹(这里新建一个空白的maven项目展示)
    在这里插入图片描述
  • 初始化本地仓库后,工作区的文件变为红色(意思是没有加入版本控制,需要进行git add操作)
    在这里插入图片描述
    这里做解释:IDEA弱化了add概念,将下图红色区域归类为未跟踪也就是工程里红色名称的文件,一旦文件进行了add操作加入了暂存区在IDEA中会显示为绿色,修改已有的文件会直接进入暂存区无需手动add操作,但文件名称为蓝色
    在这里插入图片描述
  • 此时点击IDEA右侧的commit或者右上角绿色的√,会出现如下:
    在这里插入图片描述
  • 这里我们点击Commit
    在这里插入图片描述
  • 然后我们点击右上角的绿色↗(git push)将本地仓库内容push到远程仓库
    在这里插入图片描述
    在这里插入图片描述
  • 此时观察到gitee远程仓库已有一条master分支和我们push上去的项目工程
    在这里插入图片描述
  • 将工程代码做一处修改,可以发现文件变成了蓝色
    在这里插入图片描述
  • 再次点击右侧commit选择修改过的文件输入提交信息[修改代码20231121],执行commit->push操作再次查看log,可看到历史提交信息
    在这里插入图片描述
  • 刚才忘记提交pom.xml文件了,被.gitignore文件忽略了,这里补上,提交信息更新为
    在这里插入图片描述

clone&pull(fetch+merge)

  • 完成上面的操作后我们点击如下操作克隆一份远程仓库代码
    在这里插入图片描述
    在这里插入图片描述

  • 注意克隆下来的代码和之前那份是一模一样的,他们的log也是一模一样的,都会有完整的提交信息

  • 接下来演示push的冲突解决,首先在git-test工程的App.java中随意添加几行代码
    在这里插入图片描述
    执行commit->push操作提交远程仓库,提交信息为[git-test修改App.java文件]
    此时在git-test工程中的git log能查看到最新修改App.java的提交信息,而git-test1工程是看不到的,那么这个时候git-test1工程把App.java文件也做相同的修改如图:
    在这里插入图片描述
    执行commit->push操作提交远程仓库,提交信息为[git-test1修改App.java文件]
    在这里插入图片描述
    这里是因为远程仓库代码以及被git-test工程刚才的提交修改了,提示你需要先合并手动解决冲突后再提交,这里我们选择Merge合并:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    点击Apply之后,App.java文件恢复正常,变为白色,此时无需commit直接push即可推送到远程仓库,此时log变化为:
    在这里插入图片描述
    这个时候再切换到git-test工程执行pull即可获取最新代码和git-test1保持一致
    在这里插入图片描述

  • 总结:在每次需要push代码之前先点击蓝色pull按钮获取远端服务器最新代码由于pull=fetch+merge,所以会在这里可以进行手动代码合并,合并之后再push就不会出现推送被拒绝的情况了

分支操作

![在这里插入图片描述](https://img-blog.csdnimg.cn/57b690e8659b4d69a4d6aa73da46ca6b.png
IDEA右下角会显示当前分支,点击展开能看到三个栏位,Recent、Local、Remote,分别对应的是最近使用、本地分支、远程分支。选择想要拉取得远程分支点击cheackout即可拉取并切换,在对应位置右键可以新建分支

一些IDEA常用的操作

pull更新时报错master has no tracked branch

具体场景:一般是在gitee上创建仓库时创建了master分支后自带两个readme文件(手动在gitee上创建文件都会出现该问题),此时如果工程不是克隆下来的,而是通过在本地创建文件夹Create Git Repository初始化后的空白工程,在pull时会出现改报错,是因为远程厂库有提交的文件,本地仓库和远程仓库没有关联git认为这两仓库没有关系
解决:

  • 方式一:控制台输入git branch --set-upstream-to=origin/master后即可进行pull操做,这里的意思是关联远程分支master------------>推荐使用
  • 方式二:点击IDEA消息提示如下操作进行关联跟踪分支------------>推荐使用
    在这里插入图片描述
  • 方式三:控制台输入git pull origin master --allow-unrelated-histories ,这个是在pull动作的时候允许不相干的分支合并的意思,因为没有设置关联关系后续每次pull都会出现这个报错不推荐使用

当前代码未提交需要切换其他分支

具体场景:当前分支代码未提交时IDEA是不允许直接切换分支的如果强行切换会导致未提交的代码消失,因此可以使用git stash(git的命令)和shelve(IDEA的工具)解决

  • stash操作
    在这里插入图片描述
    在这里插入图片描述

选择需要暂存的文件如图点击填入暂存信息,之后文件会变为修改之前的效果,但是已经把修改的内容存入内存了,此时可以切换分支,后续操作完成切换回来该分支UnStash操作还原之前的代码:
在这里插入图片描述
在这里插入图片描述
**注意:**切换回来暂存了内容的分支后如果没有UnStash操作直接写代码后再UnStash会报错提示恢复将会覆盖你写的内容所以不能操作。

  • shelve操作
    在这里插入图片描述

在这里插入图片描述
Unshelve恢复代码
在这里插入图片描述
这里恢复代码和上述的stash的注意部分的区别在于如果这里恢复出现冲突会提示让你手动解决,所以功能更强大推荐使用

Cherry-Pick(推荐使用)

  • 该功能用于合并其他分支某次提交的内容(注意是某次提交,和merge分支的区别在于merge分支是将所有提交都合并进来)
  • 具体使用打开git log线网图,选择需要合并的某个分支节点右键然后点击Cherry-Pick,有冲突的地方会提示手动合并,之后可commit->push
  • **使用注意:**在你点击Cherry-Pick时已经将代码合并,如果合并的那次提交有不想要的文件也会被合并进来,解决办法是不要使用它弹出提示的提交(也就是先不提交),在左侧栏的Commit中将那些加入暂存区不想要的文件选中右键点击Rollback会将这些文件移出版本控制变为红色:
    在这里插入图片描述
    这里的Delete local copies of added files可以勾选(会将这些移除出控制的文件直接在本地删除),点击Rollback即可,然后保留下的需要的代码直接commit->push即可

Reset Current Branch to Here(git reset --hard)

  • 在IDEAl的log界面右键点击之前的节点选择Reset Current Branch to Here可切换版本
  • 这个命令能够切换到其他分支上的东西,所以也不太清楚为啥(尽量切换自己的分支)
  • 此处引用其他博主优秀文章补充:参考链接

Undo Commit&Revert Commit&Drop Commit

  • 这个的作用是删除commit操作回到commit之前的三个命令,建议使用Undo Commit,慎用Drop Commit
  • 删除的只是commit记录,如果能在日志看到commitID还是能还原
  • 此处引用其他博主优秀文章补充:参考链接
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/600280
推荐阅读
相关标签
  

闽ICP备14008679号