二、远程仓库的使用
1、首先要注册github账号
2、添加SSH Key
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以要创建SSH Key
首先要在本地生成公钥私钥,可以通过git命令生成,前提要安装git,git命令如下:
ssh-keygen -t rsa -C youremail@example.com,邮箱改成自己的邮箱
生成过后,公钥路径C:\Users\用户名\.ssh\id_rsa.pub
打开eclipse,会看到它会自动扫描到
登录账号后,点击settings->SSH and GPG keys,再点击new SSH key,将id_rsa.pub文件中的东西全部复制到key里
3、新建远程仓库
github主页点击new repository来新建远程仓库,建好后如下显示:
记得要把远程地址复制一下,SSH后面的地址就是连接到远程仓库的URI
4、eclipse中的配置
进入window->preference->Team->Git->Configuration
配置user settings(见egit笔记一)
配置Repository settings
简单的办法就是在.git的config文件中添加
[branch "master"]
remote = origin
merge = refs/heads/master
[remote "origin"]
url = git@github.com:lxjcumt/testrepo.git
fetch = +refs/heads/*:refs/remotes/origin/*
添加完后应该有如下显示:
5、推送(push)主分支到远程主分支
右键仓库点击push
显示如下:
点击next,会连接到远程仓库(有时会因为连接github太慢出现超时)
选择原分支和目标分支,点击add
点击finish,本地仓库就会推送到远程仓库
打开github,会发现仓库里有了创建的项目
6、从远程pull最新版本
假如远程仓库修改了版本,而本地没有跟着更新的话,本地向远程push的时候就会被rejected,这时就需要从远程pull最新版本
成功后显示如下:
pull过程,也可以被fetch+merge取代
7、冲突解决
当将本地版本和远程版本合并时,若同时修改了同一个文件,就会发生冲突。
比如本地和远程同时修改了hello.java文件,
本地修改为:
package javapro;
public class hello {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("本地修改");
}
}
远程修改为:
package javapro;
public class hello {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("远程修改");
}
}
先从远程fetch远程主分支:
右键仓库->fetch->finish
目前还没有合并,所以history显示如下,此时本地主分支分出了一个远程分支。本地版本号是c239849,fetch下来的远程版本号是2500350
然后合并两个分支,右键仓库->merge,显示如下:
点击merge,显示冲突:
本地源文件被修改为如下:
<<<<<HEAD下面的是本地冲突内容,=======是分割线,>>>>>>refs/remotes/origin/master是远程冲突内容。
项目文件图标也会有红色标记,如下图:
项目右键->team->merge tool
显示如下,选择第二个选项:
就会显示如下图:
可以看到左边是本地版本,可以修改,右边是远程版本,不能修改。
将左边修改如下:
打开源文件就会发现源文件hello.java也被修改了,此时再将项目add to index,在git staging窗口进行commit
此时两者已经合并,如下图:
此时就可以向远程仓库进行push合并后的版本了。
tips:对于二进制文件的冲突,你肯定不想通过编辑二进制文件来解决冲突,那是不可能完成的事情。
你要做的就是:要么选择对方的修改,要么选择自己的修改。
但是我不知道怎么在eclipse上操作,所以可以用命令行
你可以用git checkout的--theirs
或--ours
选项。
git checkout --theirs YOUR_BINARY_FILE
// git checkout --ours YOUR_BINARY_FILE
或者
冲突二进制文件剪切到桌面,修改commit到本地,pull,再从桌面剪切回去,commit,push(如果选择别人的文件就不用剪切回去了)
或者
push的时候选中Force Update强制覆盖