我有三个分支first
、second
和master
:
D---E---F first
/
A---B---...---C---... master
G---H second
first
是最终版本,正在等待作为单个压缩提交合并到master
中second
仍在开发中
我想定期检查与first
合并的second
在second
中出现新的提交后是否仍能正常工作。
我有两个存储库:
- 在
repo1
,我只需将新的提交I
和J
添加到second
,并将它们推送到origin
- 在
repo2
,我的工作分支是second
,它已在first
的基础上重新建立。我永远不会推送它,repo2
只用于本地构建检查
repo1
D---E---F first
/
A---B---...---C---... master
G---H---I---J second, origin/second
repo2
$ git checkout second
$ git rebase first
D---E---F first
/
A---B---...---C---... master
D'--E'--F'--B'--...---C'--G---H second
重要的是,提交E
(E'
)会导致整个项目的长期重建,所以我希望它永远不会被重新应用,并保持原样。
这就是为什么我不能使用:
git pull -r
在second
上,因为它会重新排列所有提交并导致此
repo2
A---B---...---C---G---H---I---J---D'--E'--F' second
此外,我不能使用快速转发拉,因为repo2
和origin/second
中的second
分叉。但我的猜测是,像快速拉动这样的事情确实是可能的。它应该产生以下结果:
repo2
D---E---F first
/
A---B---...---C---... master
D'--E'--F'--B'--...---C'--G---H---I---J second
我可以用一些Git命令序列来模仿它吗?
从您的repo2
:您可以检查origin1/second
的状态,然后运行git fetch
,检查新状态,并尝试选取delta:
before=$(git rev-parse orgin1/second)
git fetch origin1
after=$(git rev-parse orgin1/second)
if [ "$before" != "$after" ]; then
git checkout second
git cherry-pick ${before}..${after}
fi
如果您不仅需要使用硬编码的second
分支,还需要使用任何活动分支:
branch=$(git branch --show-current)
before=$(git rev-parse origin1/$branch)
git fetch
...
或者,如果您想将要获取的分支作为参数传递:
branch=$1
if [ -z "$branch" ]; then
branch=$(git branch --show-current)
fi
或者。。。