git-p4 基本操作,见 https://blog.csdn.net/u013272009/article/details/120166796
假设已经用 p4 sync 同步了 2 个 p4 分支:
client | client type | p4 远程地址 | 本地目录 |
---|---|---|---|
tl_fananchong_vm1 | stream client | //Torchlight/MainLineWithUGS/backend/ | /home/fananchong/MainLineWithUGS |
tl_fananchong_vmweek | stream client | //Torchlight/weeklineWithUGS/backend/ | /home/fananchong/weeklineWithUGS |
下面介绍,如何使用 git-p4 来做把 MainLineWithUGS 分支的代码合并到 weeklineWithUGS
举例说明:
把 git 仓库建在 /home/fananchong/git2/ugs/backend
mkdir -p /home/fananchong/git2/ugs/backend
pushd /home/fananchong/git2/ugs/backend
git init
popd
把 2 个 p4 分支同步到 git 仓库
pushd /home/fananchong/git2/ugs/backend
git p4 sync --branch=MainLineWithUGS //Torchlight/MainLineWithUGS/backend/...
git checkout -b MainLineWithUGS p4/MainLineWithUGS
git p4 sync --branch=weeklineWithUGS //Torchlight/weeklineWithUGS/backend/...
git checkout -b weeklineWithUGS p4/weeklineWithUGS
popd
检查 git 分支
fananchong@ubuntu-vm:~/git2/ugs/backend$ git branch -a
* MainLineWithUGS
weeklineWithUGS
remotes/p4/HEAD -> p4/MainLineWithUGS
remotes/p4/MainLineWithUGS
remotes/p4/weeklineWithUGS
至此, git 仓库对应 p4 的分支已经创建完毕
下面介绍如何多分支下,如何提交版本以及如何合并版本到其他分支
多分支下, git p4 rebase
命令不可以用。它没有提供参数来指定分支
不过看官方文档介绍:
This command does git p4 sync followed by git rebase to move local commits on top of updated p4 changes.
git p4 rebase
命令有 git p4 sync 与 git rebase 组成
实践下,确实可以完成多分支下,提交版本。
举例说明,以下命令可以完成提交:
# 本地操作,如
# git add xxx
# git commit -m "xxx"
# 下面演示如何提交
git p4 sync --branch=MainLineWithUGS
git rebase p4/MainLineWithUGS
P4CLIENT=tl_fananchong_vm1 git p4 submit --branch=MainLineWithUGS
如果遇到有代码冲突的,以下命令可以完成提交:
# 本地操作,如
# git add xxx
# git commit -m "xxx"
# 下面演示如何提交
git p4 sync --branch=MainLineWithUGS
git rebase p4/MainLineWithUGS
# 遇到冲突, IDE 中 git 插件提示有文件代码冲
# 手动解决冲突
# 然后重新提交改动的文件 xxx:
# git add xxx
# git commit -m "xxx"
git rebase --continue
P4CLIENT=tl_fananchong_vm1 git p4 submit --branch=MainLineWithUGS
举例说明(下面命令和命令的输出都显示,注意区分哪些是命令,哪些是输出):
# 先用 git log ,查看要合并的版本号。如 e55966e74515dfdb7760da8e9364e60f3f4ec109
git log
commit e55966e74515dfdb7760da8e9364e60f3f4ec109
Author: tl_backned_01 <tl_backned_01@p4d>
Date: Sat Sep 25 17:36:16 2021 +0800
test 1 2
[git-p4: depot-paths = "//Torchlight/MainLineWithUGS/backend/": change = 585088]
# 切分支
git checkout weeklineWithUGS
# 合并版本,注意一定要加 -e ,目的是注释掉`[git-p4: depot-paths = "//Torchlight/MainLineWithUGS/backend/": change = 585088]`
git cherry-pick -e e55966e74515dfdb7760da8e9364e60f3f4ec109
test 1 2
[git-p4: depot-paths = "//Torchlight/MainLineWithUGS/backend/": change = 585088]
#
# It looks like you may be committing a cherry-pick.
# If this is not correct, please run
# git update-ref -d CHERRY_PICK_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Author: tl_backned_01 <tl_backned_01@p4d>
# Date: Sat Sep 25 17:36:16 2021 +0800
#
# On branch weeklineWithUGS
# You are currently cherry-picking commit e55966e7.
#
# Changes to be committed:
# modified: test.txt
#
~
~
~
~
~
~
~
"~/git2/ugs/backend/.git/COMMIT_EDITMSG" 22L, 603B
# 下面提交,同上个章节内容,包括无冲突与有冲突 2 种处理
git p4 sync --branch=weeklineWithUGS
git rebase p4/weeklineWithUGS
P4CLIENT=tl_fananchong_vmweek git p4 submit --branch=weeklineWithUGS
整理下命令流程如下:
# 先用 git log ,查看要合并的版本号。如 e55966e74515dfdb7760da8e9364e60f3f4ec109
git log
# 切分支
git checkout weeklineWithUGS
# 合并版本,注意一定要加 -e ,目的是注释掉`[git-p4: depot-paths = "//Torchlight/MainLineWithUGS/backend/": change = 585088]`
git cherry-pick -e e55966e74515dfdb7760da8e9364e60f3f4ec109
# 下面提交,同上个章节内容,包括无冲突与有冲突 2 种处理
git p4 sync --branch=weeklineWithUGS
git rebase p4/weeklineWithUGS
P4CLIENT=tl_fananchong_vmweek git p4 submit --branch=weeklineWithUGS
重点说明:git cherry-pick -e <SHA>
如果不加 -e ,自动生成的提交注释种,有一行:[git-p4: depot-paths = "//Torchlight/MainLineWithUGS/backend/": change = 585088]
会导致,git p4 submit
去操作 MainLineWithUGS 分支,进而引发提交失败
这里 p4 client 类型设定上有个矛盾:
client type | view | 矛盾点 |
---|---|---|
stream client | 本分支 veiw | 可提交代码,但是没法设置多个 view |
no stream client | 无限制 view 个数 | 可以设置多个分支 view ,但是没办法提交代码 |
我们合并好代码是要提交的,所以只能是 stream client 。所以需要手动加 -e 注释掉那行注释
PS. 如果有读者知道很好的处理方式,请留言告知
以上