使用git的时候,总会碰到一些奇怪的报错,这里汇总一下git常见的报错信息以及解决方法
一、git 提交代码从建立本地仓库到代码提交步骤
#设置全局的名称
git config --global user.name"xxxx"
#设置全局账号
git config --global user.email"xxxxx@qq.com"
#查看配置文件 名称和账号是否设置成功
git config --list
#不成功也可执行更改命令
git config --replace-all user.name "name"
git config --replace-all user.email "123@qq.com"
#新建仓库的两种方式
#方式一: 初始化一个本地仓库,再用 pull 命令拉取代码,这样做的好处是没有项目最外一层,可直接拉取内容
#创建本地仓库
git init ;
#关联上远程仓库
git remote add origin 远程仓库地址
#查看是否关联上远程仓库
git remote -v
#拉取代码
git pull origin [远程仓库分支名]
#方式二:直接克隆远程仓库,这样会把远程仓库整个拉取下来,可不用再执行一次pull代码的命令
git clone -b 分支名称 远程仓库地址
#添加本地代码到本地存储区
git add .
#提交代码
git push origin [本地分支]:[远程分支]
#查看提交代码记录
git log
git push后各种参数的作用
//a.远程已有master分支并且已经关联本地分支local且本地已经切换local
git push
//b.远程已有master分支但未关联本地分支local且本地已经切换到local
git push -u origin/master
//c.远程没有master分支并,本地已经切换到local
git push origin local:master
当然 你也可以拉从远程仓库第一次只拉取代码,设置好账号密码后,直接
git clone 远程仓库地址
其余一些常用的命令有
git branch //查看当前所属分支
git checkout 分支名 //切换分支
//此时如果要将A分支合并 master 分支,切换到master分支 ,然后执行
git merge a ;
二 拉取远程仓库部分文件
有时我们只想要拉取远程仓库的部分文件。比如多模块项目,我们只想拉取gateway模块;或者git仓库中项目根目录包括了文档和代码,我们只想拉取代码。这时我们可以这样做。
示例:
例如chatapp_java 项目根目录下有cloud-gateway-9001、cloud-api-9002等各个模块代码,我们只想拉取并同步 cloud-gateway-9001
#初始化仓库
git init
#关联上远程仓库
git remote add origin 远程仓库地址
#开启sparse checkout功能
git config core.sparsecheckout true
#将cloud-gateway-9001/目录写入到git信息目录下的sparse-checkout文件中
echo "cloud-gateway-9001/" >> .git/info/sparse-checkout
#确认sparse-checkout文件存在,并且写入成功
cat .git/info/sparse-checkout
#拉取远程master分支
#--depth=1 用来指定克隆的深度,1表示克隆最近的一次commit。用于拉取提交次数特别多的项目效率会很快
git pull --depth=1 origin master
三 git 案例分析
git作为版本控制工具,核心的就是它灵活的分支提交回滚,下面会为大家演示一套完成的操作。从生成分支,提交分支代码,合并分支,并结合实际开发场景讲解分析。
在正式演示之前,我们先了解一下git的几个基本知识。
3.1 git 查看分支
git branch 是git 分支的主要操作指令 在其后面加上指定的参数,可以达到不同查看分支的效果
具体指令如下
指令 | 效果 |
---|---|
git branch | 查询本地所有分支 |
git branch -r | 查询远程所有分支 |
git branch -a | 查看所有分支,包括远程和本地 |
git brach -vv | 查看本地分支及其追踪的分支 |
3.3 git 新建分支
本地分支的创建主要是使用git branch 加分支名创建,对git 远程分支的所有操作基本都和 git push 指令相关名,如创建、删除远程分支等
指令 | 效果 | 示例 |
---|---|---|
git branch 分支名称 | 新建本地分支 | git branch test |
git push -u origin 远程分支名 | 将本地分支代码传递到远程仓库,并且创建远程分支 | git push -u origin dev |
一般新建远程分支,要先切换到对应的本地分支下,如要创建dev的远程分支
先新建本地分支dev git branch dev
然后切换到本地分支 git checkout dev
然后新建远程分支并追踪远程分支 git push -u origin dev
3.4 git 本地分支追踪远程分支
git 的本地分支和远程 分支有一对一的追踪关系,使用本地分支追踪一条指定的远程分支后,可以直接使用 git push指令提交记录,不需要再 使用 git push origin 远程分支
这样的操作。
我们可以使用 git branch -vv
查看本地分支和远程分支的追踪关系
3.4.1 设置追踪关系
-
使用git branch --set-upstream-to=<远程主机名>/<远程分支名> <本地分支名>
使用此种方式可以在本地分支已经追踪了某个远程分支的情况下,修改追踪的远程分支,远程分支必须要已存在
例如:git branch --set-upstream-to=origin/remote_branch your_branch
-
git push -u <远程主机名> <本地分支名>
加上-u参数,这样push时,本地指定分支就和远程主机的同名分支建立追踪关系。远程分支可以不存在
例如:git branch -u origin/dev dev
-
git checkout -b <本地分支名> <远程主机名>/<远程分支名>
新分支指针指向 <远程主机名>/<远程分支名> 所指的位置。
3.4.2 修改追踪关系
比如本地分支 test 原本追踪了 远程分支 test ,但是我想把它改为追踪 test2,以下有两种修改方式:
如果远程仓库已经存在 test2
使用git branch --set-upstream-to=<远程主机名>/<远程分支名> <本地分支名> 指令修改
如果远程仓库没有 test2
可以到 本地仓库的 .git
文件夹下 打开 config
文件。
该文件记录了本地分支和远程分支的对应关系和git远程仓库的地址,是git 非常重要的一个配置文件
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git 远程仓库地址
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "test"]
remote = origin
merge = refs/heads/test2
可以看到 [ branch “test” ] , 修改它的 merge为 refs/heads/test2 即可
3.2 git log 查看日志提交记录
指令 | 效果 | 示例 |
---|---|---|
git log | 查看本地日志 | git log |
git log orgin/[远程仓库分支名] | 查看指定远程仓库的所有提交记录 | git log origin/master |
git branch -v | 可以列出本地每一个分支的最后一次提交。 | git branch -v |
ps: 只有查看远程分支日志需要在 origin 和 远程分支名中 加一个 ‘/’
3.4 git 删除分支
指令 | 效果 | 示例 |
---|---|---|
git branch -d 本地分支名 | 删除本地分支 | git branch -d test |
git branch -D 本地分支名 | 强制删除本地分支 | git branch -D test |
git push origin 远程分支名 -d | 删除远程分支 | git branch origin test -d |
3.4 git reset 回滚历史
git reset 回滚历史有三种支持的方式,该三种方式主要的区别是 回滚到历史版本后,怎么对待你当前本地仓库的修改记录
指令 | 效果 |
---|---|
–hard | 回退到指定版本,清空所有本地修改记录 |
–soft | 回退到指定版本,本地代码恢复成已暂存 |
–mixed(默认) | 回退到指定版本,本地代码恢复成未暂存 |
3.5 业务实操
业务场景
新加一条本地分支test,回退到某个历史版本,修改完部分内容后,提交到新建的远程分支test上。
确定内容没问题后,将远程 test 和 master 合并。
#新建一个本地 test 分支
git branch test
#查询当前分支 看看是否创建成功
git branch
#切换到test
git checkout test
#查看远程仓库所有历史记录
git log orgin/[远程仓库分支名]
#将test 分支回退到指定的版本
git reset [回退方式] 提交的commit-id
#将回退后的 test 的本地分支 提交到 远程仓库(如果这时没有远程分支test会创建test,并使本地test分支关联上远程的test)
git push -u origin test
#查看所有分支(包括远程和本地)
git branch -a
#查看是否追踪到远程分支
git branch -vv
###此时你就可以在test分支上进行以前的一些代码bug等修改操作
###当你在以前的版本修改迭代了一定次数后,想把test合并提交到master
#将本地分支切换到master
git checkout master
#拉取一下master的代码,确保master当前是最新版本
git pull origin master
#将本地master分支和 test 合并
git merge test
#合并之后 提交到 master
git push origin master
#删除本地test分支
git branch -d test
#删除远程test分支
git push origin test -d
四 git 常见报错汇总
1.refusing to merge unrelated histories
git出现此问题是因为两个仓库不同而导致的,需要在后面加上–allow-unrelated-histories进行允许合并,即可解决问题
git pull origin master --allow-unrelated-histories
2.Updates were rejected because the tip of your current branch is behind its remote counterpart.
方法一:使用强制push的方法(这样会使远程修改丢失,一般是不可取的):
git push -u origin master -f
方法二:push前先将远程repository修改pull下来
git pull origin master
git push -u origin master
方法三:若不想merge远程和本地修改,可以先创建新的分支:
//创建一个新的分支
git branch [新分支name]
//第一次提交需要加 -u参数后,后面的提交就直接可以 git push
git push -u origin/[远程分支name]
3 The following untracked working tree files would be overwritten by checkout
这个报错是切换分支时,由于一些untracked working tree files引起的问题。所以只要解决了这些untracked的文件就能解决这个问题
#sourcetree 切换到终端 或者 gitbash
git clean -d -fx
4 error: failed to push some refs to
当我们想把自己本地的某个项目关联到远程仓库并推送上去,报了这个错误。这是由于我们创建远程仓库的时候,默认帮我们在仓库创建了README文件和忽略文件,并提交了,当我们想要把本地仓库和远程仓库创建连接的时候,两方都是有内容,并且没建立过联系的。这个时候你拉取,就会提示你拉取失败。
解决方法
git pull --rebase origin master
//这个时候你再上传和拉取就可以了,如再提交你的本地代码
git push -u origin master
五 git 配置 SSH
参考文章:
Git 配置 SSH 拉取代码
总结
以上就是今天要讲的内容,本文仅仅简单介绍了我遇到的git使用的问题,如有补充和问题也欢迎留言或者私信