Git+IntellijIDE是当前最流行的开发工具组合,相信用过的人都体会到了他们的强大和易用。下面就对使用该工具接近一年,写一个总结,以备后来者学习和借鉴。
首先,安装git和IDE工具,以及搭建git服务器,不在本次总结之内。假定,以上已经配置完整。
1 生成SSH KEY
1.1 打开Git Bash,输入ssh-keygen -t rsa运行命令,按提示设置安装目录及密码,按enter键安装在默认目录(通常为C:\Documents and Settings\username\.ssh\ 或者 C:\Users\username\.ssh)。key密码为空。注意,过程中不要改名字,使用默认就可以。
1.2 到默认路径下面去找.ssh文件夹里面的id_rsa和id_rsa.pub文件。id_rsa.pub里面就是生成的SSH key。
1.3 将id_rsa.pub文件发给GIT管理员
2 设置Git用户名和Email
git config --global user.name "xxx"
git config --global user.email "xxx@gmail.com"
git config –list
3 git clone项目
打开IDE,如下图,点击git,
输入git的地址
如果需要修改远端地址,在项目根目录,运行git bash 命令
git remote set-url origin git@192.168.0.158:java/sps.git
git remote -v
4 git 日常操作
使用git 和其他的vcs版本管理工具一样,每天上班先git pull,下班commit的习惯。并且每次commit之前,最好做一下git pull,这样产生的冲突会比较少。
下面就以日常最常用的命令,来讨论。
4.1 git pull/fetch
这个主要注意,从远端下载代码和本地冲突的情况,如果产生冲突,一定要仔细解决,避免误删别人的代码,其他的解决冲突都要遵循此原则:切记删除别人的代码。
4.2 git commit
及时commit本地修改,到本地版本库,避免失误删除做的工作。Commit之前,一定记得pull一下远端分支,减少冲突。
如果遇到冲突,选择手动合并,对冲突文件进行修改,然后git add进去,commit会继续进行。
例如:
在Git merge中没有提到,如果没有冲突才会自动合并,否则将会提出哪些文件产生了冲突。产生冲突的原因是因为有多个开发人员修改了同一个文件的相同地方导致,使得Git系统不知道使用谁的代码,此时就需要开发人员自己来抉择,选择其中一份代码,并且将其他的代码删除。
假设研发-A和研发-B两位同事同时开发网络聊天功能,因此,他们同时修改了Chat.java文件的eat函数。研发-A首先提交了代码到线上的版本控制系统,然后研发-B此时从线上系统更新代码下来,此时就会产生冲突。当然,在不同分支之间切换开发也可能导致发生冲突,或者说只要是代码合并的操作都有可能出现冲突,原因也是同时修改了文件中的同一处代码段。例如Chat.java的原始代码为:
public class Chat { public static void main(String[] args) {
System.out.println("Chat with me");
}
}
研发-A在master分支上修改了Chat.java的main函数的第一行代码,代码如下:
public class Chat { public static void main(String[] args) {
System.out.println("Chat with me, I'm RD-A.");
}
}
研发-B在net分支也修改了同样的地方,代码如下:
public class Chat { public static void main(String[] args) {
System.out.println("我和研发-A的代码不一样.");
}
}
此时,研发-B提交代码到线上系统之后,研发-A将net分支代码同步到本地,并且将net分支通过Git merge合并到master分支。此时就会引发冲突,如图8-16所示。
图8-16 产生冲突
从图8-16中可以看到,图中指出自动合并失败,Chat.java产生了冲突。我们看看此时Chat.java文件中的内容是怎样的:
public class Chat { public static void main(String[] args) {
<<<<<<< HEAD
System.out.println("Chat with me, I'm RD-A.");
=======
System.out.println("我和研发-A的代码不一样.");
>>>>>>> net
}
}
其实很容易看懂这份冲突的文件,它的意思是,在System.out.println()语句这里出现了多份代码,Git不知道如何解决。在我们的示例中,在“<<<<<<< HEAD”与“=======”之间的是研发-A的master分支的代码,而“=======”与“>>>>>>> net”则是研发-B的net分支中的代码。这两份代码到底要哪一份,这需要你来裁决,因此,给出了冲突提示。假设研发-A的代码是正确的,那么需要将“=======”与“>>>>>>> net”之间的代码删除,并且将“<<<<<<< HEAD”、“=======”、“>>>>>>> net”这些冲突标识也删除。最终代码如下:
public class Chat {
public static void main(String[] args) {
System.out.println("Chat with me, I'm RD-A.");
}
}
此时,冲突就已经被处理了。重新Git add和commit提交代码即可。
4.3 git stash/unstash
该功能相当好用,可以将本地修改,stash暂存本地工作环境,做其他的操作(修复主分支的bug),完成之后,在unstash恢复本地工作环境
4.4 git push
多次commit完成之后,需要将本地仓库同步到远程仓库,供团队其他成员使用。一般使用如下配置推送,
其中,push为默认选择,推送到远程,进行同步,force push 为强制本地版本覆盖远端版本,push tags将本地的tag push 到远端,这些操作都对应git bash中的命令,有兴趣可以自己查阅。
4.5 git merge
该命令是将其他分支的提交合并到当前分支,一般使用如下配置即可,
本地当前在dev 分支,这个操作是将master分支的所有提交merge到本地dev上,合并策略一般默认即可。
4.6 git tag 操作
git pull –tags
git push –tags
git tag –d tag1.0