Git使用踩坑

438 阅读9分钟

Git官网文档:git-scm.com/book/zh/v2/

Git的基本原理

上传流程

本地仓库-->暂存区-->远程仓库 代码中的git add . 其实就是将本地仓库上传的暂存区中

本地参考与远程仓库的区别

在操作命令时需要注意本地仓库与远程仓库是有区别的,以创建分支为例:创建命令一般只是在本地仓库的基础上创建一个分支,如果不进行远程的更新操作那么远程是显示不出来新建的分支。因为本地可能需要管理多个远程仓库的多个分支,难免会有重名的情况,因此才会有本地仓库不允许重名这一限定。

Git的基本操作


初次运行时的基础配置

Git config 中有着通用的配置,查看文件所在位置命令

git config --list --show-origin

注: Git会把配置的变量存储在三个不同位置,依照级别进行覆盖

配置账户和邮箱地址,使用config为全局配置,每次提交都会使用该信息,且不可更改

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

查看配置信息

$ git config --list
user.name=John Doe
user.email=johndoe@example.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

注: 可能会看到重复变量名,因为Git会从不同文件中读取同一个配置,可以使用具体的变量名来进行观察配置

$ git config user.name
John Doe

Git仓库操作命令

克隆远程仓库到本地,URL为远程仓库地址,可以为https或者SSH

$ git clone URL

提交本地代码到远程仓库,可以有两种方法:(1)在IDAEJ中的终端提交;(2)在系统端打开文件目录;推荐采用第一种方法,然后采用以下命令

git init
git add .
git commit -m "提交说明"//git push -u 仓库名 分支名 //第一次上传时需要加-u,后面就不需要了
git push -u test master

注: 当本地写了代码需要进行更新时,同样需要进行init、add和commit操作,不过在push的时候因为已经相互关联上了,所以只需要一个git push命令即可

添加远程仓库

git remote add 本地仓库别名 URL/SSH

查看目前的所有远程仓库

git remote

查看远程仓库与本地仓库的对比情况

git remote show 远程仓库的本地别名

删除仓库

git remote rm 远程仓库的本地别名

注: 这个命令好像只能删除的是本地仓库,对于远程仓库应该是无法操作的,此外当只删除远程仓库中的master时其余分支也会被保留的,需要本地手动删除

分支命令

查看当前所处的分支;加星号的就代表当前所处的分支;加上参数 -a 为查看所有分支

git branch

git branch -a 

注: 查看所有分支时,对于远程分支会增加一个/remotes前缀

切换分支

git checkout 分支名

注: checkout不会直接切换到具体分支下,而是指向head,需要使用switch命令进入到具体的分支下。切换分支时不会直接切换到远程分支的,都是在本地分支切换的。

新建分支,并切换到新建分支下

git checkout -b 分支名

删除分支

删除远程分支:

git push 远程仓库的本地别名 --delete 分支名

删除本地分支:

git branch -d 本地分支路径

注:上述命令的前提是不在当前分支路径下,若在当前分支路径下需要删除当前分支则需要将-d改写为-D,master分支除外,必须要在其他分支-D删除本地master分支

重命名分支

在Git上其实没得重命名分支这个操作,其实就是删除远程分支-->重命名本地分支-->重新提交远程分支

//重命名本地分支
git branch -m 原分支名 新分支名

注: 所处的本地分支名需要与远程分支名一致才能成功上传,如果没有事先在本地建好分支是不能够上传到任何远程仓库中的;

分支命名规范:

主分支:master

开发分支:develop 日常开发分支

临时性分支:(1)功能分支:feature 为了开发某种功能从develop上分出来,开发完成后需要再并入develop分支

(2)预发布分支:release 正式版本合并到master之前需要测试的版本,从develop上分出来,结束后合并进develop和master

(3)修补bug分支:hotfix 从Master分出来,修补结束后需要合并进Master和develop分支

版本回退与更新

回退到上一个版本:

git reset --hard HEAD^ 

合并分支

在分支合并master的过程:将master分支下载到本地,进行合并,解决冲突后上传

-- 切换到master分支下
git checkout master
-- 将master代码pull到本地
git pull
-- 修改冲突,这一步建议在IDE上进行修改
-- 提交到本地
git add .
git commit -m ""
-- 切换到自己开发的分支
git checkout 自己分支名
-- 合并master
git merge master
-- 将本地内容push到自己开发的分支
git push

