欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

文摘  Github+Git使用详解-其他用法

开发工具 本站 1418 0评论

之前对GitHub的使用做了详细讲解(参考文章:https://ittxx.cn/view/164  ),但Github还有很多功能未作说明,这篇文章做一些补充讲解。


一、怎样在github上协同开发


项目发起者:koffuxu 

项目贡献者之一:xugangfeng


1.koffuxu发起了一个项目,然后发布到github上,邀请xugangfeng来协同开发


1.1 首先在github上 New Repository 

image.png


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)的项目中

image.png


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 

image.png


2.4 把koffuxu的项目添加xugangfeng的远程仓库

git remote add upstream https://github.com/koffuxu/Embedded_Android_in_Chinese

image.png


2.5 xugangfeng把koffuxu的分支拿下来

git remote update

image.png


2.6 xugangfeng把koffuxu的maser分支更新到本地

git fetch upstream master

image.png


2.7 合并koffuxu的分支到本地(其实第一次可以不需要)

git rebase upstream/master

image.png


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即可。

image.png

image.png


4.koffuxu接下来把xugangfeng的提交合并到master分支


4.1 进入github koffux的项目中,可以看到有一个pull request的提示,然后comfirm merge即可

image.png


4.2 接下来进入koffuxu的本地,执行git pull查看是否已经更新了。

image.png


5.还有一个场景,就是koffuxu有更新了,xugangfeng需要更新合并


5.1 koffuxu又在c4.md新增了一条

image.png


5.2 贡献者xugangfeng,就需要在原来的基本上更新合并了。

git remote update upstream

image.png


5.3 xugangfeng开始要合并更新

git rebase upstream/master

image.png


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信息:

image.png

我打算更改下面那个commit,使用git rebase -i 版本号^

image.png

执行命令后,会进入这样的界面:

image.png

它把我们传入的版本号之上的commit条目都显示出来了,这里只关注我们要改的那一条。将第一个pick修改为reword,保存并退出。


过一会儿,它会再进入这样的界面:

image.png

将第一行的Android的ListView改为这个更改后的message,保存并退出。

再用git log查看:

image.png

不仅commit message被更改了,从被更改的commit开始,commit id都会重新生成。


四、合并commit


先用git log查看commit信息:

image.png

如果你想把最近的四个commit合并成一个commit,有两种方法。一种是用git reset --soft d7ac,在git commit -m "新的commit message",另一种是用git rebase。接下来讲第二种。


首先根据上图的commit id,我想把afe14f之后的commit合并到afe14f里面,执行 git rebase -i afe14f^。进入编辑界面:

image.png

根据提示,squash会把所在的commit合并到前一个commit上面。我们要合并到afe14f,所以修改后三个。而在合并之后,我们需要修改afe14f的commit message,所以使用reword

image.png

你也可以用缩写,比如squash的缩写是s。而reword的缩写是s


保存并退出,会进入下一个界面。修改第一行的commit message,即reword的那个message,为添加Android学习笔记,特别是ListView的介绍;添加对git commit的修改教程。如下图:

image.png

保存并退出。自动进入下一个界面:

image.png

此时要将其他三个message去掉,只要在那三行前面加#就行了。如下图:

image.png

保存并退出,等待git处理完成。


再次使用git log查看commit信息:

image.png

完成!


这里貌似可以不使用reword,待实验。


五、解决merge时出现的冲突


当你和其他团队成员对同一个文件进行修改后,merge的时候有可能会出现冲突。你可以打开每个冲突的文件,手工解决冲突;也可以借助冲突处理工具来解决冲突。这里分别介绍这两种方式:


1.手工解决冲突


冲突提示如下图所示:

image.png

CONFLICT表示有冲突,在这一行的末尾,显示冲突文件。这里有两个文件冲突,分别是README.md和app.iml

这里以README.md为例,解决冲突:

image.png

被红框框住的符号 ======= 是冲突的分割线。


<<<<<<< HEAD 和分割线之间的是本地的文本,分割线和 >>>>>>> upstream/dev 之间的是远程分支的文本


你可以选择保留其中一个版本的文本,然后将三个冲突符号都删除。这样表示已解决冲突。如果你想同时保留两个版本,那么只需将冲突符号删除。


解决冲突后如下图所示:

image.png


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的界面如下:

image.png


冲突的地方会显示红色,如果你想保留本地的代码,则点击左边的 箭头。

把所有红色(冲突)区域解决后,可以根据实际情况去解决绿色(添加)和灰色(更改)。

一般保存中间的修改就行。如上图红框处。


六、回退一个merge


1.如果是merge一个GitHub的Pull Request,可以进入要回退的那个Pull Request,在下面有一个revert按钮,可以用来revert一个Pull Request。如下图红框处:

image.png


2.在命令行里revert


1)用 git log 看commit记录

image.png


现在我们要回退 commit 561dab (也就是图中第一个commit),该commit将Pull Request #113 merge到项目中。


2)使用 git revert HEAD -m 1 命令回退

image.png


如果是非merge的回退,用 git revert 版本号 就行了。但是这里是对merge操作进行revert,需要加上参数 -m 。命令最后加个 1


为什么要加上 1 呢?看上面  1)的图中的第二个红框,这个 1 对应红框中的 6a3c30c 版本。而如果填 2 ,则对应 b7831df 。


继续看log,会发现 6a3c30c 是merge这个Pull Request之前的状态。而 b7831df 则是当前版本之前的一个merge。


输入命令回车后,会跳出一个文本。

image.png

目前无视它就行。关闭文本,回到shell,回车。

image.png

回退成功!这个回退不会删除掉中间的commit记录,而是将这次revert作为一个commit加到commit记录上面。


七、获取某一commit的修改


假设有commit a b c ,从左到右,c 为最新版。

这时你发现 b 的一个修改有问题,想回退到 a 。但是如果回退到 a , c 的commit也会被取消。

这时可以用 git cherry-pick 版本号 这个命令获取 c 的commit。


下图是示例的log记录,从①可以看出,这里从②回退到⑤。

image.png

现在我想获取④的commit。使用 git cherry-pick 版本号 将选定版本的提交合并到当前版本。

image.png


八、将低版本push到Github(删掉高版本Commit)


有时候会因为各种原因,想要回退版本。如果没有关联Github或者没有push上去,那问题不大。但是如果你已经push到Github上了,这时候就比较尴尬了,因为普通的push是会被Github拒绝的。虽然Github提供了Revert功能,但是这并不能完全消去一个commit。


先看看reset后被拒绝的样子:

image.png

解决方法就是:

先用 git reset --hard 版本号 回到你想要的版本

再执行 git push --force

image.png

再看看Github:

image.png

当然,一般是推荐用 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

赞 (7) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