git - squash - rebase - 掌握历史问题

时间:2015-11-20 14:27:14

标签: git github

我对rebase命令有点担心。这么多,以至于我真的拖延了完成这个为libGDX实现陀螺仪功能的拉取请求。 https://github.com/libgdx/libgdx/pull/3361

如果您查看提交,我会尽早,经常地提交。然后我同步了,承诺了更多。现在我将不得不再次同步,在接受此拉取请求之前测试所有内容。

因此,我认为有一些混乱的提交与合并等交织在一起。我认为这是一团糟。
维护者希望我将我的提交压缩成一个。说得通。虽然,这是我天真的全力以赴的地方。

rebase只会影响我的提交吗?或者是否有可能通过在我的分支中重新定位并合并来覆盖所有项目历史记录?

我应该重新开始,检查主人,进行所有相同的更改,并提出另一个拉取请求吗?

2 个答案:

答案 0 :(得分:2)

你误解了rebase是如何运作的。

实质上,什么rebase是一种简化大量提交的方法,如果有必要,可以修改它们。

在功能分支上运行git rebase -i master时会发生以下情况(强烈简化的版本):

  1. Git找到了主人和你的分支之间的差异,哇。您分支中的所有提交都是不在主
  2. Git按时间顺序列出这些提交,以便您更改订单,选择,压缩,重新加载或丢弃。
  3. 在确认您希望如何订购提交,sqashed,...之后,git将打开一个执行所需操作的队列。

  4. Git将使用以下" alorithm"

    • 它需要下一个项目,樱桃选择指定到中间分支的提交(实际上可能是分离的HEAD)。

    • 如果存在冲突 Git会停止队列并允许您解决这些冲突。解决冲突时,您可以--abort使用rebase或--continue。在中止时,git通过放弃所做的更改来恢复原始存储库状态并清除队列。

    • 继续时,git将继续处理队列,转到算法的顶部。

    一旦rebase完成,git会标记当前的HEAD,其中包括分支中的所有更改,但作为master的后代,并且您启动了分支并丢弃旧分支。

  5. 在整个过程中,git将尝试接受已经在目标分支中的提交,因此您不必担心:)

答案 1 :(得分:2)

此问题的根源实际上与您的libgdx分支在主分支中完成更改有关。理想情况下,拉取请求的工作应该在Git中的“特性”或“主题”分支中完成:

  1. 分叉主libgdx存储库

  2. 克隆你的fork,并添加一个名为“upstream”的远程指向原始存储库:

    <select name="countries" class="countries" id="countryId" tabindex="9" required>
             <?php ShowCountries(); ?>
          </select>
    
  3. 从您的主人创建一个新主题分支:

    git clone https://github.com/snovak/libgdx.git
    cd libgdx
    git remote add upstream https://github.com/libgdx/libgdx.git
    
  4. 完成工作,并进行任意数量的提交

  5. 从“上游”分支重新启动对新更改的提交:

    git checkout -b android_gyroscope_implementation master
    
  6. 准备好提取请求时,将更改推送到分支

    git fetch upstream
    
    # Keep your commits
    git rebase upstream/master
    
    # "Squash" your commits interactively to summarize your work
    git rebase -i upstream/master
    
  7. 提交您的提款请求

  8. 从现在开始,只需将# The first time git push origin -u android_gyroscope_implementation # Subsequent pushes just need: git push origin HEAD 合并到android_gyroscope_implementation中即可保存历史记录。

  9. 原始存储库的维护者可以执行upstream/master或在最终合并之前,您可以执行另一个git merge --squash并将所有提交压缩为一个。