我有一个有几个成员的团队,我们的工作是基于另一个GIT回购,我们不允许推动。我们称之为repoA。
我们建立了自己的GIT服务器,最初是从repoA克隆的。我们称之为克隆的repo repoB。
我们的团队致力于repoB,但repoA不断发展。维护repoA的团队不关心我们的工作,也不希望我们的代码“污染”他们的工作,但我们希望得到他们的更改并将它们合并到我们的repoB中。
所谓的'merge'可能有点奇怪:我们将repoA中的大部分更改合并到repoB中,但保持一些代码不变,例如我们根据自己的要求更改的方法。
我还希望合并在'历史树'中可见,例如Git GUI的[Repository] - > [可视化所有分支历史],或Tortoise Git的[显示日志],所以我可以清楚地知道,在哪一天,从哪个提交,我从repoA进入我的repoB'同步'。如果我可以在Git GUI和TortoiseGit的历史地图中显示“合并线”,那会更好。
我知道一些“丑陋”的做法,例如:
通过这种方式,我可以:
但是他们采用任何“优雅”的方式吗?
我认为这应该是一个非常常见的要求,例如创建基于公共Linux项目的私有Linux核心,更改一些代码但仍希望保持其他部分与公共Linux项目保持同步,并且显示历史,在这个,今天,我们的项目已经与那个Linux核心版本保持一致。
“ProGit”一书只提供了一些概念,但似乎没有详细的解决方案。或者任何人都可以让我知道我应该参考哪一节?
答案 0 :(得分:0)
<强>分支机构强>:
master
,pick_change
,local_main
,<强>角色强>:
pick_change
所有者,local_main
所有者, master
与A-B-C-D-E-F
类似。我们假设您的项目始于C
,因此RepoB所有者会从local_main
创建pick_change
和C
。
当master
继续C-D-E-F-G-H
时,您的团队需要E
和G
,因此pick_change
所有者会选择E
和G
到pick_change
并将其推送到您的核心仓库。 pick_change
现在就像C-E'-G'
。
local_main
所有者在必要时创建主题分支,例如dev_20171016
,来自local_main
上的某个提交。然后工人们下载dev_20171016
并继续工作。他们将提交上传到dev_20171016
。他们不允许直接对local_main
或pick_change
进行更改,他们也不需要关心RepoA的master
。他们可以获取local_main
和pick_change
并将它们合并到其本地分支中以进行测试。我们不允许推送已与local_main
或pick_change
合并的本地分支。
准备就绪后,local_main
所有者将pick_change
和dev_20171016
与local_main
合并到--no-ff
,然后将local_main
推送到pick_change
你的中央回购。
由于RepoA不适用您的提交或更改,因此当您将提交提交到pick_change
时,很可能会发生冲突。这可能很烦人。 local_main
所有者和git rerere
所有者最好启用int main(int, char**)
{
Mat gray=imread("Depth_frames_27/Image23.png",0);
namedWindow( "Gray", 1 ); imshow( "Gray", gray );
// Initialize parameters
int histSize = 256; // bin size
float range[] = { 0, 255 };
const float *ranges[] = { range };
// Calculate histogram
MatND hist;
calcHist( &gray, 1, 0, Mat(), hist, 1, &histSize, ranges, true, false );
double minVal=0, maxVal=0;
minMaxLoc(hist, &minVal, &maxVal, 0, 0);
// cout<<"Max:"<<maxVal<<endl;
// cout<<"Min:"<<minVal<<endl;
// Show the calculated histogram in command window
double total;
total = gray.rows * gray.cols;
for( int h = 0; h < histSize; h++ )
{
float binVal = hist.at<float>(h);
cout<<" "<<binVal;
}
// Plot the histogram
int hist_w = 512; int hist_h = 400;
int bin_w = cvRound( (double) hist_w/histSize );
Mat histImage( hist_h, hist_w, CV_8UC1, Scalar( 0,0,0) );
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
for( int i = 1; i < histSize; i++ )
{
line( histImage, Point( bin_w*(i-1), hist_h - cvRound(hist.at<float>(i-1)) ) ,
Point( bin_w*(i), hist_h - cvRound(hist.at<float>(i)) ),
Scalar( 255, 0, 0), 2, 8, 0 );
}
namedWindow( "Result", 1 ); imshow( "Result", histImage );
waitKey();
return 0;
}