在阅读git pull页面时,它给出了以下严厉的警告git pull --rebase:
这是一种潜在危险的操作模式.它重写了历史,当你已经发布了这段历史时,它并不是一个好兆头.除非您仔细阅读git-rebase(1),否则请勿使用此选项.
在git rebase页面中,它提供了大量描述,但没有这种警告.
另外,我见过有人这么说
git fetch
git rebase
Run Code Online (Sandbox Code Playgroud)
是相同的
git pull --rebase
Run Code Online (Sandbox Code Playgroud)
而其他人说他们略有不同.
真相是什么?
有没有之间的差异git rebase upstream/master和git pull --rebase upstream master,如果是这样,是什么?遥控器可以是任何遥控器,不一定是上游遥控器.
当我遇到使用合并冲突时git rebase,如何根据提交识别冲突的来源,而不仅仅是文件差异?
我已经知道如何使用(git mergetool或基本)使用或git add之前git rebase --continue,但有时文件之间的差异是不够的:我想看到提交的提交日志和差异,但未能应用于工作树.
我已经读过其他问题,git log --merge如果我使用的话会显示父提交git merge.当我遇到冲突并被告知时,我还是尝试过fatal: --merge without MERGE_HEAD?.
如何识别有问题的提交?
我的老板最近决定尝试一个"增加容量"的外包小组,因为我们修改现有的应用程序以添加新功能.尽管我担心他所选择的小组似乎并没有很好地沟通,也没有提出足够的问题来真正理解和有效,但我们还是和他们一起去了.
我们将它们设置为在我们的Git存储库(托管在GitHub上)上进行协作.我们为他们创建了一个分支(TheOutsourcedBranch,我们称之为),并要求他们在这个分支中完成所有工作.
此外,我们要求他们在每天结束时推送他们的提交,以便我们可以很好地了解他们的工作速度,以及(更重要的是)他们的代码有多好.
今天他们第一次推了推.五个提交,所有这些都是主人.我正在试图弄清楚如何将他们的提交从master转移到TheOutsourcedBranch,而不会丢失他们已经完成的工作(尽管从它的外观来看,无论如何我们都不得不扔掉它).

橙点是他们的承诺,灰点是我的.
我知道有很多关于变基的问题(这可能是我在这里需要做的)但我很难弄清楚哪些适用于我的具体情况.如果重要的话,外包集团和我自己是现在唯一真正使用回购的人.
提前致谢!
编辑: 我可能已找到我正在寻找的内容:使用Git将最近的提交移动到新的分支
不过,我想检查一下我的理解.在本地,我创建了一个主要的分支(TheOutsourcedBranch),它将包含所有AH.然后我将主人重置为C.主人现在包含AC.
假设这是正确的,那对我(本地)来说没问题.但是,我需要做些什么才能"强制"远程存储库(GitHub)接受我对本地事件如何发挥作用的本地视图并丢弃其历史版本?
一旦这个问题发生了,我想我可以重新解决这个问题,使其更具通用性/信息性,并减少一些毛病 - 否则它可能是一个很好的删除候选人,我猜.
故事:在一个项目的中间,我的同事从大师那里创建了一个新的分支,并开始进行繁重的重新分解工作.我从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)存储库自动导入的.到目前为止转换似乎运行良好,但我想知道为什么我在尝试重新提交我的提交时会遇到这些错误.
我已经在SO上阅读了关于git merge和git rebase的相关问题,但我仍然无法完全理解幕后发生的事情.
这是我们的分支情况:
MASTER------------------------
\ \
\ \----Feature B---
\ \
\-----Feature A----------\---Feature A+B
Run Code Online (Sandbox Code Playgroud)
我们有2个功能分支,它们来自不同时间的master,现在我们想要组合2个分支.我们希望遵循这种first rebase then merge做法,但是当我们将功能A重新命名为功能B时,我们会遇到冲突.这是预期的,因为两个功能(和主人)在相同的区域都有变化.但奇怪的是,同样的冲突在此之后不断出现git rebase --continue.这让我们疯狂,所以我们最终中止了rebase,并使用了git merge.事实证明,冲突实际上很容易解决.
我的问题是双重的:
git rebase适合我们situtation?或者,只有少数(1或2)变化才能改变?rebase解决一个冲突,但通过比较哪个提交到什么?关于SO的相关帖子:
什么之间的区别edit,并reword当你做一个git的变基?
我正在通过一些文档说这个:
Replace pick with:
- edit to mark a commit for amending.
- reword to change the log message.
Run Code Online (Sandbox Code Playgroud) 鉴于以下git历史:
C-I origin/master
/
A-B-F-G-H master
\ /
D-E branch-b
Run Code Online (Sandbox Code Playgroud)
我想重新定义我的本地master分支origin/master,但我想保留合并提交G.当我尝试简单地做git rebase origin/master一会儿时master就被压扁了D..E,G并用提交消息提交了E,所以有一个合并的历史丢失了.有没有办法保留这个合并,同时仍然得到rebase?为清楚起见,我的预期结果是:
A-B-C-I-F-G-H master
\ /
D-----E branch-b
Run Code Online (Sandbox Code Playgroud) 所以我的历史看起来像这样:
o---o---o---o master
\
o---o---o A
\
o B
所以,解释一下:
A从哪个分支开始masterB(只有1个提交)从哪个开始A我想要的是这个:
o---o---o---o master
\
o---o---o A
\
o B
我做的是:
1).
git checkout A
git rebase master
这导致了许多冲突,经过一段时间的修复后,出现了以下历史:
o---o---o---o master
\
o---o---o A
这正是我想要的.
(我不知道B现在在哪里)
2).
在此之后我做了很多南瓜并改变了提交的顺序A,使历史看起来像我想要的.
3).
现在,我还想做的是:
git checkout B
git rebase A
然而,这似乎不起作用,我不知道为什么.如果我这样做,git log我会在执行第1步之前看到那些提交.
此外,我得到了我在步骤1中已经解决的大量冲突.我花了很多时间去做,不想再这样做了.
这个例子建议使用--onto,我做了:
git checkout B
git rebase --onto A
但是这会B完全删除提交,A并B指向同一个提交,即最后一个提交 …