让我来描述我的情况:
Blond先生和Orange先生正在研究分支A,它在提交M1的主分支上分支出来.分支A有2个提交:A1和A2.
M1
\
\
A1 - A2
Run Code Online (Sandbox Code Playgroud)
与此同时,奥兰治先生承诺并在主分公司M2和M3上多推了两笔.
M1 - M2 - M3
\
\
A1 - A2
Run Code Online (Sandbox Code Playgroud)
布朗先生从遥控器拉出来,过了一会儿决定重新进入主分支:
M1 - M2 - M3
\ \
\ \
A1 - A2 A1` - A2`
Run Code Online (Sandbox Code Playgroud)
现在A1`和A2`是在先生金发的本地存在的衍合的提交,以及A1和A2远程存在.金发先生推动他的提交,使用-f强制他的改变并"重写"历史.现在远程存储库看起来像这样:
M1 - M2 - M3
\
\
A1` - A2`
Run Code Online (Sandbox Code Playgroud)
但奥兰治先生也在A分公司工作.他的本地存储库仍然如下所示:
M1 - M2 - M3
\
\
A1 - A2
Run Code Online (Sandbox Code Playgroud)
Orange先生需要做什么才能与远程存储库中的A分支同步?
正常拉动不起作用.请拉-f强制远程本地的更改?我知道删除本地版本的A并从远程存储库再次提供它将会起到作用,但这似乎并不是实现这一目标的好方法.
我发现这种方式更容易合并分支和更少的冲突:
将trunk复制到新分支,将其与功能分支合并.完成任务后,将新分支合并回主干.这种技术非常像mercurial和git rebasing.
我过去常常将trunk中的任何变换合并到featurech/s.但后来当我将功能分支合并回主干时,来自主干的一些内容将再次合并回主干,这引起了很多冲突.有一个重新整合合并的选择,但它似乎并不适合我.
有没有人做类似的颠覆变基?我刚刚开始这样做,并没有看到任何副作用.这会导致任何不可预见的问题吗?
我有一个功能分支和一个主分支.
Master分支已经发展,我的意思是让这些更新尽可能少地与master分支发生分歧.
所以我git pull在两个分支,git checkout feature/branch最后git rebase master.
现在,我要么期望一切顺利运行,要么在继续rebase之前需要解决冲突,直到所有主提交在功能分支上成功重新应用.
现在在我的案例中真正发生的是我不明白的事情:
$>git rebase master
First, rewinding head to replay your work on top of it...
Applying: myFirstCommitDoneOnTheBranch
Applying: myOtherCommitDoneOnTheBranch
$>git status
On branch feature/branch
Your branch and 'origin/feature/feature' have diverged,
and have 27 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean
$>git pull
*load of conflicts*
Run Code Online (Sandbox Code Playgroud)
现在,我可以理解他在拉动之后加载了冲突; 我不明白需要拉.从逻辑上讲,它应该在分支时回滚到master,保存在分支上进行的提交,转发到master上的最新提交,然后应用保存的提交.
我不明白 …
据我所知,当我使用时git pull --rebase,git将重新编写历史记录并在我刚从中提取的分支中的所有提交之后移动我的本地提交.
我不明白的是这将是一件多么糟糕的事情.人们谈论陷入困境git pull --rebase,你最终会找到一个别人无法忍受的分支.但我不明白这是怎么回事,因为你所做的就是在你所从的分支上重播你当地的,尚未公开的提交.那么,那里的问题是什么?
我的老板最近决定尝试一个"增加容量"的外包小组,因为我们修改现有的应用程序以添加新功能.尽管我担心他所选择的小组似乎并没有很好地沟通,也没有提出足够的问题来真正理解和有效,但我们还是和他们一起去了.
我们将它们设置为在我们的Git存储库(托管在GitHub上)上进行协作.我们为他们创建了一个分支(TheOutsourcedBranch,我们称之为),并要求他们在这个分支中完成所有工作.
此外,我们要求他们在每天结束时推送他们的提交,以便我们可以很好地了解他们的工作速度,以及(更重要的是)他们的代码有多好.
今天他们第一次推了推.五个提交,所有这些都是主人.我正在试图弄清楚如何将他们的提交从master转移到TheOutsourcedBranch,而不会丢失他们已经完成的工作(尽管从它的外观来看,无论如何我们都不得不扔掉它).

