[toc]

0x00 参与开源项目

但是在GitHub上,利用Git极其强大的克隆和分支功能,广大人民群众真正可以第一次自由参与各种开源项目了。

如何参与一个开源项目呢?
比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页https://github.com/twbs/bootstrap,点“Fork”就在自己的账号下克隆了一个bootstrap仓库然后从自己的账号下clone:

git clone [email protected]:michaelliao/bootstrap.git

一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址[email protected]:twbs/bootstrap.git克隆,因为没有权限你将不能推送修改。

如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request(推送属性请求),当然对方是否接受你的pull request就不一定了。

WeiyiGeek.pull request

WeiyiGeek.pull request


0x01 进阶使用

清理git log日志

描述:就是创建一个新的分支,并将项目git commit然后再新建立分支上删除master分支,之后并当前分支更名为master分支,最后git push即可;

清理Git的Log流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#创建临时分支
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 <[email protected]>

项目同时推送github和gitee

git能否支持一个项目同时推送到gitee和github呢?
答案:YES

操作流程(f方法1):

1
2
3
4
5
6
7
8
9
10
11
12
13
#方式1:打开每个项目的.git文件夹下的config文件
[remote "gitee"]
url = [email protected]:WeiyiGeek/test.git
fetch = +refs/heads/*:refs/remotes/gitee/*
tagopt = --no-tags
#或者命令行
git remote add gitee [email protected]:WeiyiGeek/test.git
git remote #执行后可以看见可看到两个仓库

#需要注意,此时推送代码时需要对两个仓库分别执行一次push命令
git push
git push gitee master --all
git push gitee master --tags


操作流程(方法2-推荐方法):

1
2
3
4
5
6
7
8
9
10
11
#方式2.我们可以更改.git下的config文件为
[remote "origin"]
url = [email protected]:WeiyiGeek/test.git
fetch = +refs/heads/*:refs/remotes/origin/*
url = [email protected]:WeiyiGeek/test.git

#或者git命令行:
git remote set-url --add origin 你的gitee项目地址

#此时只需执行一次push即可同时推送多个仓库。
git push

两种方法的对比

  • 方式1.可以对任意仓库进行pull或者push
  • 方式2.默认只能从config中的第一个url内的仓库pull代码
  • 总之一句话:pull代码的话配置1更方便,push代码的话配置2更方便

注意事项: 如果推送的非标准的22端口需要如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[remote "gitlab"]
url = ssh://[email protected]:2222/WeiyiGeek/blog.git
fetch = +refs/heads/*:refs/remotes/origin/*

# 验证
> ssh -i ~/.ssh/id_develop -T ssh://[email protected]:2222
Welcome to GitLab, @WeiyiGeek!

# 指定密钥拉取与上传
> ssh-agent zsh
> ssh-add ~/.ssh/id_develop
# Identity added: /home/weiyigeek/.ssh/id_develop ([email protected])
[email protected]:~/develop/github-project
> git clone ssh://[email protected]: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 条历史,操作步骤如下:

1
git rebase -i HEAD~3

运行此命令会提供一个提交列表,如下所示其中 commit 记录是时间逆序排列的;
1
2
3
4
5
6
7
8
9
10
11
12
13
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 中的某些文件

1
2
3
4
5
# 删除文件
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


0x02 Git入坑障碍解决

问题1.pull origi.error: The following untracked working tree
解决方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#方案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
2
3
4
5
6
7
#解决方法(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
2
3
4
5
6
#1.官网下载安装git最新版本(太麻烦不建议)

#2.采用VPN进行翻墙更新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测试
问题描述:

1
2
3
4
5
6
7
8
9
10
$ssh -T [email protected]
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中是不允许的;
解决办法:
1
2
3
$ chmod 600 *
$ echo -e "yes" | ssh -T [email protected]
Hi WeiyiGeek! You've successfully authenticated, but GitHub does not provide shell access.