场景:
gerrit 上有project A,A有分支B,需要基于project A新建一个project A1,及分支B1,分支B1代码同B。
步骤:
- gerrit上project->create a new project. 填入名称A1,勾选Init empty commit,建立新的project A1。
- 新建branch B1,branches,填写branch name:B1。
- 终端clone A代码。并进入代码目录。git remote -v 及git remote show查看远程库信息。此时,应该只有gerrit上A的远程代码库名origin(可有不同)及url。本地分支B->origin/B。
- git remote add origin_new gerrit仓库A1url。
其中origin_new可自定义,要与A远程库名区分开。 - git remote -v 及git remote show 查看远程库信息。
此时该文件夹对应A A1两个远程代码库。 - git fetch origin_new B1:B2。
此时会创建本地分支B2对应远程库A1的分支B1,即 origin_new 对应A1库。本地分支B2->origin_new/B1 - git checkout B2。
- git merge origin/B。
- git push origin_new B2:B1
此方法可用于不同库之间的代码提交。
知识点:
git fetch 用法:
git fetch origin branch1
这个操作是git pull origin branch1的第一步, 而对应的pull操作,并不会在本地创建新的branch。这个命令可以用来测试远程主机的远程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 抛出一个异常.
git fetch origin branch1:branch2
首先执行上面的fetch操作,使用远程branch1分支在本地创建branch2(但不会切换到该分支),如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,
如果本地存在branch2分支, 并且是`fast forward’, 则自动合并两个分支, 否则, 会阻止以上操作.
gerrit的权限管理reference。Reference是代码提交的目的地(分支或Tag),Gerrit的权限管理是基于reference进行。默认reference是“refs/heads/”,这个通常不需要修改。"refs/"是控制所有提交的reference。
一般提交要加refs/for/branchname。如git push origin HEAD:refs/for/main_dev。之后需进行review及submit才可进库。
具有管理权限的账户,可直接不加refs/for进行提交,如:
git push origin master
git push origin main_dev:main_dev
这样的提交会直接入库,不需要review及submit。所以要尽量小心。
强制将本地代码与远程库中保持一致。
git fetch --all
git reset --hard origin/master
git pull
主要执行git reset --hard origin/branchname
–hard 强制使本地源码恢复与远程仓库一致;
不加–hard 本地提交与远程仓库保持一致,但是,本地代码没有修改。应该是。
若不小心提交了一些代码进入远程库。记submit。想撤回。只有通过本地代码revert到先前的提交,会生成一条关于revert的新的commit,再push入库。
git revert commit哈希值 或者git revert HEAD^ 退到前一次提交。
reset与revert:
reset 会消除提交历史;
revert 会新生成一个提交记录,表明恢复到哪一次提交。不会删除提交记录。