From patchwork Fri Apr 5 21:40:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10887865 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DE03517E1 for ; Fri, 5 Apr 2019 21:40:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C878328A47 for ; Fri, 5 Apr 2019 21:40:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BD16728A5C; Fri, 5 Apr 2019 21:40:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 681B128A47 for ; Fri, 5 Apr 2019 21:40:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726458AbfDEVkF (ORCPT ); Fri, 5 Apr 2019 17:40:05 -0400 Received: from mail-pl1-f178.google.com ([209.85.214.178]:43769 "EHLO mail-pl1-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725973AbfDEVkF (ORCPT ); Fri, 5 Apr 2019 17:40:05 -0400 Received: by mail-pl1-f178.google.com with SMTP id m10so3685736plt.10 for ; Fri, 05 Apr 2019 14:40:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=LaPE813OSFjQBw1zOOsUNEQycqq0NtMPOwUU7Ez2dxs=; b=g9s32rHYY4Hu5SYhnPL22P1L/chEoLdENAtZoV93QSUJnBU/ZMpQLOLKI8VADnoj2G xo2OXtnTFWrPswJESEuecf1Uz3cp73LUUdsQcHdT+8fY1Ex9eg+fQxYRu9oo4KbWYEA0 Vwc147G0SE1txktKldtqc7Xkquksj+2SL8OJRbmUq5lurRgGctsfBj5fs8gwJVLhACpk tpSoYlyVGw4xykBzN++Qo9i55Dyt7TkkOb2KQhfZod46ihcFaOTJsleGusdAniSlv3nw lmBQ6tsLpNz9htGIeWc8v5JLWzg68ljFdU9w4RNLGlH2RcQUbPFoEm+sJBY8SGhd0Fvx 6maQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=LaPE813OSFjQBw1zOOsUNEQycqq0NtMPOwUU7Ez2dxs=; b=tkUi5Ao+Y9db6w5KK5s0CcoeCfwrzaHqqLBpr3hwJAlQY1VWYQQu3VM+Z7x3SC/V5r 7An6bZxwJaFFdNXqhRaNBxNe+o2ZI40C13j20dWqUkBe15waX4AqkhC9RyT4aelnW/2q GhF+JtI1/Q+nOJNLogb+XxV4DjNTNUzatWWhO8xud4COCY6vwCPSuhmI63tiI4SPcALj z3LNooDdoiOYgLkHlelP1MGnMmRrrXWoHJq7l30njJ/KclLAFLHFVLst6IhgQQqJzWdA Qz1bwY9iDYmzXZI3cioDPe9u1EOAnR3uDrIeHaxwEeKu/r0uXWsUUoAjJpFTX2N8glCU Wzyg== X-Gm-Message-State: APjAAAU/rKcCE/vSs6gTiMUuRkTIp9kEHNitwPaHNyC/z6tbe7wPkAEN wevOlKGROinMq3geLhu4XjRoTsA5 X-Google-Smtp-Source: APXvYqwuH5TA4ZM5lG3pqx0tk8SlOgx36bQcAfKUzCyyzA+CwDF6TKZLgS0E9xhk4TisBd9caEIaKA== X-Received: by 2002:a17:902:241:: with SMTP id 59mr15599388plc.79.1554500403865; Fri, 05 Apr 2019 14:40:03 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id b7sm67662321pfj.67.2019.04.05.14.40.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Apr 2019 14:40:01 -0700 (PDT) Date: Fri, 5 Apr 2019 14:40:00 -0700 From: Denton Liu To: Git Mailing List Cc: Eric Sunshine , Junio C Hamano , =?iso-8859-1?q?=C6var_Arnfj=F6r=F0?= Bjarmason , Johannes Schindelin , Johannes Sixt , SZEDER =?iso-8859-1?q?G=E1bor?= Subject: [PATCH v4 1/4] t3431: add rebase --fork-point tests Message-ID: <0f1e9ac5c8b88649a378f676ee924a966ce0693c.1554500051.git.liu.denton@gmail.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Denton Liu --- t/t3431-rebase-fork-point.sh | 53 ++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100755 t/t3431-rebase-fork-point.sh diff --git a/t/t3431-rebase-fork-point.sh b/t/t3431-rebase-fork-point.sh new file mode 100755 index 0000000000..6d523123d0 --- /dev/null +++ b/t/t3431-rebase-fork-point.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# +# Copyright (c) 2019 Denton Liu +# + +test_description='git rebase --fork-point test' + +. ./test-lib.sh + +# A---B---D---E (master) +# \ +# C*---F---G (side) +# +# C was formerly part of master but master was rewound to remove C +# +test_expect_success setup ' + test_commit A && + test_commit B && + test_commit C && + git branch -t side && + git reset --hard HEAD^ && + test_commit D && + test_commit E && + git checkout side && + test_commit F && + test_commit G +' + +test_rebase() { + expected="$1" && + shift && + test_expect_success "git rebase $*" " + git checkout master && + git reset --hard E && + git checkout side && + git reset --hard G && + git rebase $* && + test_write_lines $expected >expect && + git log --pretty=%s >actual && + test_cmp expect actual + " +} + +test_rebase 'G F E D B A' +test_rebase 'G F D B A' --onto D +test_rebase 'G F C E D B A' --no-fork-point +test_rebase 'G F C D B A' --no-fork-point --onto D +test_rebase 'G F E D B A' --fork-point refs/heads/master +test_rebase 'G F D B A' --fork-point --onto D refs/heads/master +test_rebase 'G F C E D B A' refs/heads/master +test_rebase 'G F C D B A' --onto D refs/heads/master + +test_done From patchwork Fri Apr 5 21:40:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10887867 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 48B6315AC for ; Fri, 5 Apr 2019 21:40:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 33D792880A for ; Fri, 5 Apr 2019 21:40:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2807728B7E; Fri, 5 Apr 2019 21:40:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C1D322878F for ; Fri, 5 Apr 2019 21:40:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726496AbfDEVkG (ORCPT ); Fri, 5 Apr 2019 17:40:06 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:41897 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725973AbfDEVkG (ORCPT ); Fri, 5 Apr 2019 17:40:06 -0400 Received: by mail-pf1-f196.google.com with SMTP id 188so3959657pfd.8 for ; Fri, 05 Apr 2019 14:40:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=XEOmxnriC0OeXVKk6BAYWmbr88SMr+orHNjL9HyedGk=; b=rlEGw22U8P5MT+/VXp9whGNLUBxSv9VhNSa5kL4L2Ri7P3G870TolmkqcUs0cLMlI4 hPIjvHBfVQviqGF+KgX0SatkBcFPI+7E3nAjgHsOPMAZYIaf2oCNg/yu9Vg6gUyIPOOM nHXQDbl5tsNJqYdFy874PE4LLP6bzh32XhXxYRNh1t3GS6IIRlweqNupz41c6ligYBMV Vy7d1YYVKY7wFvqumvZCizpNPwQK+wYx/C9QcSu/GK9aq6j6LJ2QKKQ3kCJrUN1da6GY s9s10cAG0M5fAA9zZVbTRzWU19IluJyfGutH9/t3KKQ4rQWSxuHY/5ijbB1PJQ4/yfj3 3Deg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=XEOmxnriC0OeXVKk6BAYWmbr88SMr+orHNjL9HyedGk=; b=RRh9fh9ICTb3bGbHmLMidTIEQl57e2xB9gfLL2OKoH+Vjq2p7OT2sN62ZuiNzhr6e4 HU7A4DyPTbC0K3fASpBRgjG4kxmQUragXSlKNssJ+wxnglT3/NVg0AnPxA3JXI7zWrhc /QT317OeWWLoQX0ewVQ8jJFitrHss7JRbW3sygp9BNjzuhojBr4dREj2N5qyYh0C5hYf kY8WrJw1AxUyRVM1FWvEbkFFlinjMJiPifF1oziJ44zUrHyA/nIllK73CmFHgpDDQjx7 YwijZ+sbipo1AkWjrCdQQHykM+ufgw2yewB0EQ57NiydvO7Ep+YC6QsAYKpaLMD0Vn+s xmbw== X-Gm-Message-State: APjAAAUI+z8iM/MTRjVb9sV6AQdf+yu+D5FGQLDnV35E+2VwABs6Zr/u qBtW8NqDbteHc0buerzsYjdVSNdz X-Google-Smtp-Source: APXvYqyByezWhXOzHr3FWxDvODr+i+QHM81nEijWSN421i0rqgYiKldhLRXQLfu2TLd1XyEOTahLUQ== X-Received: by 2002:a63:ed4f:: with SMTP id m15mr13951530pgk.387.1554500405109; Fri, 05 Apr 2019 14:40:05 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id w189sm30088167pfw.147.2019.04.05.14.40.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Apr 2019 14:40:04 -0700 (PDT) Date: Fri, 5 Apr 2019 14:40:03 -0700 From: Denton Liu To: Git Mailing List Cc: Eric Sunshine , Junio C Hamano , =?iso-8859-1?q?=C6var_Arnfj=F6r=F0?= Bjarmason , Johannes Schindelin , Johannes Sixt , SZEDER =?iso-8859-1?q?G=E1bor?= Subject: [PATCH v4 2/4] t3432: test rebase fast-forward behavior Message-ID: <963b600c79d3d59c5a359e87fb413fec88ed8aaa.1554500051.git.liu.denton@gmail.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When rebase is run on a branch that can be fast-forwarded, this should automatically be done. Create test to ensure this behavior happens. There is one case that currently does not pass. In the case where a feature and master have diverged, running "git rebase master... master" causes a full rebase to happen even though a fast-forward should happen. Mark this case as failure so we can fix it later. Signed-off-by: Denton Liu --- t/t3432-rebase-fast-forward.sh | 59 ++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 t/t3432-rebase-fast-forward.sh diff --git a/t/t3432-rebase-fast-forward.sh b/t/t3432-rebase-fast-forward.sh new file mode 100755 index 0000000000..b7c9af17c3 --- /dev/null +++ b/t/t3432-rebase-fast-forward.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# +# Copyright (c) 2019 Denton Liu +# + +test_description='ensure rebase fast-forwards commits when possible' + +. ./test-lib.sh + +test_expect_success setup ' + test_commit A && + test_commit B && + test_commit C && + test_commit D && + git checkout -t -b side +' + +test_rebase_same_head() { + status="$1" && + shift && + test_expect_$status "git rebase $* with $changes is no-op" " + oldhead=\$(git rev-parse HEAD) && + test_when_finished 'git reset --hard \$oldhead' && + git rebase $* && + newhead=\$(git rev-parse HEAD) && + test_cmp_rev \$oldhead \$newhead + " +} + +changes='no changes' +test_rebase_same_head success +test_rebase_same_head success master +test_rebase_same_head success --onto B B +test_rebase_same_head success --onto B... B +test_rebase_same_head success --onto master... master + +test_expect_success 'add work to side' ' + test_commit E +' + +changes='our changes' +test_rebase_same_head success +test_rebase_same_head success master +test_rebase_same_head success --onto B B +test_rebase_same_head success --onto B... B +test_rebase_same_head success --onto master... master + +test_expect_success 'add work to upstream' ' + git checkout master && + test_commit F && + git checkout side +' + +changes='our and their changes' +test_rebase_same_head success --onto B B +test_rebase_same_head success --onto B... B +test_rebase_same_head failure --onto master... master + +test_done From patchwork Fri Apr 5 21:40:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10887871 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DAE1017E1 for ; Fri, 5 Apr 2019 21:40:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C11AA28A5C for ; Fri, 5 Apr 2019 21:40:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BF44C28B82; Fri, 5 Apr 2019 21:40:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1A61328A5C for ; Fri, 5 Apr 2019 21:40:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726527AbfDEVkJ (ORCPT ); Fri, 5 Apr 2019 17:40:09 -0400 Received: from mail-pl1-f196.google.com ([209.85.214.196]:43358 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725973AbfDEVkH (ORCPT ); Fri, 5 Apr 2019 17:40:07 -0400 Received: by mail-pl1-f196.google.com with SMTP id m10so3685792plt.10 for ; Fri, 05 Apr 2019 14:40:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=YirZ6kFa6CRXi2d4lqIUiHnBT8Dwb6MHcO44Y6kQOrc=; b=kJWMBWdCd3MdgxMMWOgttAbLZo57I9aNXQt37OT6ShEn3N5sto3ZuQZWdyhnETU+Sx efhwFqB/+mAeikjb/kns5DCgBQ+BOGT/VWtL9ud7GPbr6JSFhetK+CU27FHZEFkxpCxN 0HrY+NdbfQ9xTEJHv3n4YpwI5gaIXQSBhvhph8gp28QPutpA0mDase0QvbnLISX4gF/b 9h4v2I1HIZGRvc63Vt2O93w57yOfpVSVEId2UPgbz+uqlY5WOdn4v0LvBz1wDcqT4zui IfaZSVLFQ40G5pty1SAQuFsqT1RP+68DUwDlY6+p5wF6bb8TmFinenT9YY5S5hfHGmYb Fu+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=YirZ6kFa6CRXi2d4lqIUiHnBT8Dwb6MHcO44Y6kQOrc=; b=JUmBOs/bZvLu2pu7MK8k1IcBgrf9oQucI6/IZ1/Y9YdVQZh/LcFi0hNs2cHMpKwBJH 4UnbvVDJUpY6h4U2eme5sPsVdGLS3WURnC7EklH2UCUPpPvycl7LDnWaYUviqG+Lz8KR rnW+KP2ILrtP2yvnn33yDj63tvvu3fJzSxGdHrshf6YE/6IgcKwezUkp+rcsXcPdOMvL u9cz5pCvOIWsEd5FWZx2RRgLdA49UAfj5GywYaS0sb48NPGXEwUJLMh0MTPWMwCALmwM 9F06pfhtGsYX3YrW62yS5VNgRrcf/M+Jyo8U1kaBGNCyvkXOL4raSrZQaWm7lB90W6Sf IaRg== X-Gm-Message-State: APjAAAUGEsA7qE1OGeDuuvWzDgPfgTGP2qzwUsLm/hkc0+tj7k+cT3jt 2YvT9RA9yJYQyIU4/EWnxmSElPmb X-Google-Smtp-Source: APXvYqy8XMoGP2rFMm40M2kenODwaJAvSCPMVu0cb5xsfMdumN6D1t/4jWf7QGXApouRtSQmQ/2m0g== X-Received: by 2002:a17:902:b617:: with SMTP id b23mr14886960pls.73.1554500406663; Fri, 05 Apr 2019 14:40:06 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id d15sm33673240pfo.34.2019.04.05.14.40.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Apr 2019 14:40:05 -0700 (PDT) Date: Fri, 5 Apr 2019 14:40:05 -0700 From: Denton Liu To: Git Mailing List Cc: Eric Sunshine , Junio C Hamano , =?iso-8859-1?q?=C6var_Arnfj=F6r=F0?= Bjarmason , Johannes Schindelin , Johannes Sixt , SZEDER =?iso-8859-1?q?G=E1bor?= Subject: [PATCH v4 3/4] rebase: fast-forward --onto in more cases Message-ID: <338a4b6b3a40d64d3eac37cc4d19ebe55ec02282.1554500051.git.liu.denton@gmail.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Before, when we had the following graph, A---B---C (master) \ D (side) running 'git rebase --onto master... master side' would result in D being always rebased, no matter what. However, the desired behavior is that rebase should notice that this is fast-forwardable and do that instead. Add detection to `can_fast_forward` so that this case can be detected and a fast-forward will be performed. First of all, rewrite the function to use gotos which simplifies the logic. Next, since the options.upstream && !oidcmp(&options.upstream->object.oid, &options.onto->object.oid) conditions were removed in `cmd_rebase`, we reintroduce a substitute in `can_fast_forward`. In particular, checking the merge bases of `upstream` and `head` fixes a failing case in t3416. The abbreviated graph for t3416 is as follows: F---G topic / A---B---C---D---E master and the failing command was git rebase --onto master...topic F topic Before, Git would see that there was one merge base (C), and the merge and onto were the same so it would incorrectly return 1, indicating that we could fast-forward. This would cause the rebased graph to be 'ABCFG' when we were expecting 'ABCG'. With the additional logic, we detect that upstream and head's merge base is F. Since onto isn't F, it means we're not rebasing the full set of commits from master..topic. Since we're excluding some commits, a fast-forward cannot be performed and so we correctly return 0. Add '-f' to test cases that failed as a result of this change because they were not expecting a fast-forward so that a rebase is forced. While we're at it, remove a trailing whitespace from rebase.c. Signed-off-by: Denton Liu --- builtin/rebase.c | 40 +++++++++++++++++++++++----------- t/t3400-rebase.sh | 2 +- t/t3404-rebase-interactive.sh | 2 +- t/t3432-rebase-fast-forward.sh | 2 +- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 77deebc65c..7aa6a090d4 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -895,12 +895,12 @@ static int is_linear_history(struct commit *from, struct commit *to) return 1; } -static int can_fast_forward(struct commit *onto, struct object_id *head_oid, - struct object_id *merge_base) +static int can_fast_forward(struct commit *onto, struct commit *upstream, + struct object_id *head_oid, struct object_id *merge_base) { struct commit *head = lookup_commit(the_repository, head_oid); - struct commit_list *merge_bases; - int res; + struct commit_list *merge_bases = NULL; + int res = 0; if (!head) return 0; @@ -908,12 +908,29 @@ static int can_fast_forward(struct commit *onto, struct object_id *head_oid, merge_bases = get_merge_bases(onto, head); if (merge_bases && !merge_bases->next) { oidcpy(merge_base, &merge_bases->item->object.oid); - res = oideq(merge_base, &onto->object.oid); + if (!oideq(merge_base, &onto->object.oid)) + goto done; } else { oidcpy(merge_base, &null_oid); - res = 0; + goto done; } + + if (!upstream) + goto done; + free_commit_list(merge_bases); + merge_bases = get_merge_bases(upstream, head); + if (merge_bases && !merge_bases->next) { + if (!oideq(&onto->object.oid, &merge_bases->item->object.oid)) + goto done; + } else + goto done; + + res = 1; + +done: + if (merge_bases) + free_commit_list(merge_bases); return res && is_linear_history(onto, head); } @@ -1682,13 +1699,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) /* * Check if we are already based on onto with linear history, - * but this should be done only when upstream and onto are the same - * and if this is not an interactive rebase. + * but this should be done if this is not an interactive rebase. */ - if (can_fast_forward(options.onto, &options.orig_head, &merge_base) && - !is_interactive(&options) && !options.restrict_revision && - options.upstream && - !oidcmp(&options.upstream->object.oid, &options.onto->object.oid)) { + if (can_fast_forward(options.onto, options.upstream, &options.orig_head, &merge_base) && + !is_interactive(&options) && !options.restrict_revision) { int flag; if (!(options.flags & REBASE_FORCE)) { @@ -1782,7 +1796,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) strbuf_addf(&msg, "%s: checkout %s", getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name); if (reset_head(&options.onto->object.oid, "checkout", NULL, - RESET_HEAD_DETACH | RESET_ORIG_HEAD | + RESET_HEAD_DETACH | RESET_ORIG_HEAD | RESET_HEAD_RUN_POST_CHECKOUT_HOOK, NULL, msg.buf)) die(_("Could not detach HEAD")); diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh index 460d0523be..604d624ff8 100755 --- a/t/t3400-rebase.sh +++ b/t/t3400-rebase.sh @@ -295,7 +295,7 @@ test_expect_success 'rebase--am.sh and --show-current-patch' ' echo two >>init.t && git commit -a -m two && git tag two && - test_must_fail git rebase --onto init HEAD^ && + test_must_fail git rebase -f --onto init HEAD^ && GIT_TRACE=1 git rebase --show-current-patch >/dev/null 2>stderr && grep "show.*$(git rev-parse two)" stderr ) diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index b60b11f9f2..f054186cc7 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -1066,7 +1066,7 @@ test_expect_success C_LOCALE_OUTPUT 'rebase --edit-todo does not work on non-int git reset --hard && git checkout conflict-branch && set_fake_editor && - test_must_fail git rebase --onto HEAD~2 HEAD~ && + test_must_fail git rebase -f --onto HEAD~2 HEAD~ && test_must_fail git rebase --edit-todo && git rebase --abort ' diff --git a/t/t3432-rebase-fast-forward.sh b/t/t3432-rebase-fast-forward.sh index b7c9af17c3..357cf17bdd 100755 --- a/t/t3432-rebase-fast-forward.sh +++ b/t/t3432-rebase-fast-forward.sh @@ -54,6 +54,6 @@ test_expect_success 'add work to upstream' ' changes='our and their changes' test_rebase_same_head success --onto B B test_rebase_same_head success --onto B... B -test_rebase_same_head failure --onto master... master +test_rebase_same_head success --onto master... master test_done From patchwork Fri Apr 5 21:40:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10887869 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 01E1F17E1 for ; Fri, 5 Apr 2019 21:40:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DB40D284B3 for ; Fri, 5 Apr 2019 21:40:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D9A3528A3B; Fri, 5 Apr 2019 21:40:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CC735284B3 for ; Fri, 5 Apr 2019 21:40:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726532AbfDEVkJ (ORCPT ); Fri, 5 Apr 2019 17:40:09 -0400 Received: from mail-pl1-f194.google.com ([209.85.214.194]:36418 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726352AbfDEVkI (ORCPT ); Fri, 5 Apr 2019 17:40:08 -0400 Received: by mail-pl1-f194.google.com with SMTP id ck15so3702700plb.3 for ; Fri, 05 Apr 2019 14:40:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=0Q1wjQCTa3dLiZjRY3lYwHKqSutPDMZmGsWE8nTAVpI=; b=LLTo+zzO1ClOSRTzoeQ0zgZMHyFgexlLjyjbg6Iw+yLW3uMhWORN88MHoTez5/suYW V47Fd7YxklC4DrrNSKRO4ip8OHaMc68Gn+bUSFbuGpOfNfGqkwvFx69ZQ9A3Y6U68jqS FJO7otmKlVdm+ZOXjpoacgD8SGwz1u0JmMMyCm0EYOg1iSvRO/nUBgjzlI60OkJL90ne 551csaPVKc84Mz9dn4gKhu87TtpObfmfGAGo5S8ZPt09GDmErgvvyk6KKkcFa6LNVqb+ cF5L4Hd3POphcYi3HKfP4POd42+h9tBv91yVfpe3jqUGxzj/+j1h52uWslaiYMWXo4b7 cUWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=0Q1wjQCTa3dLiZjRY3lYwHKqSutPDMZmGsWE8nTAVpI=; b=RMJers8CegLwWJjHmCVzh7OushmVeXv0dmL8GsBD3LbizR7KP46yQiVOweePqyNbNr Y9SaEDT0i4/X74q0C8r/0kW6in/wYX+x2F+ccJdA+NvRxkcZGBuVq4rfyskc5rb1DQma 7jJ0zbv9tFm38wtLLn/7Cdo71p449Yro4rwn7F9s6yW5AqlPgZVL813f/50LZduYDQsh Fps747leaFDD+/9acvt89WlMoIGhv2ORyAb+ct3xCwngHOabdKhIh31jPmvgOfxmcYn6 6gC1GRW3sEhOmCvXWIAUPrU6Au6PyxIsyXUQVhFppWY4QnBKs8hy5nXQrpNRQ9V2hcdl VCuQ== X-Gm-Message-State: APjAAAWrUDsiS3rAaV9XcKDFPM7+IxFDdpFy+smoL/EqtXjQcvYkqWmJ Q1TQGCIGsJILpK3wupnZ21YLRZTl X-Google-Smtp-Source: APXvYqy9Tek/rfdN8FSKl1Xy59X0HMa7b5wb/SsrD7fbH9ICe98jTkwoQ4wgbum47YDEGr9sINZe0w== X-Received: by 2002:a17:902:2963:: with SMTP id g90mr15351191plb.182.1554500407838; Fri, 05 Apr 2019 14:40:07 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id f71sm15300737pfc.109.2019.04.05.14.40.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Apr 2019 14:40:07 -0700 (PDT) Date: Fri, 5 Apr 2019 14:40:06 -0700 From: Denton Liu To: Git Mailing List Cc: Eric Sunshine , Junio C Hamano , =?iso-8859-1?q?=C6var_Arnfj=F6r=F0?= Bjarmason , Johannes Schindelin , Johannes Sixt , SZEDER =?iso-8859-1?q?G=E1bor?= Subject: [PATCH v4 4/4] rebase: teach rebase --keep-base Message-ID: <6635a99edebee43273ee47bbebe13dfe539fc69c.1554500051.git.liu.denton@gmail.com> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP A common scenario is if a user is working on a topic branch and they wish to make some changes to intermediate commits or autosquash, they would run something such as git rebase -i --onto master... master in order to preserve the merge base. This is useful when contributing a patch series to the Git mailing list, one often starts on top of the current 'master'. However, while developing the patches, 'master' is also developed further and it is sometimes not the bst idea to keep rebasing on top of 'master', but to keep the base commit as-is. Alternatively, a user wishing to test individual commits in a topic branch without changing anything may run git rebase -x ./test.sh master... master Since rebasing onto the merge base of the branch and the upstream is such a common case, introduce the --keep-base option as a shortcut. This allows us to rewrite the above as git rebase -i --keep-base master and git rebase -x ./test.sh --keep-base master respectively. Add tests to ensure --keep-base works correctly in the normal case and fails when there are multiple merge bases, both in regular and interactive mode. Also, test to make sure conflicting options cause rebase to fail. While we're adding test cases, add a missing set_fake_editor call to 'rebase -i --onto master...side'. While we're documenting the --keep-base option, change an instance of "merge-base" to "merge base", which is the consistent spelling. Helped-by: Eric Sunshine Helped-by: Junio C Hamano Helped-by: Ævar Arnfjörð Bjarmason Helped-by: Johannes Schindelin Signed-off-by: Denton Liu --- Documentation/git-rebase.txt | 30 +++++++++++++++-- builtin/rebase.c | 32 ++++++++++++++---- t/t3416-rebase-onto-threedots.sh | 57 ++++++++++++++++++++++++++++++++ t/t3431-rebase-fork-point.sh | 4 +++ t/t3432-rebase-fast-forward.sh | 3 ++ 5 files changed, 117 insertions(+), 9 deletions(-) diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 6363d674b7..569ab708d4 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -8,8 +8,8 @@ git-rebase - Reapply commits on top of another base tip SYNOPSIS -------- [verse] -'git rebase' [-i | --interactive] [] [--exec ] [--onto ] - [ []] +'git rebase' [-i | --interactive] [] [--exec ] + [--onto | --keep-base] [ []] 'git rebase' [-i | --interactive] [] [--exec ] [--onto ] --root [] 'git rebase' --continue | --skip | --abort | --quit | --edit-todo | --show-current-patch @@ -217,6 +217,24 @@ As a special case, you may use "A\...B" as a shortcut for the merge base of A and B if there is exactly one merge base. You can leave out at most one of A and B, in which case it defaults to HEAD. +--keep-base:: + Set the starting point at which to create the new commits to the + merge base of . Running + 'git rebase --keep-base ' is equivalent to + running 'git rebase --onto ... '. ++ +This option is useful in the case where one is developing a feature on +top of an upstream branch. While the feature is being worked on, the +upstream branch may advance and it may not be the best idea to keep +rebasing on top of the upstream but to keep the base commit as-is. ++ +Although both this option and --fork-point find the merge base between + and , this option uses the merge base as the _starting +point_ on which new commits will be created, whereas --fork-point uses +the merge base to determine the _set of commits_ which will be rebased. ++ +See also INCOMPATIBLE OPTIONS below. + :: Upstream branch to compare against. May be any valid commit, not just an existing branch name. Defaults to the configured @@ -364,6 +382,10 @@ ends up being empty, the will be used as a fallback. + If either or --root is given on the command line, then the default is `--no-fork-point`, otherwise the default is `--fork-point`. ++ +If your branch was based on but was rewound and +your branch contains commits which were dropped, this option can be used +with `--keep-base` in order to drop those commits from your branch. --ignore-whitespace:: --whitespace=