Git, Gerrit, Hudson (3) -- GIT 技巧总结

1. 解决远程冲突

由于有 code review 的存在,有可能出现这种情况:同时有多个人的代码被 review,如果有一个人改了与你相同地方的代码,并且他的代码先通过 review 并被合进了远程代码库。当你的代码通过 review 并进行合并,此时会产生冲突。由于冲突是发生在远端,不能采用在本地 rebase 的办法,此时需要采取以下步骤来解决冲突:

# 进入工程,假设是ProjectA
cd ProjectA
# 切换到需要被合并的特征分支,例如 FixForBug1922
git checkout FixForBug1922
# 从远程获取代码
git fetch origin
# rebase 到远程分支,命令为 git rebase origin/<remote_branch>
git rebase origin/1.0.1

# rebase 的时候会提示冲突,手动合并冲突

# 将解决冲突后的文件重新加入
git add <conflict_file>
# 继续 rebase
git rebase --continue
# 成功后将最新的特征分支 push 到远端
git push origin FixForBug1922:refs/for/1.0.1

注意:push 后需要重新进行 code review

以上步骤中有一步:git fetch 。fetch 是比 pull 更细粒度的操作。fetch 是将远端的代码拿下来,而 pull 是执行 fetch 后再与本地的代码合并。所以上面的命令实际是告诉 git 把远端的代码拿下来,但是不要合并(因为我们现在是在特征分支上,合并肯定会冲突出错)。fetch 命令会自动在本地创建一个远程分支的本地拷贝,此拷贝我们不能直接操作(如果你强行调用 git checkout 去切入这个拷贝,git 会自动创建一个本地分支,并切入到那个自动创建的本地分支上)。我们还是使用 rebase 命令重新放置特征分支并解决冲突。

2. 本地 branch 改名

有时候想重命名本地 branch, 命令如下:

git branch -m <old_branch> <new_branch>
# 例如,重命名 feature branch "FixBug123" 至 "FixBug124"
git branch -m FixBug123 FixBug124
 

3. 合并本地 branch

有时候想在本地将一个 branch 的内容合并到另一个 branch 上。比如,假设在做修改之前没有新建一个 feature branch,而是在原来的 feature branch 上做了修改,push 的时候发现这个 feature branch 所关联的远程的 review 已经通过了(或被 abandon 了),此时会 push 不上去。有一个解决办法就是另外新建一个 feature branch ,然后将新建的修改的内容合并到新的feature branch 上。使用 merge 命令:

# 创建并切换至新的 feature branch
git checkout -b <new_feature_branch>
# 在新 branch 上 merge 旧的 branch
git merge <old_feature_branch>

merge 命令的语法与 rebase 相似,都是先切换到新的 branch 下,然后 merge/rebase 被复制的 branch。例如:

# merge FixBug123 上的内容至 FixBug125
# 1. 切换回 tracking branch:
git checkout 1.0.0
# 2. 在此基础上创建并切换新的 feature branch
git checkout -b FixBug125
# 3. 在新 feature branch 上 merge:
git merge FixBug123
 

3. 删除本地分支

如果想删除某一本地分支,可执行如下命令:

git branch -D <local_branch>

4. Gerrit上创建新工程

首先,你的用户需要在 Gerrit 上拥有 Administrator 的权限,否则无法执行一下命令

打开 git bash ,如果本地已经有工程了,进入到工程的根目录。键入如下命令:

ssh -p 29418 review gerrit create-project --name <project_name> --parent <parent_name>

其中 <project_name> 就是要创建的工程的名字,<parent_name> 是父工程的名字(这个是可选的,此处声明父工程可以从父工程中继承很多属性,以免重复设置)。

登录 Gerrit ,在 Admin->Projects 中可以看到新建的工程(目前是空的),选择 Admin->Projects->[project_name]->General ,可以在 Description 中输入工程的描述,在 Project Options 中,推荐选择 'Cherry Pick' ,并勾选 'Automatically resolve conflicts' 和 'Require Change-Id in commit message' 。最后保存。

然后,在 git bash 中继续输入 (注意要在工程的根目录下):

# 初始化,会自动创建 .git 隐藏文件夹
git init
# 加入所有文件夹
git add *
# 加入 .classpath 文件
git add .classpath
# 加入 .project 文件
git add .project
# 提交,并输入 comments
git commit

将本地提交 push 到远程(此时应该在 master 上):

git push origin master:refs/for/master

以上操作将在 Gerrit 上生成一个新的 review,找人 review 直至通过,代码才会 merge 到远程库中。

选择 Admin->Projects->[project_name]->Branches,输入 'Branch Name' 和 'Initial Revision'(一般填 master)创建远程分支。

在本地 git bash 中执行 pull 命令:

git pull

这样会把刚才创建的远程分支信息拉到本地,现在可以在本地创建 Tracking Branch 链接远程分支:

git checkout -b 1.0.0 -t origin/1.0.0

猜你喜欢

转载自johnshen0708.iteye.com/blog/1487760