赞
踩
https://www.yiibai.com/git/git_remote.html
本文中部分理解来源于 学相伴 - 飞哥 的直播课《飞哥聊Git.mp4》
https://www.bilibili.com/video/BV1FE411P7B3《【狂神说Java】Git最新教程通俗易懂》
SVN是集中式控制,所谓集中就是必须在同一个网络,来进行提交与拉取代码;而Git是分布式控制,不需要同一网络(除了push那一步);
这里着重提出一个Git的特点,版本与协作分离,svn必须同一网络,所有与版本控制的操作必须在同一个网络,离开这个网,一切都做不了;而Git的add和commit只是在本地,只有真正push才与服务器有交互,减少了很大压力,相比之下svn的提交次数就多了很多,git提交代码如果只是提交到本地仓库不需要网络,走哪都能提交。
in:name example stars:>1000 项目名字中有“example” 且star大于1000
in:readme example forks:>1000 readme.md中有“example” 且fork大于1000
in:description example pushed:>2021-02-01 描述中有“example” 且最近更新在2021-02-01之后
language:java 用Java编写的项目
有目录结构地看github代码,增加sourcegraph.com/
https://sourcegraph.com/github.com/vayneXiao/springboot-guide
settings Collaborators 加入 合作者:github 全名或邮箱
发送邀请链接
合作伙伴: 打开该链接、接受邀请 :合作开发…clone项目、修改、add \commit\push
接受邀请后,项目代码仍然只有一份,在原作者仓库
这些命令在git bash中执行,和idea的在Terminal中都可以执行,注意当前分支是哪个就好
C:\Program Files\Git\etc\gitconfig C:\Users\vaynexiao\.gitconfig git config -l # 查看全部信息 git config --global --list # 只看关键信息 git config --global user.name "vaynexiao" # 设置username git confgi --global user.email "qqmail" # 设置email # 这些信息都在C:\users\vaynexiao\.gitconfig文件中,局部配置优先全局配置 git init # 本地新建项目需要在本地文件夹中git init初始化,告诉git这是一个项目的根目录,会创建一个.git文件夹,记录版本变更信息,但一般不会这么做,接手新项目要么clone远程仓库,要么idea直接新建,不会自己新建文件夹 在远程建立git项目 new-建立项目- 生成链接 https://github.com/zhangsan/remotename.git 第一次发布项目 (本地-远程) git add . # 将所有受控制文件-暂存区 git add hello.html # 只添加 hello.html 到暂存区 # 暂存区,就是为了将多次提交积攒到一起,然后依次commit,这样提交次数就少了很多,显得很有条理,不琐碎 git rm --cached a.txt # 从暂存区移除 git commit -m "注释内容" # 暂存区所有文件 到当前分支 git log # 查看提交日志 git clone https://gitee.com/vaynexiao/gitstudy.git # clone下载一个现成的项目,clone得到的项目会自动产生关联 git pull 远程仓库对应分支 与 本地仓库当前分支 合并(注意是本地仓库,commit之后的本地库), 本地新增文件与本次操作无关,仍然还在,远程仓库新增文件会下载下来, 有冲突文件会git pull失败,没有冲突的切有差异的会合并到本地 如果git pull dev时,本地当前分支是master,那么这两个分支会合并 git pull origin dev # 拉取 origin 的 dev 分支代码,origin类似就是一个远程项目的简称,然后dev指定分支 clone & pull clone是本地没有repository时,将远程repository整个下载过来。 pull是本地有repository时,将远程repository里新的commit数据(如有的话)下载过来,并且与本地代码merge。(=fetch+merge) git status # 查看当前所有已跟踪文件修改状态 git status filename git rm *.xml # 删除全部xml文件(此时并不是把文件删了,而是放进暂存区,想彻底删除需要commit) git branch # 查看所有本地分支,并注明当前使用分支 git branch dev # 新建本地分支dev,远程要提交后才生效 git branch -a # 查看所有本地和远程的分支,并注明当前使用分支(-v v表示再把sha1值查出来) git branch -d dev #删除本地dev分支 git branch -r # 查看所有远程分支 git remote -v # 查看远程库全部信息 untitled1 https://github.com/vayneXiao/untitled1.git (fetch) untitled1 https://github.com/vayneXiao/untitled1.git (push) git remote # 只查看远程库简写名字(一般是origin,这里我直接自定义项目名为untitled) untitled1 # 关联远程项目 并起名为 upstream git remote add upstream https://github.com/springframeworkguru/springbootwebapp.git git remote -v # 查看远程仓库地址 git remote rm origin # 删除远程仓库origin的地址 git branch dev # 新建分支dev git checkout dev # 切换本地分支到dev git checkout -b new_name # 以上2步骤,创建新分支并切换到新分支可以合并为一句 git push origin dev # 推送本地当前分支变化 到 远程仓库origin的dev分支,没有该分支则新建 #(git push -u origin dev -u代表啥?也是相同作用?不写似乎也行) git branch gde4.6 # 再创建一个分支 git push --set-upstream origin gde4.6 # 另一种push分支到远端方法,注意:分支名不能变 git push -u origin master # 后期不用 -u 空目录默认不提交(直接 git push 默认是提交当前分支) git branch -d name # 删除本地指定分支(不能是当前分支,比如删除 a 分支,当前可以切换到b分支) git push origin --delete dev # 删除远程 origin 地址的 dev 分支
分支是什么?
master某一时刻功能测试完好,还要继续开发,但害怕新的代码有问题,就先复制一份master作为分支,起名为dev,所以目的是为了保护原master代码,而dev分支的代码和创建分支当时的master代码是一致的。
需要注意的是,如果xxxx分支中有一个独一无二的文件d,其他分支中都没有d,此时删了就真的没法复原了, 出于安全考虑,这种“未合并”内容存在的话不允许删除分支,必须先处理,也就是合并。 git merge xxxx 此时将分支xxxx合并到master,也就是同样把d文件删除 合并后再进行git branch -d xxxx 此时分支xxxx才会删除,还是为了安全考虑多了这么一步保险操作 如果忽略未合并文件,强行删除 git branch -D xxxx D表示强行删除 细节: 1,在分支a中进行了增删改操作,但没有commit,在master中可以看到该操作; 如果进行了commit,master视角就看不到该操作。(增删改操作,共同性质就是写操作) 2,在分支a中进行了增删改操作,但没有commit,在master中可以看到该操作; 此时master中可以直接删掉分支。 通过以上现象可以得出结论:不归git管的文件,不管进行什么操作,哪怕是删除分支,他还是不管的。 远程有分支dev2,本地没有 1,git checkout -b dev2 origin/dev2(检出分支dev2,且切换到dev2,然后关联origin/dev2) 2,git checkout -b dev2 --track origin/dev2(作用同1,--track表示跟踪origin/dev2) 3,git checkout --track origin/dev2(作用同2,不写-b dev2,会默认本地分支名与远端分支名相同) git branch -m oldname newname 本地分支重命名 git status 查看本地所有文件的修改情况 在master git merge dev 意思是将dev合并到master 但是,人生不如意之事十之八九,合并分支往往也不是一帆风顺的。 以下??? git fetch 远程主机名 将远程主机全部更新取回本地 git fetch 远程主机名 分支名 将远程特定分支取回 最常见的,比如 git fetch origin master 取回本地后回返回一个fetch_head git pull等于 git fecth origin master git merge FETCH_HEAD 完整写法为git pull 远程主机名 远程分支名 本地分支名 如果远程分支与当前分支合并,冒号后面可以省略为 git pull origin next # Idea中修改分支名字 先删除远端分支,右下角点击本地分支名,Rename,然后push时选择远端对应分支名(对应的分支,不一定名字一样)
将本地目录交给git管理:VCS选中项目文件夹创建为git仓库,新文件为褐色
(不进行这一步右击项目不出现git选项,但项目文件夹事直接clone下来的,
就会自动关联远程项目,remote URL 就不需要自己配置)
add:Git - add 绿色
commit:Git - commit 目录 黑色
越过add直接commit: Git - Commit Directory - Commit
Push:Git - Push Define Remote 填写自己github的项目地址,并起一个名字,一般默认origin也可以自定义
(push之前一定要在github创建对应的仓库)
越过add直接一次性commit和push: Git - Commit Directory - Commit and Push
commit后未push修改massage:idea - 左下角Git - 找到对应commit - 右击Edit Commit Massage
idea 可以在git tab直接修改之前提交的commit message
*.class
*.iml
*.log
.idea/
.jar
.war
/target
本地生成一个ssh,远程仓库粘贴进去,这样就不用每次输入密码了,相当于搭了一座桥,本质等于一个密码,这样每次提交就对比两地的ssh key,相同就可以运行命令,这不就等于“第二密码”吗,就是个密码。
输入ssh-keygen -t rsa -C xxx@qq.com 一直回车。
现在本地生成的文件在C:\users\vaynexiao.ssh文件夹下(id_rsa,id_rsa.pub)
在github页面 - settings - SSH and … - New SSH - title任意设置、key中输入 刚才在本地生成的ssh:
将本地刚才生成的id_rsa.pub内容复制到远程的Key中
id_rsa本地密码
id_rsa.pub远程密码
测试连通性:
ssh -T git@github.com
如果本地和远程成功通信,则可以在 /.ssh目录中 发现known_hosts文件
如果失败:多尝试几次 、检查回车符
工作中直接clone项目代码,然后修改,提交就直接提交了,这是不对的,张三李四随意都可以提交,太没规矩了,路人权限都这么大项目没人管了;
必须有个人起到检查作用,Reviewer就是审核者,他负责检查别人提交的代码;
但是别人不直接clone的话没法提交啊,所以需要fork项目,类似把人家 “项目主仓库” 复制一份,提交代码到自己的fork库,修改自己fork库代码后然后发起一个pull request,就是说我改了代码,和“项目主仓库” 比较后会看到确实有修改之处,请审核人Reviewer看一眼,被认可的话就同意这个pull request,这样自己的fork库的修改就提交到了主仓库,也避免了路人有过大的权限。
在github上,当看到好的项目代码时,有两种方式可以将代码“下载”到本地。
一是可以直接clone原项目,
二是通过github的“fork”功能“拷贝”项目到我们自己的主页上,再从主页上clone“拷贝项目”。
两种方式最重要的区别是,如果我们修改了clone到本地的代码,想push一下:
显然第一种方式不可行,因为项目的远程信息是别人的(通过git remote -v 可以查看);
而第二种方式,由于创建者相当于是我们自己,是能够push的(当然先要add 和commit)。但是我们push之后,原项目的主人是看不到我们修改的代码的;
如果想让原作者接受并merge你的修改,这时可以发起pull request,这样原作者就能收到pull request请求,并可以审阅你的代码是否合理,如果他比较满意,就可以merge你的修改,这样原项目就得到了完善,而你也就成为了光荣的“贡献者”之一。
一般情况我们是不需要fork的。很多人错误的在使用fork,把它当成一种“收藏”功能,其实可以直接用“watching”来关注该项目,当有新的issue,commit,pull request时,你会收到相应的邮件提醒(前提是设置了邮箱)也可以只用star点赞,那么自己就有一个点赞列表,也相当于收藏了该项目。
而fork的项目只是保留了fork当时的状态,如果项目作者在你fork之后更新了项目,你是看不到的。这就带来一个问题:如何实现fork后的项目与原项目的同步?
git fetch upstream # 拉取所有变化到本地
git checkout master # 切换到master分支
git merge upstream/master # 合并upstrea的master分支的变化到当前分支,即master分支
# 其实可以合并成一条命令
git pull upstream master
5. 将本地代码提交到自己主页的分支,即origin上了,这样,我自己主页的项目就和原作者的项目进行了同步。
总结一下:实现fork的项目和fork from项目同步的方法是利用自己的fork库作为“中转”,为本地的项目添加上游项目upstream信息,拉取upstream (fork from)库的新代码到自己本地电脑,然后push到自己的fork库上,就达到了“同步”。【以上方法实验证明不是绝对正确还需要研究】
补充一种更快速方法:创建request请求,比较fork from库和自己的fork库,注意箭头朝向自己哦,这样就是比较整个库代码,接着自己处理合并请求(我做了实验,对方原项目库并不会有任何提示,只是自己作为接受merge的人需要处理merge而已)然后提交后,自己就会收到一个merge,接受即可达到同步fork库。
上图验证是强行拉取代码,如果有冲突他不管的,就像下图,必须亲自手动merge
或者放弃merge
不merge的话,此时push会显示正在MERGING状态,而且Everything up-to-date,其实github代码并没有改变
主库的改动会同步过来,但是本地如果新增的文件与这次主库改动无关,这个新增文件就依然存在fork库,并不能实现完全同步主库与fork库
当前分支是dev,pull时候就选择dev不要多选,否则会将选择的三个分支代码全部pull到本地dev
idea中commit等于add+commit
因为add释放到暂存区,听名字就知道这是一个针对临时区域的临时操作,并不生效,相当于产生了一个不归git管理的文件,所以其他分支照样可以看到“只add未commit的代码”
Git - Compare with branch # 查看本地分支修改
pull时显示内容冲突,这里点击ok并不会做任何事情,建议将本地修改备份,然后还原此文件,点击向上拐弯的箭头,再将备份内容追加进去,达到了pull目的。
PS:如果idea一直push有问题,有可能是密码不对,但没有提示密码不对,所以很难找原因。
假设有A B两个文件,
A文件远程库有修改,本地代码同样的地方也有修改,pull时候一定冲突;
B文件远端有改了代码,但本地没改,单独更新会顺利,
但是git pull是所有文件同时更新的,因为A文件更新冲突,讲道理idea会提示冲突需要解决,
所以此时不会更新任何代码,哪怕是B文件;
但是,曾经工作时遇到了这样的情况,就是因为A冲突,pull失败,
但是其他远程有变化的文件却更新了下来,我并不确定什么原因,
但确实是有这么现象,当时是一家国家门面企业的自有类似github的仓库,
有可能是因为是因为这“自有仓库”的bug,因为我自己在gitee上测试了同样情况,并没有复现。
其实我也不太相信是公司的“自有仓库”的bug,最好是我当时有啥神奇操作,而自己并没有意识到,
才有了这个混乱事件,这样就说明所有工具 所有技术都是没问题的,是我个人记忆的错乱而已。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。