之前对GitHub的使用做了详细讲解(参考文章:https://ittxx.cn/view/164 ),但Github还有很多功能未作说明,这篇文章做一些补充讲解。
一、怎样在github上协同开发
项目发起者:koffuxu
项目贡献者之一:xugangfeng
1.koffuxu发起了一个项目,然后发布到github上,邀请xugangfeng来协同开发
1.1 首先在github上 New Repository
1.2 在koffuxu的服务器clone下这个repository,然后把自己的初步内容添加到这个仓库
git clone https://github.com/koffuxu/Embedded_Android_in_Chinese.git
1.3 然后把自己的基础项目push到github
git push -u origin master
2.xugangfeng接到邀请,开始协同开发这个项目,首先先建好开发目录
2.1 进入koffuxu的github项目地址(https://github.com/koffuxu/Embedded_Android_in_Chinese.git),先fork这个项目到自己(xugangfeng)的项目中
2.2 把fork过来的项目clone到xugangfeng的本地
git clone https://github.com/xugangfeng/Embedded_Android_in_Chinese.git
2.3 新建并切换到工作(dev)分支
git brach dev
git checkout dev
2.4 把koffuxu的项目添加xugangfeng的远程仓库
git remote add upstream https://github.com/koffuxu/Embedded_Android_in_Chinese
2.5 xugangfeng把koffuxu的分支拿下来
git remote update
2.6 xugangfeng把koffuxu的maser分支更新到本地
git fetch upstream master
2.7 合并koffuxu的分支到本地(其实第一次可以不需要)
git rebase upstream/master
3.xugangfeng实现了一个功能,现在他要开始提交这个commit了。
3.1 当然这个是正常代码的提交,大概流程如下:
git add test.md
git commit -m "modify from xugangfeng"
git push -u origin dev
3.2 这时候,xugangfeng进入github网页,进入compare & pull request,填写一些信息,crete pull request即可。
4.koffuxu接下来把xugangfeng的提交合并到master分支
4.1 进入github koffux的项目中,可以看到有一个pull request的提示,然后comfirm merge即可
4.2 接下来进入koffuxu的本地,执行git pull查看是否已经更新了。
5.还有一个场景,就是koffuxu有更新了,xugangfeng需要更新合并
5.1 koffuxu又在c4.md新增了一条
5.2 贡献者xugangfeng,就需要在原来的基本上更新合并了。
git remote update upstream
5.3 xugangfeng开始要合并更新
git rebase upstream/master
5.4 git log查看,已经合并过来了
整个过程比较啰嗦,慢慢看吧。
二、更换git for windows的文本编辑器
git for windows默认使用vim作为文本编辑器,为此我专门写了篇vim的基本操作:vim编辑器的简单使用
如果你不想学习vim的使用,也可以把它换掉。
例如我想把它换成atom:
先找到启动atom的exe文件的路径。我的在 C:\Users\Schaepher\AppData\Local\atom\app-1.13.0\atom.exe
启动git for windows,执行git config --global core.editor "C:/Users/Schaepher/AppData/Local/atom/app-1.13.0/atom.exe --new-window --foreground --wait"
注意,这里路径的斜杠与Windows显示的相反,这是Linux的路径格式。
后面一串参数--new-window --foreground --wait是由各编辑器自己指定的。如果不这样指定,执行git rebase -i commitId^的时候会直接退出编辑。
三、修改已经提交的commit说明
先用git log查看commit信息:
我打算更改下面那个commit,使用git rebase -i 版本号^:
执行命令后,会进入这样的界面:
它把我们传入的版本号之上的commit条目都显示出来了,这里只关注我们要改的那一条。将第一个pick修改为reword,保存并退出。
过一会儿,它会再进入这样的界面:
将第一行的Android的ListView改为这个更改后的message,保存并退出。
再用git log查看:
不仅commit message被更改了,从被更改的commit开始,commit id都会重新生成。
四、合并commit
先用git log查看commit信息:
如果你想把最近的四个commit合并成一个commit,有两种方法。一种是用git reset --soft d7ac,在git commit -m "新的commit message",另一种是用git rebase。接下来讲第二种。
首先根据上图的commit id,我想把afe14f之后的commit合并到afe14f里面,执行 git rebase -i afe14f^。进入编辑界面:
根据提示,squash会把所在的commit合并到前一个commit上面。我们要合并到afe14f,所以修改后三个。而在合并之后,我们需要修改afe14f的commit message,所以使用reword。
你也可以用缩写,比如squash的缩写是s。而reword的缩写是s。
保存并退出,会进入下一个界面。修改第一行的commit message,即reword的那个message,为添加Android学习笔记,特别是ListView的介绍;添加对git commit的修改教程。如下图:
保存并退出。自动进入下一个界面:
此时要将其他三个message去掉,只要在那三行前面加#就行了。如下图:
保存并退出,等待git处理完成。
再次使用git log查看commit信息:
完成!
这里貌似可以不使用reword,待实验。
五、解决merge时出现的冲突
当你和其他团队成员对同一个文件进行修改后,merge的时候有可能会出现冲突。你可以打开每个冲突的文件,手工解决冲突;也可以借助冲突处理工具来解决冲突。这里分别介绍这两种方式:
1.手工解决冲突
冲突提示如下图所示:
CONFLICT表示有冲突,在这一行的末尾,显示冲突文件。这里有两个文件冲突,分别是README.md和app.iml
这里以README.md为例,解决冲突:
被红框框住的符号 ======= 是冲突的分割线。
<<<<<<< HEAD 和分割线之间的是本地的文本,分割线和 >>>>>>> upstream/dev 之间的是远程分支的文本
你可以选择保留其中一个版本的文本,然后将三个冲突符号都删除。这样表示已解决冲突。如果你想同时保留两个版本,那么只需将冲突符号删除。
解决冲突后如下图所示:
2.借助冲突处理工具
个人认为Meld这个工具比较好用,Android Studio自带的冲突处理工具和它很相似。我用过tortoisegit的工具,感觉没有Meld好用,这里就不介绍了。
1) 首先去Meld的官网下载安装文件并安装。->点此进入Meld官网
2) 安装完后,打开你的git工具,比如msysgit。执行 git config --edit --global ,此时会打开一个配置文件。在文件最后添加以下四行:
[merge]
tool = meld
[mergetool "meld"]
path = e:/software/MeldMergeTool/Meld.exe
提示:path是根据你安装Meld的路径来决定的,同时要把路径中的 \ 改成 / 。从上面可以看出我的安装路径为 e:\software\MeldMergeTool\ 。
3) 在merge的时候,如果出现冲突,运行命令 git mergetool 这时就会打开Meld。
4) Meld的界面如下:
冲突的地方会显示红色,如果你想保留本地的代码,则点击左边的 → 箭头。
把所有红色(冲突)区域解决后,可以根据实际情况去解决绿色(添加)和灰色(更改)。
一般保存中间的修改就行。如上图红框处。
六、回退一个merge
1.如果是merge一个GitHub的Pull Request,可以进入要回退的那个Pull Request,在下面有一个revert按钮,可以用来revert一个Pull Request。如下图红框处:
2.在命令行里revert
1)用 git log 看commit记录
现在我们要回退 commit 561dab (也就是图中第一个commit),该commit将Pull Request #113 merge到项目中。
2)使用 git revert HEAD -m 1 命令回退
如果是非merge的回退,用 git revert 版本号 就行了。但是这里是对merge操作进行revert,需要加上参数 -m 。命令最后加个 1。
为什么要加上 1 呢?看上面 1)的图中的第二个红框,这个 1 对应红框中的 6a3c30c 版本。而如果填 2 ,则对应 b7831df 。
继续看log,会发现 6a3c30c 是merge这个Pull Request之前的状态。而 b7831df 则是当前版本之前的一个merge。
输入命令回车后,会跳出一个文本。
目前无视它就行。关闭文本,回到shell,回车。
回退成功!这个回退不会删除掉中间的commit记录,而是将这次revert作为一个commit加到commit记录上面。
七、获取某一commit的修改
假设有commit a b c ,从左到右,c 为最新版。
这时你发现 b 的一个修改有问题,想回退到 a 。但是如果回退到 a , c 的commit也会被取消。
这时可以用 git cherry-pick 版本号 这个命令获取 c 的commit。
下图是示例的log记录,从①可以看出,这里从②回退到⑤。
现在我想获取④的commit。使用 git cherry-pick 版本号 将选定版本的提交合并到当前版本。
八、将低版本push到Github(删掉高版本Commit)
有时候会因为各种原因,想要回退版本。如果没有关联Github或者没有push上去,那问题不大。但是如果你已经push到Github上了,这时候就比较尴尬了,因为普通的push是会被Github拒绝的。虽然Github提供了Revert功能,但是这并不能完全消去一个commit。
先看看reset后被拒绝的样子:
解决方法就是:
先用 git reset --hard 版本号 回到你想要的版本
再执行 git push --force
再看看Github:
当然,一般是推荐用 git push origin HEAD --force 的,能防止因为其他没配置好而产生错误。对我来说差别并不大……
一些实用的git命令操作
1.使用git克隆(下载)一个仓库或单个文件夹
注意:文件夹名可以随意写 ,仓库地址替换成你想要下载的仓库地址。
//新建仓库并进入文件夹
git init 文件夹名字 && cd test
//设置允许克隆子目录
git config core.sparsecheckout true
//设置要克隆的仓库的子目录路径 //空格别漏
echo '子路径名*' >> .git/info/sparse-checkout
//这里换成你要克隆的项目和库
git remote add origin 仓库地址
//下载
git pull origin master
2.关于git config配置文件的增删改查命令:
查询
查询所有配置文件内容
git config --global --list
查询某个指定内容,例如 查询用户名
git config --global user.name
增加
增加一个用户名
git config --global --add user.name jianan
删除
删除用户
git config --global --unset user.name
修改
修改用户名
git config --global user.name jianan
Git使用中遇到的错误
1.git clone 下载速度0bytes 出现error: RPC failed; curl 18 transfer closed with outstanding read data
【原因:】由于Http协议错误,当Clone的时候,因为curl的postBuffer默认值太小的原因,而项目可能本身比较大,所以下载失败。
【解决方案:】
打开git命令行 输入 git config –global http.postBuffer 524288000,然后可以输入 git config –list 查看刚才的设置是否生效。
git config –global http.postBuffer 524288000 命令的意思:相当于把curl的postBuffer的值修改的大一些。524288000的单位是B,相当于500MB。
2.git pull 报错:git - error: RPC failed; curl 18 transfer closed with outstanding read data remaining
报错信息:
fatal: The remote end hung up unexpectedly
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
【原因:】
由于Http协议错误,当Clone的时候,因为curl的postBuffer默认值太小的原因,而项目可能本身比较大,所以下载失败。
【解决方案:】
打开git命令行 输入 git config –global http.postBuffer 524288000,然后可以输入 git config –list 查看刚才的设置是否生效。
3.git push出现的错误,RPC failed; curl 56 SSL read: error:00000000:lib(0):func(0):reason(0), errno 10053
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
error: RPC failed; curl 56 SSL read: error:00000000:lib(0):func(0):reason(0), errno 10053
【原因分析:】
可能是上传的文件太大,缓存不够,默认只有1M。
【解决方案:】
打开git命令行 输入 git config –global http.postBuffer 524288000
到此,基本的github的使用基本讲完了,是不是很简单,不到半个小时就学会了,快去用起来吧。更多关于git的使用,请查看git官网的中文文档,点此进入→ https://git-scm.com/book/zh/v2
【原因:】由于Http协议错误,当Clone的时候,因为curl的postBuffer默认值太小的原因,而项目可能本身比较大,所以下载失败。
参考网址:
https://blog.csdn.net/Free_Wind22/article/details/50967723
https://blog.csdn.net/wait_for_taht_day5/article/details/79587844
https://blog.csdn.net/qq_31877249/article/details/79740748
原文地址:http://www.cnblogs.com/schaepher/p/4970291.html
转载请注明: ITTXX.CN--分享互联网 » Github+Git使用详解-其他用法
最后更新:2018-11-23 10:20:54