注: 在进行合并操作时需要本地也要有相应的master分支代码,因此在拉取代码前也要建立相应的master分支;因为idea和控制台的问题,有时可能无法做到及时更新,因此建议最好直接在IDEA上进行操作

更新有冲突:

代码比较

在IDEA中,当前项目下右键,选择Git下的Compare with Revision 便可以比较同一分支下不同的历史提交版本之间的差别;Compare with Brach 则是比较不同分支的差别;

有时上面方法会出现问题,则可以选择使用IDEA左下角的Git小图标,然后选择不同的历史版本,在双击具体的类查看即可。

在线也可以比较如:工蜂上选择Last Commit进行不同版本的比较即可。

-- 比较不同分支的差异
git diff 分支1 分支2 --stat
-- 比较差异并显示出详细信息
git diff 分支1 分支2 

注: 对于不同的分支代码比较,建议选择idea,展示的代码比较详细

关联分支

一般情况下,当在本地执行远程下载命令后,那么本地分支就会自动与远程分支相互关联,这也是为什么在远程创建新的分支时候必须要先在本地创建分支,然后才能提交,但有时候想解除关联操作,让自己的分支与其他分支建立联系(一般不要这样做,本地分支与远程分支是相对应的,更换说明没有对应好)

-- 查看本地分支与远程分支的关联关系
git branch -vv
-- 解除当前分支与远程分支的关联关系
git branch --unset-upstream
-- 增加当前分支与远程分支的关联关系
git branch --set-upstream-to 本地仓库名/远程分支名

注: 虽然本地分支可以与远程分支不同名,但是这样不利于后续的查看,最好不要这样做

添加.ignore

注意: 无法直接添加.ignore文件,需要先在idea中添加.ignore插件才可以右键新建.ignore文件

上传到项目中的代码有些是需要去除的,如target文件、编译时生成的一些文件,因此需要指定git在上传时排除一些文件,下面给出了一些排除,目前感觉还是比较全的,在实际使用的时候还需要根据具体情况增加或者删除一些语句

# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

#maven
target/
dependency-reduced-pom.xml
pom.xml.versionsBackup
.factorypath

out/

# Gradel
.gradle/
build/

# IDEA
.idea/
*.ipr
*.iml
*.iws

# temp ignore
*.log
*.cache
*.diff
*.patch

当.ignore文件是在项目一开始创建的时候就已经指定好了排除的文件,那么直接上传的远程即可;但如果是在项目已经执行上传命令后(其实这里也不一定是上传,只要项目在本地被缓存过后就可以了),那么本地缓存中将会保存多余的文件,此时再指定ignore重新生的项目不会把原来多余的文件删除,因此需要先清除本地缓存,再重新提交

git rm -r --cached .
git add .
git commit -m "更新.gitignore"

当正确进行上述操作后可以发现,一些不会被上传的文件会有不同的颜色。

小操作

保存当前工作

使用场景:在当前分支下做了功能的添加,但是发现当前分支在功能未添加前有一些问题要处理,如果回退到当前分支最初始的版本那么新写的代码就浪费;如果保存提交,因为是新增功能前的问题,很有可能对现有的代码造成影响,提交后就很有可能出问题,这就成为了脏提交。-- 解决方法:本地保存现有的工作进展,但并不提交,修改完问题后,再回来接着写

-- 保存现有的工作进展不提交
git stash
-- 记录版本信息,方便回述
git stah save "描述信息"
-- 查看保存列表
git stash list
-- 恢复以前缓存的工作,这个命令会删除缓存在堆栈中的第一个stash
git stash pop
-- 删除指定的stash
git stash "名字" drop

IDEAJ与Git联系

1、需要对本地的项目执行pull或者对分支进行push操作时,记得要注意所在的命令执行目录是自己相关联的目录,不然会执行不成功的;

2、从Git上clone项目到本地并打开时,注意需要设置JDK版本,否则程序无法运行的。设置的时候,选择File下的清楚缓存重启命令,重新打开后就自动设置了,如果不这样好像由于Idea自身的原因,系统中虽然查到设置了但是其实没有设置。

IDEA插件安装

AI自动补全代码:TabNine

DAO与.xml文件来回跳转:Free MyBatis plugin