Git入门学习到进阶3
[toc]
0x00 参与开源项目
但是在GitHub上,利用Git极其强大的克隆和分支功能,广大人民群众真正可以第一次自由参与各种开源项目了。
如何参与一个开源项目呢? 比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页https://github.com/twbs/bootstrap,点“Fork”就在自己的账号下克隆了一个bootstrap仓库然后从自己的账号下clone:
git clone git@github.com:michaelliao/bootstrap.git
一定要从自己的账号下clone仓库,这样你才能推送修改
。如果从bootstrap的作者的仓库地址git@github.com:twbs/bootstrap.git克隆,因为没有权限你将不能推送修改。
如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request(推送属性请求),当然对方是否接受你的pull request就不一定了。
WeiyiGeek.pull request
0x01 进阶使用
清理 git log 日志
描述:就是创建一个新的分支,并将项目git commit然后再新建立分支上删除master分支,之后并当前分支更名为master分支,最后git push即可;
清理Git的Log流程:
#创建临时分支
git checkout --orphan tmp
#添加所需提交的文件
git add -A
#添加commit信息
git commit -m "Clean Log"
#删除master分支
git branch -D master
#更名分支
git branch -m master
#提交新的master分支代码
git push -f origin master
git push --set-upstream origin master #将远程仓库设置为从“origin”跟踪远程分支“master”。
#查看日志记录就能看见(数量上的变化)
$ git log
commit b50b234422d6be2fb1af3551d9af2654f28de25f (HEAD -> master, origin/master, origin/HEAD)
Author: WeiyiGeek <weiyigeek@qq.com>
项目同时推送github和gitee(多个仓库配置)
Q: git能否支持一个项目同时推送到gitee和github或者其它代码仓库中呢? 答案: 当然是YES的,可以参照如下进行配置。
操作流程(f方法1):
# 方式1:打开每个项目的.git文件夹下的config文件,但是需要手动指定源拉取或者上传
[remote "gitee"]
url = git@gitee.com:WeiyiGeek/test.git
fetch = +refs/heads/*:refs/remotes/gitee/*
tagopt = --no-tags
# 或者命令行
git remote add gitee git@gitee.com:WeiyiGeek/test.git
git remote -v #执行后可以看见可看到两个仓库
#需要注意,此时推送代码时需要对两个仓库分别执行一次push命令
git push
git push gitee master --all
git push gitee master --tags
操作流程(方法2-推荐方法,一次性push上传):
#方式2.我们可以更改.git下的config文件为
[remote "origin"]
url = git@github.com:WeiyiGeek/test.git
fetch = +refs/heads/*:refs/remotes/origin/*
url = git@gitee.com:WeiyiGeek/test.git
# 或者执行git远程仓库的添加命令
git remote set-url --add origin git@gitee.com:WeiyiGeek/test.git
# 查看远程仓库地址是否添加成功
git remote -v
#此时只需执行一次push即可同时推送多个仓库。
git push origin master -f
两种方法的对比:
- 方式1.可以对任意仓库进行pull或者push
- 方式2.默认只能从config中的第一个url内的仓库pull代码
- 总之一句话:pull代码的话配置1更方便,push代码的话配置2更方便
注意事项: 如果推送的非标准的22端口需要如下配置
[remote "gitlab"]
url = ssh://git@gitlab.weiyigeek.top:2222/WeiyiGeek/blog.git
fetch = +refs/heads/*:refs/remotes/origin/*
# 验证
> ssh -i ~/.ssh/id_develop -T ssh://git@gitlab.weiyigeek.top:2222
Welcome to GitLab, @WeiyiGeek!
# 指定密钥拉取与上传
> ssh-agent zsh
> ssh-add ~/.ssh/id_develop
# Identity added: /home/weiyigeek/.ssh/id_develop (master@weiyigeek.top)
weiyigeek@Ubuntu-PC:~/develop/github-project
> git clone ssh://git@gitlab.weiyigeek.top:2222/WeiyiGeek/blog.git
# 正克隆到 'blog'...
# remote: Enumerating objects: 3839, done.
# remote: Counting objects: 100% (3839/3839), done.
# remote: Compressing objects: 100% (1527/1527), done.
# remote: Total 3839 (delta 1824), reused 3839 (delta 1824), pack-reused 0
# 接收对象中: 100% (3839/3839), 23.15 MiB | 11.33 MiB/s, 完成.
# 处理 delta 中: 100% (1824/1824), 完成.
修改 commit 历史
使用 git rebase 进行历史修改,假定修改最近 3 条历史,操作步骤如下:
git rebase -i HEAD~3
运行此命令会提供一个提交列表,如下所示其中 commit 记录是时间逆序排列的;
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
# Rebase 710f0f8..a5f4a0d onto 710f0f8
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
编辑上述列表文件,在需要更改的 commit 前,将 pick 修改为 edit
,如果需要压缩可设置为 squash 保存退出,进入到 rebase 流程;
通过git commit --amend --author
对历史记录依次修改和持续进行 rebase
删除所有 commit 中的某些文件
# 删除文件
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch -r build' --prune-empty --tag-name-filter cat -- --all
# 触发 GC
git reflog expire --expire=now --all && git gc --prune=now --aggressive
拉取 commit 最近一次分支
我们可以采用如下方法克隆的项目,只拉取包含最近的一次commit的主分支或者次其它分支。
# depth 用于指定克隆深度,为1即表示只克隆最近一次commit.
$ git clone --depth 1 https://github.com/weiyigeek/xxxxxxx.git
# 设置远程其它分支
$ git remote set-branches origin 'remote_branch_name'
# 拉取远程其它分支最近的一次commit代码到本地
$ git fetch --depth 1 origin remote_branch_name
# 切换到拉取的指定分支
$ git checkout remote_branch_name
如何撤销git ommit操作
描述: 通常在远程代码仓库中有修改吗,同时本地有修改并且已经commit, 假如我们在git commit之后想撤回commit,怎么办?
# 例如.添加修改过的文件到暂存区并把所有文件从暂存区提交进本地仓库。
git add .
git commit -m "本功能全部完成,将提交进本地仓库"
# 执行完commit后,想撤回commit,怎么办?
# 回退到上一个版本, 当然如果想回退第n次可以使用HEAD~n。
# --soft : 不删除工作空间改动代码,撤销commit,不撤销 git add .
git reset --soft HEAD^
# --mixed : 不删除工作空间改动代码,撤销commit,并且撤销 git add . 操作
git reset --mixed HEAD^
git reset HEAD^ # 与上效果一致
# --hard : 删除工作空间改动代码,撤销commit,撤销git add . 操作(执行时慎重)
git reset --hard HEAD^
温馨提示: 如果只是commit注释写错了,只是想改一下注释,只需要执行git commit --amend
, 此时会进入默认vim编辑器,修改注释完毕后保存就好了。
0x02 Git入坑障碍解决
问题1.pull origi.error: The following untracked working tree 解决方法:
#方案1:
git clean -d -fx ""
#选项解释
x -----删除忽略文件已经对git来说不识别的文件
d -----删除未被添加到git的路径中的文件
f -----强制运行
#方案2:如果希望保留生产服务器上所做的改动,仅仅并入新配置项:
git stash
git pull
git stash pop
git diff -w +文件名 #来确认代码自动合并的情况.
#如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:
git reset --hard
git pull
#方案3:第1个问题:解决GIT代码仓库不同步
git checkout -f #撤销在工作区里面的更改
git pull
问题2.git提交被拒绝,提示non-fast-forward
#解决方法(1):
git fetch origin debug #获取远程分支debug的修改
git merge origin debug #合并远程分支debug
git pull origin debug #更新本地分支
#解决方法(2):在远程仓库相比现在本地仓库为主的情况下强制推送
git push -f origin debug
问题3.git升级安装太慢以及报错SSL Timeout 解决办法:
#1.官网下载安装git最新版本(太麻烦不建议)
#2.采用V**进行访问国外网站更新git版本,采用 git update-git-for-windows 命令进行升级;
#3.采用host进行本地绑定git更新地址 github.global.ssl.fastly.net,然后采用git update 进行升级即可;
在/etc/hosts文件中加入 151.101.229.194 github.global.ssl.fastly.net
问题4.拷贝已在Github中注册的公钥拷贝到其它服务器上进行连接Github测试 问题描述:
$ssh -T git@github.com
Warning: Permanently added the RSA host key for IP address '13.250.177.223' to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for '/root/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/root/.ssh/id_rsa": bad permissions
Permission denied (publickey).
原因:由于我们上传到服务器中的公钥和密钥的默认权限是644,权限较高所有的用户均可读取这在ssh中是不允许的;
解决办法:
$ chmod 600 *
$ echo -e "yes" | ssh -T git@github.com
Hi WeiyiGeek! You've successfully authenticated, but GitHub does not provide shell access.
问题5.使用新密钥时执行 git clone 或者 push 时报The authenticity of host 'github.com (192.30.255.112)' can't be established.
解决方法。
问题描述:
The authenticity of host 'github.com (192.30.255.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? //输入yes,回车
解决办法: 在随后的提示中输入yes则会在~/.ssh/
目录下生成一个known_hosts
文件, 或者将(rsa-兼容性较强)新密钥重新加入到Gitlab或者Github仓库中。
问题6.执行git pull命令同步仓库时报Your local changes to the following files would be overwritten by merge
错误
问题描述:
error: Your local changes to the following files would be overwritten by merge:
Please commit your changes or stash them before you merge.
问题原因: 由于本地代码修改过与remote仓库中代码文件不一致, 导致不能强制更新本地修改。
解决办法:
# 方式1.使用remote仓库中的代码合并本地代码
$ git stash # 暂存当前正在进行的工作。
$ git pull origin master # 拉取服务器的代码
$ git stash pop # 合并暂存的代码
# 方式2.使用remote仓库中的代码覆盖本地代码
$ git reset --hard
HEAD is now at 82aa31c baidu
$ git pull origin master
From gitee.com:WeiyiGeek/weiyigeek
* branch master -> FETCH_HEAD
Updating 82aa31c..e7a451c
Fast-forward
index.html | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
问题7.执行git pull命令时报 fatal: refusing to merge unrelated histories
错误
问题描述: 在本地创建的仓库与Github上的创建的仓库进行关联,当进行git pull时提醒fatal: refusing to merge unrelated histories
。
问题原因: 上网查到原因是两个分支是两个不同的版本,具有不同的提交历史
解决办法: 允许不相关历史提并强制合并。
$ git pull origin master --allow-unrelated-histories
相关文章
- Git的下载方法+版本控制器以及SVN与GIT的区别
- Git 学习(二)---- 分支及协作开发
- Git入门学习到进阶2
- Git分布式版本控制工具学习(四)
- git 报错Git fatal: Unknown index entry format xxxxx的错误解决方法
- Visual Studio (VS2017)提交代码到Git服务器流程(GitCode)
- git学习笔记
- git 删除某次指定的提交
- git使用笔记
- git log 命令
- 软件测试|码农必会的git操作(一)
- 【Git】IDEA集合Git和码云
- 【Visual Studio 2019】上传代码到 GitHub ( 16.9.2 版本 | 安装 GitHub 扩展插件 | 创建 Git 仓库 | 推送到远程仓库 )
- 【错误记录】Git 使用报错 ( no changes added to commit (use “git add“ and/or “git commit -a“) )
- 【Git】Git 基础命令 ( 添加暂存文件 git add | 提交文件至版本库 git commit | 查看版本库状态 git status | 查询文件修改 git diff )
- 【Git】Git 版本管理 ( 补充提交版本 git commit --amend | 版本库提取文件 git checkout -- filename | 删除文件 git rm )
- 【Git】Git 分支管理 ( 创建并切换分支 | 查看分支 git branch | 合并分支 git merge dev | 删除分支 git branch -d dev )
- 【Git】Git 分支管理 ( 解决分支合并冲突 | 创建并切换分支 git switch -c feature1 | 修改 feature1 分支并提交 | 修改 master 主版本并提交 )
- 【Git】Git 标签使用 ( 查询哈希码 | 创建标签 git tag v1.0 | 查询标签 git tag | 查询标签信息 git show v1.0 | 创建标签并指定说明 | 删除标签 )
- Git 2.38发布,引入巨型仓库管理工具"Scalar"
- Git 版本控制工具(学习笔记)详解手机开发
- Linux环境下安装Git步骤指南(linux安装git)
- Linux下的Git版本控制管理实战(linux的git)
- 使用Git来升级你的Linux系统(git升级linux)
- git和春天、Linux和Git一起收获成功(springlinux)
- 如何在Linux上配置Git:简易指南(linux下git配置)