git-maven

git

常用命令

origin 在 git 里是 远程主机名
git status 命令,用来查看发生变动的文件
git checkout –b dev 创建并切换分支
git merge dev 合并指定分支到当前分支
git push origin dev 该分支上的所有本地提交推送到指定的远程分支
git checkout -b dev origin/dev 抓取分支:创建远程origin的dev分支到本地(默认的clone 后只有 master分支)
git branch –set-upstream-to origin/dev 设置当前分支和origin/dev的链接(否则 git pull 等远程指令会失败)
rebase 与 merge
要是想要干净的、线性的提交树,使用rebase操作会好一点,这样可以在一条线上看到每一次提交,并且没有增加提交节点。
但是如果你想要保存项目完整的历史,并且避免重写公共分支上的 commit,就用merge。
git push origin –delete branchname 删除远端分支
撤销操作
git reset [上次提交] 回退临时提交,工作区保持不变
git reset –hard [commit_id] 退回到指定分支
git rm –cached [filename] 从暂存区撤销文件
git stash | pop 暂时将未提交的变化移除,稍后再移入

一般研发流程

master; 迭代分支;研发分支-自己的迭代分支;
研发分支1 rebase 迭代分支,研发分支1 mr 迭代分支;…..;
迭代分支 mr master分支。

Git 原理入门

一些概念

  • 项目的历史就是由不同时点的快照构成。快照在 Git 里面有一个专门名词,叫做 commit,生成快照又称为完成一次提交。
  • 所谓快照,就是保存当前的目录结构,以及每个文件对应的二进制对象。
  • 所谓分支(branch)就是指向某个快照的指针,分支名就是指针名。
  • 每一个分支都是一个文本文件,保存在.git/refs/heads/目录,该文件的内容就是它所指向的快照的二进制对象名(哈希值)。
  • Git 有一个特殊指针HEAD,对应的文本文件为.git/HEAD,内容为当前的分支。

git实体

  1. 文件二进制对象
  2. 目录二进制对象
  3. 提交对象
  4. 分支
  5. 特殊指针HEAD

对象所在目录:.git/objects;
指针存在文本文件中;
分支目录为:.git/refs/heads/;


git命令

1
2
3
4
5
git hash-object -w test.txt   
git cat-file -p e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
git update-index --add --cacheinfo 100644 3b18e512dba79e4c8300dd08aeb37f8e728b8dad test.txt
git write-tree
echo "second commit" | git commit-tree 1552fd52bc14497c11313aa91547255c95728f37 -p c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

git log的运行过程是这样的:

  1. 查找HEAD指针对应的分支,本例是master
  2. 找到master指针指向的快照,本例是785f188674ef3c6ddc5b516307884e1d551f53ca
  3. 找到父节点(前一个快照)c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
  4. 以此类推,显示当前分支的所有快照

分支指针是动态的。原因在于,下面三个命令会自动改写分支指针。

  • git commit:当前分支指针移向新创建的快照。
  • git pull:当前分支与远程分支合并后,指针指向新创建的快照。
  • git reset [commit_sha]:当前分支指针重置为指定快照。

文章看懂后反而抑郁了?
git hash-object 是怎么将文本转换成压缩二进制的;
sha 算法干了件什么事?为什么要用;
git 为什么会有暂存区?或者说 git的分布式方案的优点;

git其他文章

Git 原理入门
Github 的清点对象算法

常用 Git 命令清单
如何撤销 Git 操作?
git cherry-pick 教程(将指定的提交应用于其他分支)
git bisect 命令教程(查找哪次提交导致的错误)

Git 工作流程
Git 使用规范流程
Git 远程操作详解
Git 分支管理策略

maven

mvn package -Dmaven.test.skip=true
mvn dependency:tree
mvn dependency:tree > tree.txt 将命令输出指定到文件
mvn clean compile -U -Dmaven.test.skip=true 清理本地依赖

1
2
3
<artifactId>maven-surefire-plugin</artifactId>  
<configuration>配置单元测试 使用的框架等信息</configuration>
<executions>配置集成测试 使用的框架,测试类的 xml文件等信息</executions>

以上知识基于现在项目中的使用

  1. 多 Module 的 Project ,模块之间一般是同一个项目业务,且彼此之间存在 maven 依赖关系;
    任何一个 Module 引入了某组件,工程的 Libraries 下都会有该组件,因此需要一个个排除或调解;
    父pom 的作用是指定 依赖的版本号,Module 中即不必重复指定。
  2. 依赖排除:下面代码
  3. 依赖调解:下面代码
    路径最短等,仅仅对该 pom 工程起作用,调解的结果并不能向下传递;
    maven idea 分析 xxx.jar 被哪些工程使用(libraries –> 右键改jar –> 分析使用)。
  4. 依赖传递
    依赖中依赖的坐标 没有指定版本时会去 父pom 中去找版本号,所以默认是 父pom指定的版本号,也可主动申明去覆盖。
  5. maven 的依赖传递会带来很多的问题(或者说这是项目做大了造成的原因),如某个类冲突,版本升级引发更多问题;
    解决这些问题需要对各种依赖的功能很清楚,并对依赖间的关联关系较清楚,最好很熟悉项目的骨架。
  6. 本地setting.xml不一样,确实会导致同样的工程,打出不一样的包,maven 非常奇怪的行为,可以切换本地setting.xml文件,并换一个新仓库打包试下。
  7. maven 依赖导致的程序启动报错问题排查步骤(日志类报错):
    • 首先看 该类在当前应用中 是否存在多个(在不同依赖中,有两个完全一样的这个类,加载了错误的类导致程序报错)。
    • 再分析是否符合日志引用规范(列出所有的 日志api和日志实现等)。
1
2
3
4
5
6
7
<exclusions></exclusions> 可以排除任何下层引入的依赖。  
<!-- 最强排除,排除所有的commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>99.0-does-not-exist</version>
</dependency>

Github 配置SSH

1
2
3
4
5
6
7

ssh-keygen -t rsa -C "xxx@126.com"
ssh-agent -s
eval `ssh-agent -s`
ssh-add
clip < ~/.ssh/id_rsa.pub
ssh -T git@github.com