Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 重基到重基/挤压_Git_Git Rebase_Git Squash - Fatal编程技术网

Git 重基到重基/挤压

Git 重基到重基/挤压,git,git-rebase,git-squash,Git,Git Rebase,Git Squash,这是我遇到的常见情况,我正在寻找一个干净的解决方案 在git分支上做一些工作(我的第一个工作) 推到github 在我的第一份工作的基础上,开始一个新的分支(一些进一步的工作) 未指定的时间流逝量 批准人将我的第一份工作重新调整或压缩到主文件上 这会创建新的提交,git不会将其视为等同于我所基于的内容,即使最终结果是相同的(即master的头与我的第一部作品的头相同) 我运行git-rebase-master将一些进一步的工作移动到master 我现在基于的我的第一部作品的提交都与已经挤压/合并

这是我遇到的常见情况,我正在寻找一个干净的解决方案

  • 在git分支上做一些工作(
    我的第一个工作
  • 推到github
  • 在我的第一份工作的基础上,开始一个新的分支(
    一些进一步的工作
  • 未指定的时间流逝量

  • 批准人将
    我的第一份工作重新调整或压缩到
    主文件上
  • 这会创建新的提交,git不会将其视为等同于我所基于的内容,即使最终结果是相同的(即
    master
    的头与
    我的第一部作品的头相同)
  • 我运行
    git-rebase-master
    一些进一步的工作
    移动到
    master
  • 我现在基于的
    我的第一部作品
    的提交都与已经挤压/合并的内容冲突
  • 目前,我通过使用
    git-rebase-I master
    来解决这个问题,然后删除
    我的第一个作品的所有提交。这将在
    master
    上干净地重放附加提交

    有更清洁的解决方案吗?有没有一种方法可以让git自动识别何时发生了重基/挤压(如4所示)?

    清洁器在旁观者/工作人员的眼睛(或手)中,但您可以使用
    git-rebase--On
    来区分哪些提交进行复制,哪些提交进行复制

    请记住,
    git-rebase
    意味着:1我有一个线性提交链,如图1所示,我想复制到一个新的线性提交链,如图2所示。复制完成后,我希望我的分支名称指向上次复制的提交。原来的
    A-B-C
    链即使仍然存在,也不再有用

    这告诉Git:

  • 枚举从
    C
    开始并向后工作的所有提交。这就是
    C
    然后
    B
    然后
    A
    然后
    *
    然后是
    *
    之前的一切
  • 枚举从
    上游/master
    开始并向后工作的所有提交。这是第二个
    o
    ,然后是
    *
    ,然后是
    *
    之前的所有内容
  • 将第二份清单中的所有内容从第一份清单中删除。因此,这将淘汰
    *
    和所有早期提交。第二个
    o
    不在第一个列表中,但这没关系:如果它在,我们会把它删掉,但不是这样,所以我们什么也不做。我们的列表现在是
    C
    B
    A
  • 颠倒列表以将其放入正确的顺序,然后,一次一个,将每个提交复制到新位置。新位置从
    上游/master
    指向的提交点开始。因此,这会将
    A
    复制到
    A'
    B
    复制到
    B'
    C
    复制到
    C'
  • 将当前分支名称
    主题
    从其以前的位置剥离,并像往常一样将其粘贴到新的提交链的末尾。因此,这使得
    topic
    指向
    C'
    ,而不是
    C
  • 但在你的新案例中,你有:

    ...--o--*   <-- upstream/master
             \
              A--B--C   <-- feature1
                     \
                      D--E--F--G   <-- feature2
    
    如果您只是运行git checkout feature2;git重新设置上游/master
    ,您的git将枚举提交
    G-F-E-D-C-B-A-*-…
    ,枚举
    ABC-*-…
    ,从第一个中减去第二个,并留下复制
    G-F-E-D-C-B-A
    链的说明

    fancier rebase命令是:

    git checkout feature2
    git rebase --onto upstream/master feature1
    
    这将目标参数(Git开始复制的位置)与限制参数分开。现在的目标是
    上游/master
    (Git文档将其调用到参数上)。限制参数现在是
    feature1
    。如果愿意,可以使用commit
    C
    的原始散列ID。Git只需要知道:从哪里开始我的淘汰这些提交枚举?(令人困惑的是,Git文档将其称为上游参数。)

    如您所见,这将取消
    C-B-A-*
    提交,而不仅仅是
    *
    提交,因此在复制之后,您有:

                   D'-E'-F'-G'  [in progress]
                  /
    ...--o--*--ABC   <-- upstream/master
             \
              A--B--C   <-- feature1
                     \
                      D--E--F--G   <-- feature2
    
    D'-E'-F'-G'[进行中]
    /
    
    …--o--ABC太棒了。答案很清楚,解释也很好。
    ...--o--*--ABC   <-- upstream/master
             \
              A--B--C   <-- feature1
                     \
                      D--E--F--G   <-- feature2
    
    git checkout feature2
    git rebase --onto upstream/master feature1
    
                   D'-E'-F'-G'  [in progress]
                  /
    ...--o--*--ABC   <-- upstream/master
             \
              A--B--C   <-- feature1
                     \
                      D--E--F--G   <-- feature2