橙点是他们的承诺,灰点是我的.
我知道有很多关于变基的问题(这可能是我在这里需要做的)但我很难弄清楚哪些适用于我的具体情况.如果重要的话,外包集团和我自己是现在唯一真正使用回购的人.
提前致谢!
编辑: 我可能已找到我正在寻找的内容:使用Git将最近的提交移动到新的分支
不过,我想检查一下我的理解.在本地,我创建了一个主要的分支(TheOutsourcedBranch),它将包含所有AH.然后我将主人重置为C.主人现在包含AC.
假设这是正确的,那对我(本地)来说没问题.但是,我需要做些什么才能"强制"远程存储库(GitHub)接受我对本地事件如何发挥作用的本地视图并丢弃其历史版本?
一旦这个问题发生了,我想我可以重新解决这个问题,使其更具通用性/信息性,并减少一些毛病 - 否则它可能是一个很好的删除候选人,我猜.
我们的团队在工作中热情地采用了rebase工作流程,但我们可能会有一点被带走,这就是这个问题的关键点:你是法官.
使用pull --rebase现在对我来说很简单.但是,我们还有多个人工作的大型功能分支.我们希望定期引入master上发生的变化.传统智慧会让我们合并,因为它是一个共享的分支.然而,在我们的反思中,我们决定改变那些分支机构.当然这需要大家的合作.工作流程如下:
1)rebaser与每个人协调,以确保他们全部签入并推入功能分支,然后要求他们不再在该分支上工作,直到他们全部清除.
2)rebaser将功能分支重新绑定到master上,删除远程功能分支(git push origin:feature),然后推送新的,重新定义的功能分支(git push origin功能)
3)rebaser让每个人都获取,更新他们的功能分支,然后删除他们的本地功能分支(git branch -D功能),然后创建一个跟踪远程功能分支的新本地功能分支.然后每个人都清楚了.
此工作流程正在运行,部分原因是我们是一个小组,工作中断很小.但是,我担心我们正在学习较差的Git习惯(重新定义共享分支),或者工作流程不能很好地扩展.
从好的方面来说,我们的存储库历史很可爱.
你觉得怎么样,Git大师?我们玩火还是摇摆合理的工作流程?
更新:
我问这个问题已经两年了,从那时起我的工作流程发生了变化.我们仍然经常做git pull --rebase,所以没有改变.这是常识,它可以防止所有难看的,令人困惑的迷你合并.(我们大多保持同步,所以成本很低git pull --rebase).
然而,除此之外,以及偶尔的纠正错误的英勇行动,我们已经超过了我们的疯狂.合并在大多数时候都很有意义.然而,肆意合并是有问题的,并且确实导致了我两年前关注的混乱,混乱的历史.
我们的解决方案有几个组件
主分支是"原始的".主题分支将合并进入,一旦完成,主题分支就会退出.换句话说,合并主题分支表示该工作已准备好进行生产,现在是主分支的一部分.看看我们的版本历史,很清楚发生了什么:主题分支被合并到主人,就是这样.
我们在必要时使用一次性集成分支.例如,如果我们有主题分支A,B和C,并且它们都没有准备好集成到master中,但是我们需要一起测试它们,我们只需创建一个QA分支(通常不在master下),然后合并A,B和C in.在某些时候,QA分支被删除或重新使用.关键在于它不是以任何方式永久保留,并且它与主分支没有相同的限制(您可以根据需要在主题分支中合并多次).如果历史变得过于混乱,您可以删除QA分支并重新开始(我们发现这种方法非常自然).
合并时,请始终使用git merge --no-ff.这与两年前我们对"线性承诺历史"的痴迷有着巨大的逆转,值得评论.现在我们已经放松了线性提交历史,并且看到合并是好的和有用的,我们已经开始依赖主题分支作为master的实际分支,而不仅仅是一系列提交最终成为master的提交. git merge --no-ff确保始终进行合并提交,即使没有必要也是如此.
我们对提交消息和分支有一个很好理解的约定,更重要的是,它交叉引用了我们的问题跟踪系统.我们的问题跟踪系统使用数字问题编号,对于任何功能(或缺陷),我们都有一个问题编号(例如1234).如果您正在处理该问题,那么您将创建一个分支_1234并启动每个提交消息"_1234: doing blah blah".它似乎有点过于强迫,但它确实对我们有效,并且显着减少/消除了混乱.
使用git包装器来鼓励工作流程粘合.这是我们目前正在努力的事情,但我们已经意识到完全有必要防止出现简单易懂的错误,例如分离出错误的东西(当开发人员从一次性创建主题分支时,我们最近遇到了彻底的灾难QA分支:该主题分支被批准上线,它被合并在......并且一些未被批准上线的转换器被吸入了.每当你做一些不寻常的事情时,我们的git包装器都需要确认(比如创建一个除了master之外的任何分支,创建一个不是名为_NNNN的分支,进行一个不以_NNNN开头的提交,等等).偶尔,我们确实需要做这些事情,所以包装器不会阻止它,但它确实让人们不小心做了他们不应该做的事情.
在我的git repo中,我有一个Master分支.其中一个远程开发人员创建了一个分支,Branch1并在其上进行了一系列提交.我分支Branch1,创建一个名为Branch2(git checkout -b Branch2 Branch1)的新分支,以便Branch2头部在最后一次提交时添加到Branch1:(看起来像这样)
Master---
\
Branch1--commit1--commit2
\
Branch2 (my local branch)
Run Code Online (Sandbox Code Playgroud)
Branch1有过一些变化.另一个开发者压缩了他的提交,然后添加了一些提交.与此同时,香港专业教育学院在我的分支机构中进行了一系列更改但尚未提交任何内容 目前的结构如下:
Master---
\
Branch1--squashed commit1,2--commit3--commit4
\
Branch2 (my local branch)
Run Code Online (Sandbox Code Playgroud)
现在我想要改变我的变化Branch1.我对如何解决这个问题感到非常困惑.我知道第一步是使用git add .和提交我的更改git commit -m "message".但是我会推吗?用git push origin Branch2?还是git push origin Branch2 Branch1?非常需要帮助,非常感谢,如果我可以创建一个如何创建我的分支的备份,这将是伟大的,以防万一我搞砸了
故事:在一个项目的中间,我的同事从大师那里创建了一个新的分支,并开始进行繁重的重新分解工作.我从master创建了我的分支,并开始在页面上做新的东西.我们经常提交,但只有我可以修改代码才能掌握(因为同事的更改太重,无法从主服务器部署).不幸的是,我们的一些工作依赖于相同的文件.因此,经过几天的工作,她终于想要改变主人的变化,她有很多git冲突.
my_branch #---#----#-#-------#----#--#-----#---#----#----#
/ \ \ \ \ \ \
master *-------*--------------*---*---*--------------*----*----*
\ /
her branch #------#-------#-----------#-----------#------------#
Run Code Online (Sandbox Code Playgroud)
问题1是:当我们处理相同的文件时,如何防止大量的git冲突?(或者在这种情况下最佳做法是什么?)
但这不是我们问题的结束,...绝对正确她试图从主人到她的分支进行变基(为了进行我所做的更改),所以提交映射应该看起来像这样
my_branch #---#----#-#-------#----#--#-----#---#----#----#
/ \ \ \ \ \ \
master *-------*--------------*---*---*--------------*----*----*
\ \ \ /
her branch #------#-------#----*------#-----*-----#------------#
Run Code Online (Sandbox Code Playgroud)
这就是困扰我们的事情.在这些改变期间,她正在解决这些冲突.但是git不记得她关于冲突修复的决定,所以当她从主人到她的分支做另一个git rebase时,她不得不再次修复同样的git冲突,以至于她在以前的rebase 中修复了.
问题2是:如何告诉git在主分支git rebase之后记住git冲突修复,那么在下一个rebase之后我们不必再次修复相同的冲突了?
我是GitHub存储库https://github.com/plison/opendial的管理员.我想减少存储库中的提交数量,因为存储库已经有几千个提交,其中许多是可以轻松压缩在一起的小调试更改(特别是几年前的那些).
因此,我正在尝试应用变基,以便压缩我的部分提交.但是,我遇到了以下问题:
git rebase -i HEAD~10,我在交互式编辑器中获得了相当多的提交行(远远超过10).可能是什么原因?我该如何解决这些问题?应该注意的是,存储库是从Google Code上托管的先前(SVN)存储库自动导入的.到目前为止转换似乎运行良好,但我想知道为什么我在尝试重新提交我的提交时会遇到这些错误.
我只是试图将一个非常古老的分支重新修改为我的主人.合并三个文件中只有一个存在问题,所以我做了一个不假思索的--skip,认为它会跳过那个文件,但是当它发生时,它似乎已经跳过了我所有的更改,并向前滚动.所以现在rebase已经完成,我的变化似乎已经消失了.
我已经看到了关于撤销rebase的问题,但它对我来说都是希腊语,我看到了reflog,但我不知道在rebase之前哪个分支附加了.
在任何情况下,我都不需要撤消rebase,我只是希望能够恢复两个文件中的更改.无论如何都要正确地做到这一点(如果没有这个,我只需要恢复昨天的存储库备份并手动选择这些位).