GIT的相关知识

442 阅读1分钟

1.git merge与git merge --no-ff的区别

(1).假设dev分支和qa分支都是在C2的时候,从master分支创建出来的,在dev分支上有一个或者多个提交(C4),现在我们想把dev分支合到master分支上,如果我们直接使用git merge命令,它默认是以fast-forward(快进)的方式进行合并的。即当顺着一个分支的head指针指向的节点走下去能到达另一个分支head指针指向的节点,git在合并两者时只会简单地移动指针,而不会创建一个新的commit对象。

(2).如果加上--no-ff参数,那么它就不会简单地去移动指针,而是会依据合并的结果做一个新的快照,创建一个新的commit对象指向它。

在上图的基础上把qa分支合到master分支上,结果如下:

(3).在使用Gerrit的时候出现的问题,使用 git merge命令 把dev分支合并到master分支之后,push master分支到Gerrit时,出现如下错误:

Total 0 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 1, done
To ssh://xxx.xxx.xxx.xxx:xxxxx/{project_name}
! [remote rejected] HEAD -> refs/for/master (no new changes)
error: failed to push some refs to 'ssh://xxxxxx@xxx.xxx.xxx.xxx:xxxxx/{project_name}'

Gerrit在审核的时候回根据commit id和change id来判断是不是新的提交,正如上面所说的单纯使用git merge命令,并且符合fast-forward条件的话,不会生成新的commit对象,只会单纯地移动指针,因此commit id和change id都不会变化,在推送到Gerrit的时候,Gerrit会判断内容相同而拒绝push。

解决办法:

1.上面所说的,加上--no-ff参数。

2.使用git commit --amend改变change id再push。