Git跟踪外部/公共/远程分支,同时合并到本地服务器

时间:2017-10-16 10:45:38

标签: git merge

我有一个有几个成员的团队,我们的工作是基于另一个GIT回购,我们不允许推动。我们称之为repoA。

我们建立了自己的GIT服务器,最初是从repoA克隆的。我们称之为克隆的repo repoB。

我们的团队致力于repoB,但repoA不断发展。维护repoA的团队不关心我们的工作,也不希望我们的代码“污染”他们的工作,但我们希望得到他们的更改并将它们合并到我们的repoB中。

所谓的'merge'可能有点奇怪:我们将repoA中的大部分更改合并到repoB中,但保持一些代码不变,例如我们根据自己的要求更改的方法。

我还希望合并在'历史树'中可见,例如Git GUI的[Repository] ​​ - > [可视化所有分支历史],或Tortoise Git的[显示日志],所以我可以清楚地知道,在哪一天,从哪个提交,我从repoA进入我的repoB'同步'。如果我可以在Git GUI和TortoiseGit的历史地图中显示“合并线”,那会更好。

我知道一些“丑陋”的做法,例如:

  • 将repoA的主人拉为我自己的主人,但我所有的团队都提交并推送 到一个名为'local_main'的分支。总是把repoA的主人拉到我的 然后,本地主人然后创建一个临时分支'pick_change' 切换到'local_main'并合并'pick_change',然后删除分支 在本地'pick_change',并将'local_main'推送到我的GIT服务器。

通过这种方式,我可以:

  • 选择有用的代码到我的分支机构。
  • 在不更改origin / master
  • 的情况下保留我不想要的代码
  • 清楚地看到从主分支到我的分支的'分支合并'曲线 Git GUI中的'local_main'分支或TortoiseGit的提交历史图, 让我知道那个提交合并了 我的'local_main'的提交的origin / master。

但是他们采用任何“优雅”的方式吗?

我认为这应该是一个非常常见的要求,例如创建基于公共Linux项目的私有Linux核心,更改一些代码但仍希望保持其他部分与公共Linux项目保持同步,并且显示历史,在这个,今天,我们的项目已经与那个Linux核心版本保持一致。

“ProGit”一书只提供了一些概念,但似乎没有详细的解决方案。或者任何人都可以让我知道我应该参考哪一节?

1 个答案:

答案 0 :(得分:0)

<强>分支机构

    RepoA的
  1. master
  2. RepoB的
  3. pick_change
  4. RepoB的
  5. local_main
  6. RepoB的主题分支。
  7. <强>角色

    1. RepoB所有者,
    2. pick_change所有者,
    3. local_main所有者,
    4. RepoB的工人。
    5. RepoA的

      masterA-B-C-D-E-F类似。我们假设您的项目始于C,因此RepoB所有者会从local_main创建pick_changeC

      master继续C-D-E-F-G-H时,您的团队需要EG,因此pick_change所有者会选择EGpick_change并将其推送到您的核心仓库。 pick_change现在就像C-E'-G'

      local_main所有者在必要时创建主题分支,例如dev_20171016,来自local_main上的某个提交。然后工人们下载dev_20171016并继续工作。他们将提交上传到dev_20171016。他们不允许直接对local_mainpick_change进行更改,他们也不需要关心RepoA的master。他们可以获取local_mainpick_change并将它们合并到其本地分支中以进行测试。我们不允许推送已与local_mainpick_change合并的本地分支。

      准备就绪后,local_main所有者将pick_changedev_20171016local_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; }