A. 如何用git来进行多人协作,管理自己的代码
首先,A得有一个github上的账户,如没有请先注册申请,然后安装git操作工具,登陆你的github,然后找到A要参与的项目P,点进项目中你会看见watch,star,fork,那么这分别是什么意思呢?1.想拷贝别人项目到自己帐号下就fork一下。fork的作用是参与,目的是你增加新的内容,然后PullRequest,把你的修改和主仓库原来的内容合并2.持续关注别人项目更新就star一下star的作用是收藏,目的是方便以后查找3.watch的作用是关注,目的是等作者更新的时候,你可以收到通知。点击fork一下,这样就将原项目弄到A的github仓库中了,这样这个项目就是你自己的了那么A修改后,如何提交给B呢,首先,修改fork过来的代码,A修改完后将其push到P1,然后点击pullrequest按钮,如图中2所示
B. 如何优雅地使用 Git
Github 相信已经成为家喻户晓的代码托管工具, 但访问了多位周围编程爱好者后发现, 对其的使用还仅限于 下载项目源码 和 备份项目源码 的程度, 今天我就来介绍一下一个比较重要的使用场景 贡献代码
以 swoole 为例:
Fork 项目
首先需要fork这个项目, 进入项目页面, 点击右上角的Fork按钮
你的 github 帐号中会出现 swoole/swoole-src 这个项目
在本地电脑(linux)上使用以下命令: 得到一个 swoole-src 文件夹
git clone [email protected]:samt42/swoole-src.git
获取原项目代码
进入 swoole-src 文件夹, 添加 swoole 的远程地址
git remote add upstream
获取 swoole 最新源码
git pull upstream master
现在我们在 fork 来的 master 分支上, 这个 master 留作跟踪 upstream 的远程代码...
创建分支
好了, 现在可以开始贡献我们的代码了
按照国际惯例, 我们一般不在 master 上提交新代码, 而需要为新增的功能或者fixbug建立新分支, 再合并到 master 上, 使用以下代码创建分支
git checkout -b branch1
现在我们可以在分支上更改代码了
假设我们已经添加了一些代码, 提交到代码库
git commit -a -m "new commit"
合并修改
一个常见的问题是远程的 upstream (swoole/swoole-src) 有了新的更新, 从而会导致我们提交的 Pull Request 时会导致冲突, 因此我们可以在提交前先把远程其他开发者的commit和我们的commit合并.
使用以下代码切换到 master 分支:
git checkout master
使用以下代码拉出远程的最新代码:
git pull upstream master
切换回 branch1:
git checkout branch1
> 如果忘记自己之前建的分支名可以用 `git branch` 查看
把 master 的 commit 合并到 branch1:
git rebase master
把更新代码提交到自己的 branch1 中:
git push origin branch1
Pull Request
提交 Pull Request
你可以在你的 github 代码仓库页面切换到 branches 页面点击 branch1 分支后点击 New pull request 按钮, 添加相关注释后提交.
OR
切换到 branch1 分支的代码仓库点击 Compare & pull request 按钮, 添加相关注释后提交.
C. git 命令查看远程tag
【查看远程分支】
$ git branch -a
master
remote
tungway
v1.52
* zrong
remotes/origin/master
remotes/origin/tungway
remotes/origin/v1.52
remotes/origin/zrong
【删除远程分支和tag】
$ git push origin --delete <branchName>
【删除tag这么用】
git push origin --delete tag <tagname>
否则,可以使用这种语法,推送一个空分支到远程分支,其实就相当于删除远程分支:
git push origin :<branchName>
这是删除tag的方法,推送一个空tag到远程tag:
git tag -d <tagname>
git push origin :refs/tags/<tagname>
两种语法作用完全相同。
【重命名远程分支】
$ git branch -av
* devel 752bb84 Merge pull request #158 from Gwill/devel
master 53b27b8 Merge pull request #138 from tdlrobin/master
zrong 2ae98d8 modify CCFileUtils, export getFileData
remotes/origin/HEAD -> origin/master
remotes/origin/add_build_script d4a8c4f Merge branch 'master' into add_build_script
remotes/origin/devel 752bb84 Merge pull request #158 from Gwill/devel
remotes/origin/devel_qt51 62208f1 update .gitignore
remotes/origin/master 53b27b8 Merge pull request #138 from tdlrobin/master
remotes/origin/zrong 2ae98d8 modify CCFileUtils, export getFileData
【删除远程分支】
$ git push --delete origin devel
To [email protected]:zrong/quick-cocos2d-x.git
- [deleted] devel
【重命名本地分支】
git branch -m devel develop
【推送本地分支】
$ git push origin develop
Counting objects: 92, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (48/48), done.
Writing objects: 100% (58/58), 1.38 MiB, done.
Total 58 (delta 34), reused 12 (delta 5)
To [email protected]:zrong/quick-cocos2d-x.git
* [new branch] develop -> develop
D. linux怎样命令行上传git
你是你是要通过git命令上传东西,还是想上传git到服务器上面,你可以先通过yum安装git
#yuminstallgit
已加载插件:fastestmirror,refresh-packagekit,security
设置安装进程
Loadingmirrorspeedslinuxprobe.comfromcachedhostfile
base|3.7kB00:00
epel|4.3kB00:00
epel/primary_db|5.9MB00:05
extras|3.4kB00:00
hhvm|2.9kB00:00
shells_fish_release_2|1.2kB00:00
updates|3.4kB00:00
updates/primary_db|821kB00:01
upgrade|1.9kB00:00
virtualbox/signature|181B00:00
virtualbox/signature|1.1kB00:00...
包git-1.7.1-8.el6.x86_64已安装并且是最新版本
无须任何处理
#git--help
usage:git[--version][--exec-path[=GIT_EXEC_PATH]][--html-path]
[-p|--paginate|--no-pager][--no-replace-objects]
[--bare][--git-dir=GIT_DIR][--work-tree=GIT_WORK_TREE]
[--help]COMMAND[ARGS]
:
addAddfilecontentstotheindex
branchList,create,,commitandworkingtree,etclogShowcommitlogs
mvMoveorrenameafile,adirectory,orasymlink
rebaseForward-
showShowvarioustypesofobjects
tagCreate,list,
See'githelpCOMMAND'.
下面我给介绍一种从本地上传到服务器的命令:
命令rz和sz命令,首先你需要安装lrzsz库
#rz--help
rzversion0.12.20
Usage:rz[options][filename.if.xmodem]
ReceivefileswithZMODEM/YMODEM/XMODEMprotocol
(X)=optionappliestoXMODEMonly
(Y)=optionappliestoYMODEMonly
(Z)=optionappliestoZMODEMonly
-+,--appendappendtoexistingfiles
-a,--asciiASCIItransfer(changeCR/LFtoLF)
-b,--binarybinarytransfer
-B,--bufsizeNbufferNbytes(N==auto:bufferwholefile)
-c,--with-crcUse16bitCRC(X)
-C,--allow-remote-(Z)
-D,--nullwriteallreceiveddatato/dev/null
--delay-
-e,--escapeEscapecontrolcharacters(Z)
-E,--
--(debugging)
-h,--helpHelp,printthisusagemessage
-m,--min-
-M,--min-bps-timeNforatleastNseconds(default:120)
-O,--disable-timeoutsdisabletimeoutcode,waitforeverfordata
--o-syncopenoutputfile(s)insynchronouswritemode
-p,--protectprotectexistingfiles
-q,--quietquiet,noprogressreports
-r,--(Z)
-R,--restrictedrestricted,moresecuremode
-s,--stop-at{HH:MM|+N}stoptransmissionatHH:MMorinNseconds
-S,--timesyncrequestremotetime(twice:setlocaltime)
--syslog[=off]turnsyslogonoroff,ifpossible
-t,--
-u,--keep-
-U,--(ifallowedto)
-v,--verbosebeverbose,providedebugginginformation
-w,--windowsizeNWindowisNbytes(Z)
-X--xmodemuseXMODEMprotocol
-y,--overwriteYes,clobberexistingfileifany
--ymodemuseYMODEMprotocol
-Z,--zmodemuseZMODEMprotocol
#sz--help
szversion0.12.20
Usage:sz[options]file...
or:sz[options]-{c|i}COMMAND
Sendfile(s)withZMODEM/YMODEM/XMODEMprotocol
(X)=optionappliestoXMODEMonly
(Y)=optionappliestoYMODEMonly
(Z)=optionappliestoZMODEMonly
-+,--(Z)
-2,--twostopuse2stopbits
-4,--try-4kgoupto4Kblocksize
--start-4kstartwith4Kblocksize(doesn'ttry8)
-8,--try-8kgoupto8Kblocksize
--start-8kstartwith8Kblocksize
-a,--asciiASCIItransfer(changeCR/LFtoLF)
-b,--binarybinarytransfer
-B,--bufsizeNbufferNbytes(N==auto:bufferwholefile)
-c,--(Z)
-C,--command-(Z)
-d,--dot-to-slashchange'.'to'/'inpathnames(Y/Z)
--delay-
-e,--(Z)
-E,--
-f,--full-pathsendfullpathname(Y/Z)
-i,--immediate-commandCMDsendremoteCMD,returnimmediately(Z)
-h,--helpprintthisusagemessage
-k,--1ksend1024bytepackets(X)
-L,--(Z)
-l,--(l>=L)(Z)
-m,--min-
-M,--min-bps-timeNforatleastNseconds(default:120)
-n,--newersendfileifsourcenewer(Z)
-N,--newer-or-(Z)
-o,--16-bit-(Z)
-O,--disable-timeoutsdisabletimeoutcode,waitforever
-p,--(Z)
-r,--(Z)
-R,--restrictedrestricted,moresecuremode
-q,--quietquiet(noprogressreports)
-s,--stop-at{HH:MM|+N}stoptransmissionatHH:MMorinNseconds
--
--tcp-serveropensocket,waitforconnection
-u,--
-U,--(ifallowedto)
-v,--verbosebeverbose,providedebugginginformation
-w,--windowsizeNWindowisNbytes(Z)
-X,--xmodemuseXMODEMprotocol
-y,--
-Y,--overwrite-or-skipoverwriteexistingfiles,elseskip
--ymodemuseYMODEMprotocol
-Z,--zmodemuseZMODEMprotocol
.com。
E. 如何删除git pullrequest
所有没有 commit 的本地改动,都会随着 reset --hard 丢掉,无法恢复。 如果只是想回到 pull 之前当前分支所在的commit位置,则可以。比方说你在 master 分支上,可以用 git reflog master 查看 master 分支历史变动记录,其中应该有一个就是你 ...
F. git clone 太慢怎么办
Git 和 GitHub
的出现打开了开源世界的另一扇大门,版本控制变得更强大(也更复杂),项目的管理变得更加容易,项目的开发也变得更容易进行多人协作。GitHub
无疑是程序员的 Facebook
,在这里汇聚了无数世界顶级的项目以及顶级的程序员,你可以为你感兴趣的项目加星(Star),可以关注任何人(Follow)以及他们的项目
(Watch),而且更赞的是,你可以复制一份别人项目的副本(Fork),来进行自己的修改,如果你愿意的话,你还可以向项目的原作者发起请求
(Pull Request),将你做的修改合并到原项目中。这样无论你是什么人,来自不同的国家,拥有不同的技能,都可以对所有开源的项目作出贡献。
尽管上面描述的开源世界如此美好,但是在大天朝,在墙内,你却完全无法领略。因为当你访问 GitHub 时,或者使用 git clone 兴致勃勃的下载你感兴趣的项目时,巨慢的速度将彻底击毁你的信心,最终只好放弃表示玩不起。
强大的长城技术对 GitHub 网开一面,没有像 Google 或 Facebook 这样直接斩尽杀绝,但是对它做了严格的限速,这种折磨比直接毙了更痛苦( 有网友表示,有些地区速度很快,有些地区速度很慢,也有可能是和网络运营商有关 )。如上图所示, git clone 的下载速度从来没有超过 10KiB/s ,这也就意味着一个 100MiB 的项目,需要近三个小时才能下完,而且由于网络的不稳定性,下载过程中偶尔会出现断开连接的情况,由于 git clone 不支持断点续传,这让几个小时的下载时间白白浪费掉,只能重新开始。
这篇文章将介绍几种方法来快速从 GitHub 上下载代码。
一、git shallow clone
git clone 默认会下载项目的完整历史版本,如果你只关心最新版的代码,而不关心之前的历史信息,可以使用 git 的浅复制功能:
$ git clone --depth=1 https://github.com/bcit-ci/CodeIgniter.git
--depth=1 表示只下载最近一次的版本,使用浅复制可以大大减少下载的数据量,例如, CodeIgniter 项目完整下载有近 100MiB ,而使用浅复制只有 5MiB 多,这样即使在恶劣的网络环境下,也可以快速的获得代码。如果之后又想获取完整历史信息,可以使用下面的命令:
$ git fetch --unshallow
或者,如果你只是想下载最新的代码看看,你也可以直接从 GitHub 上下载打包好的 ZIP 文件,这比浅复制更快,因为它只包含了最新的代码文件,而且是经过 ZIP 压缩的。但是很显然,浅复制要更灵活一点。
二、GUI 工具 + 代理
如果很有幸你正在使用代理,懂得如何翻墙的话,那么访问 GitHub 对你来说应该不在话下。下载 GitHub
上项目的最简单的方法就是使用一款图形化界面(GUI)的 Git 工具,这样的工具现在比比皆是。使用 GUI
工具方便的地方在于,可以在设置中配置是否要使用代理,将你翻墙所使用的代理 IP 拿过来配置上就 OK 了,或者更直接的,将代理配置为系统代理。
三、git + http.proxy
如果你跟我一样,喜欢使用原生的 git 命令,喜欢在命令行下操作的那种感觉,那么也可以在命令行下直接配置 git 使用代理,当然前提一样是,你懂得如何翻墙。
$ git config --global http.proxy http://proxyuser:[email protected]:8080
$ git config --global https.proxy https://proxyuser:[email protected]:8080
使用上面的命令配置完之后,会在 ~/.gitconfig 文件中多出几行:
[http]
proxy = http://proxyuser:[email protected]:8080
[https]
proxy = https://proxyuser:[email protected]:8080
你也可以使用下面的命令检查配置是否生效:
$ git config --global --get http.proxy
$ git config --global --get https.proxy
另外,如果你想取消该设置,可以:
$ git config --global --unset http.proxy
$ git config --global --unset https.proxy
配置完成后,重新 clone 一遍,可以看到速度得到了极大的提升!
题外话:在命令行中如何使用代理?
要注意的是使用 git config --global 配置的代理只能供 git 程序使用,如果你希望让命令行中的其他命令也能自动使用代理,譬如 curl 和 wget 等,可以使用下面的方法:
$ export http_proxy=http://proxyuser:[email protected]:8080
$ export https_proxy=https://proxyuser:[email protected]:8080
这样配置完成后,所有命令行中的 HTTP 和 HTTPS 请求都会自动通过代理来访问了。如果要取消代理设置,可以:
$ unset http_proxy
$ unset https_proxy
还有一点要注意的是,使用 http_proxy 和 https_proxy 只对 HTTP 和 HTTPS 请求有效,所以当你 ping www.google.com 的时候如果 ping 不通的话,也就没什么大惊小怪的了。
题外话:如何使用 PAC 文件?
有时候我们会使用 git 访问不同的 git 仓库,譬如 GitHub,或者 Git@OSC, 或者你自建的 Git 服务器,但是只想访问 GitHub 的时候使用代理,访问其他的仓库不要使用代理。这时候我们似乎可以使用 PAC 来解决这个问题。 PAC (代理自动配置)正是用于浏览器来根据不同的 URL 自动采用不同的代理的一项技术,该文件包含一个 FindProxyForURL Javascript 函数,用于根据 URL 来返回不同的代理。
但是遗憾的是,目前 git 似乎还不支持 PAC 文件,但我们可以打开 PAC 文件找到代理的地址,然后通过上面的方法来配置或取消配置,只是有些繁琐。 也许可以写个脚本来解析 PAC 文件,并将 git 包装下,来实现自动切换代理,有机会尝试下。
G. tortoisegit工具 推送代码要多久
Github是管理软件开发的首选托管网站,12306的火车票插件一时让国内当时很多小白开发者(当然也包括我)认识到了这个网站。GitHub可以托管各种git库,并提供一个web界面,与SourceForge或GoogleCode这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单,首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pullrequest”机制向项目负责人申请代码合并。下面开始正题:首先需要到TortoiseGit官网下载TortoiseGit,最新的是1.8.11,我从1.8.11-1.8.6下载都不能用,最后下载是1.8.5,我的电脑是Window8。安装完之后再电脑启动项会显示,双击Puttygen,生成密钥,这个是等会再GitHub上面配置的:点击Generate生成密钥,生成密钥的时候,记得鼠标要移动,不然的话,会卡住,保存私钥的时候,记得加密码点击Saveprivatekey保存一下这个密钥,位置自选,最好是一个常用位置。到GitHub官网./注册一个账号,然后登陆之后,点击Setting进入设置页面:这个时候添加SSHKey即可,Title自定义,key就是之前用工具生成的key:新建一个Repository,填写Repository名称以及说明。
H. git 在使用拉取、推送(pull或push)时时候会出现这样的错误提示
d:Program Files (x86)Git/libexec/git-coregit-pull:line 268:/bin/tr:Bad file number
Your configuration specifies to merge with the ref 'master' 是不是你的代码有未提交的更新呀?你修改文件后如果没有提交push,那么你在pull的时候就会报错的,会让你先提交或者merge合并文件
【拓展资料】
git pull origin 拉取代码到本地,解决拉取代码时发生的文件冲突:
1)拉取(下载)指定分支代码合并到当前分支:
相当于指定分支的代码与当前分支的代码合并到了一起。
命令:git pull origin分支名称
注意:
每次使用该命令前,需要保证本地工作区是没有任何修改代码的,也就是说需要将本地工作区编辑过的文件添加到暂存区(git add .),或提交到本地仓库中(git commit),才可以使用该命令拉取指定分支的代码合并到当前分支中。
每次在操作完git commit命令后,必须拉取一下master分支代码,保持本地正在开发功能逻辑的代码分支代码是最新的,避免后续在提交时冲突过多或覆盖掉其他人的代码的问题出现。
如果我们需要将master主干分支的代码拉取并与我们当前分支(xuzhangzheng2)的代码进行合并的话,可以使用该命令。效果如图:
中间的======是用于分割本地变更和远程仓库中的变更的,也就是说出现冲突时,如图,使用======把冲突的部分分割成2块。
上面的是本地修改变更的内容,以<<<<<<<HEAD开头。
下面的是远程仓库修改变更的内容,以>>>>>>>版本号 结尾。
版本号,也就是示例中的,即为提交的版本号,使用该版本号可以在gitlab中找到提交记录,从而方便查询其他同事在对同文件进行修改时,都修改了哪些内容,便于进解决冲突。
解决方法:
根据实际业务场景,将本地修改变更的部分和远程仓库中修改变更的部分进行合并,留下满足业务逻辑的代码即可(若团队开发期间,出现冲突时,建议找到相关同事进行沟通,确保自己解决冲突的方法不会影响到其他人编写的功能),同时将上面提到的冲突标识删除掉,不然无法通过语法检查和编译。
同时建议使用全文件内容搜索<<<<<<<或======或>>>>>>>,将所有有冲突的地方一一进行解决,保重提交的代码是可运行,没有问题的。
解决冲突后,若需要提交代码的话,需先将代码使用git add .存入缓存区,或直接使用git commit –am “本次提交描述” 或git commit –a –m “本次提交描述”将代码提交至本地仓库区,同时再次拉取制定分支的最新代码,确保本次的代码时刻都是最新的,再进行接下来的推送代码至远程仓库操作。
I. 如何向GitHub贡献代码
本篇重点介绍Github上如何给别人贡献代码,通过这个过程,也可以知道如果一个项目托管到Github上,团队成员之间合作的流程,给别人贡献代码,特别是一些开源组织,是件光荣的事
1、搜索你要贡献的代码仓库,在这里我创建了两个帐号,一个主帐号,里面有一个代码仓库mfjc,一个是将要贡献代码的帐号howard5888,搜索代码仓库如下图:
2、按下回车后,即会出现搜索到的库,如下图所示3、点击上图中的仓库链接,进入mfjc仓库,点击右边的fork,fork的含义就是创建mfjc项目的副本作为你自已的项目
J. Git 怎样保证fork出来的project和原project同步更新
1. 在 Fork 的代码库中添加上游代码库的 remote 源,该操作只需操作一次即可。
如: 其中# upstream 表示上游代码库名, 可以任意。
git remote add upstream https://github.scm.corp.ebay.com/montage/frontend-ui-workspace
2. 将本地的修改提交 commit
3. 在每次 Pull Request 前做如下操作,即可实现和上游版本库的同步。
3.1 : git remote update upstream
3.2 : git rebase upstream/{branch name}
需要注意的是在操作3.2之前,一定要将checkout到{branch name}所指定的branch,
如: git checkout develop
4. Push 代码到 Github
git push