From patchwork Mon Apr 1 20:51:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10880559 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 A3F3A17E1 for ; Mon, 1 Apr 2019 20:52:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 902262872E for ; Mon, 1 Apr 2019 20:52:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8E38D287C2; Mon, 1 Apr 2019 20:52:03 +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 3D1CC2872E for ; Mon, 1 Apr 2019 20:52:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727190AbfDAUwA (ORCPT ); Mon, 1 Apr 2019 16:52:00 -0400 Received: from mail-pg1-f182.google.com ([209.85.215.182]:43599 "EHLO mail-pg1-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727065AbfDAUwA (ORCPT ); Mon, 1 Apr 2019 16:52:00 -0400 Received: by mail-pg1-f182.google.com with SMTP id z9so5354243pgu.10 for ; Mon, 01 Apr 2019 13:51:59 -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=l9gqnsFc8EXx2L2TI7f54kgpVmhmVc09dxcAuCW7IF8=; b=uNjYXHWt1fhTCIVMFZ0wi7HUVh21xZmZp67208MUXUPmEodk8ZJcVMukbd2HrbTZys oBYE3coUKshMNx65zPaDPXzRRxyOjVHno+pT6t697ODr3Cq9TTYVwuVxqPUriKJM9HQX ROPNm8MLkyOB74tR63OmQYBivxz51ujRXpPOHsR/eYvhjLHiNI8Tla06mdxcIYjVtAFe qDM1ONSad4m8JJCNExQBTghPNGfR5c4nBOIIEY53vJAvVyCA5f/itaTWottjV0x474ja NULp+IYpQPGWOUKyr07DQN/C6m2xMed3iBfYL4x9K50+SZfOl2LTek5EZq05H2E2feqP fsxg== 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=l9gqnsFc8EXx2L2TI7f54kgpVmhmVc09dxcAuCW7IF8=; b=k2kP4jWhJ9r5aTKpA14BMwOGArhjHhh2+fYq5I/WGJxugC7vRnrI6vd8BDAwkENL5K HV3USYSEizMTZnljSeK9R2vMB2RtSEfT21/dzB1UMpRhBI4/LjsNfBOc6fVZH3NeJKrz TqKZs/+GNjnmJ235fff9CxG5HXPQP/nqnUlFWQycCwoAnu1FIN1s852CjTBXbEjniDjp MUHfsot1a5TnwQmOU7Jo8b6rmbvFFHaRjQ04GU0uLpD8okayPZ7tSRgdjkePivIRZKQu ypQO6zkFE1rInYjQqkW2neCgHKR0rdjEpwcx/gHa6cC2UCIOg3It0/b60h2UFsqbbjmO 1Tfg== X-Gm-Message-State: APjAAAWjDlxILegR5VQFS/EaEYZ25g3+Hojt6s0Rkp4mPd6Ls22xpNjG fv2ygzsVV0yH5j8zRg2WJUu7GRrE X-Google-Smtp-Source: APXvYqwRztB09gpxaIM/BK1YvmrUlE+BQUhEyccM9AMSrrpaYyPNbO7QUGtiAN6tuy9gmat/N2E0CQ== X-Received: by 2002:a63:158:: with SMTP id 85mr63612100pgb.351.1554151919053; Mon, 01 Apr 2019 13:51:59 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id j19sm9608686pfh.41.2019.04.01.13.51.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Apr 2019 13:51:58 -0700 (PDT) Date: Mon, 1 Apr 2019 13:51:57 -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 Subject: [PATCH v3 1/4] t3431: add rebase --fork-point tests Message-ID: <234ac9f024bf4e6b4944fd8f3912cf6367cf828b.1554151449.git.liu.denton@gmail.com> References: <20190328221745.GA3941@dev-l> 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 Signed-off-by: Johannes Schindelin Signed-off-by: Johannes Schindelin --- 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..8e2483b73e --- /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 is side out +# +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 Mon Apr 1 20:51:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10880563 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 BB80117E1 for ; Mon, 1 Apr 2019 20:52:07 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A25A8286B3 for ; Mon, 1 Apr 2019 20:52:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9670C28768; Mon, 1 Apr 2019 20:52:07 +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 7326A286D5 for ; Mon, 1 Apr 2019 20:52:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727352AbfDAUwC (ORCPT ); Mon, 1 Apr 2019 16:52:02 -0400 Received: from mail-pl1-f194.google.com ([209.85.214.194]:34343 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727065AbfDAUwB (ORCPT ); Mon, 1 Apr 2019 16:52:01 -0400 Received: by mail-pl1-f194.google.com with SMTP id y6so5087517plt.1 for ; Mon, 01 Apr 2019 13:52:01 -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=xW00cASk1Oe66ISAgQGokK/mMcbXitwScnZIEDwxwo4=; b=EwvJuohsYGt4kE3/+7SMJNnVuWETx40/totWh+2y7B7RdkxiXYnn25VG5mUmndgJLI smGI4IiWgd3pFMMDiDFenN87tA+XhXIi2sH+g/akMQwMFeP6eKJ30ryRjyM36doTVBh2 FydjYVJtQXuG15rQ4qjP4064GSr11yNFav41T/9/QOa0poVzfceiCFmszR6vymIxUfX+ J3NTnkGOhELzJc0Vnh4AalFoVPzm5bnAYmM+tY2k/eDfpsq8/M91GIlPlLtX9UTdNBH5 JU2qJu+KfdgsY9S2w6tPLLCXn7tDm6pDGhd3TqWArlNiJ9mxi+7PrimZllWGwnJUw5b2 u71w== 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=xW00cASk1Oe66ISAgQGokK/mMcbXitwScnZIEDwxwo4=; b=h1QsIOUaVRJjaOLigx8/k2r/41+LCfi83ayq2y4/nAhj5glP/KBtWZBaN96bzsjIFQ asDmfRs07MDhZjK++iBZYDAruZMRu/yLMHzGLcuesBIiHWM2F6OtianaIsklk5hEurR+ jRdIk4TzdKgJvO+EukrW2JWhtMUWuN42BnhW//Xr2+W4F3FCuW6i7YRfCghNRYyBkxk7 KxJhYB5NaVwaMC24fA7OmQc2PmoNGG0+NU80SzELU20RKurxbnApLDXVwhuLHrRbFqlw /9AweX6h15n9RJAU7lliV7Nl4WNfELeUMzZn+Hu105CnikcB35o6PtKVvt3Q3zE5AGGA Fpcg== X-Gm-Message-State: APjAAAXm0byCZTExwy55y52mAXSSz3ctKqjL9c+RMNl8UBdLw04M83O1 PeKLRpQ7WHtwXzQTOE51n74PcRS5 X-Google-Smtp-Source: APXvYqyOo+/AKLHe+yqoQGpaP25ubOISN5OaYQ7aZ2AwJVRV2RKX9YqW1aLDlqHoGbQTx0uRikkabw== X-Received: by 2002:a17:902:f089:: with SMTP id go9mr26310103plb.309.1554151920651; Mon, 01 Apr 2019 13:52:00 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id f125sm20023797pfc.91.2019.04.01.13.51.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Apr 2019 13:52:00 -0700 (PDT) Date: Mon, 1 Apr 2019 13:51:59 -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 Subject: [PATCH v3 2/4] t3432: test rebase fast-forward behavior Message-ID: <4da2fe9b0429e10821e1cb96b79500c749fc31be.1554151449.git.liu.denton@gmail.com> References: <20190328221745.GA3941@dev-l> 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..3e6362dd9c --- /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 Mon Apr 1 20:52: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: 10880561 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 65342922 for ; Mon, 1 Apr 2019 20:52:07 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 49A4728718 for ; Mon, 1 Apr 2019 20:52:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3E3D628768; Mon, 1 Apr 2019 20:52:07 +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 A78FB28716 for ; Mon, 1 Apr 2019 20:52:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726948AbfDAUwF (ORCPT ); Mon, 1 Apr 2019 16:52:05 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:41398 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726968AbfDAUwD (ORCPT ); Mon, 1 Apr 2019 16:52:03 -0400 Received: by mail-pf1-f193.google.com with SMTP id 188so5164399pfd.8 for ; Mon, 01 Apr 2019 13:52:03 -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=sUd3y9OMtjoY6/rLAj0JLnJi4JVVza1pxCbxcQeQvx4=; b=rKGWO7BjYkeXqF9/EmdldZmhUW0x/HXajAN49QCnojBrkONCJKc7HmDOdYiiciEOz7 7cIgskaanqgVzDk5Y8xIl4APldtYeHklxAsTLlVY5vne7od0s9WMB5fIdgSudHviorZT Cfzca5ZBvxJckH4oduCbyj0OD5bLcoOiwd+98/ZVc6GaiARBRls5Fw01+Pk7My9w/nR1 4TtQ+xErTyAtuH/oQA1AwB6umjce8vb8/ltubZBoP9mf5uxkh8el/YpYzrAjwPCiDaSL lMn5gL10VcwQFaRUKPqYEuNplsF7VLrAd36HJvukfxgOBHj1Y+liiJ6P74vo6HEuddl3 dHSA== 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=sUd3y9OMtjoY6/rLAj0JLnJi4JVVza1pxCbxcQeQvx4=; b=uoGPmCw6Vf86z4xvQrsgbixpb8VZmkazXyIkWJHLpDlWqREl28xa5V/WK389A9KrX6 MofyD2mQqrJvAelzDm4XnYS5fEiy9QDtvmg2v+YxH6jkax6BLHq82e6h1r/jty+nLRYy OV3iypKwtiJ8FXzSv1SYvicKU3oyDJ3cWfoxEoTPsqDum2b5Xmlp5JhDl61JeRzbDwZU u/5O0uDgZ09uHymC9Jt+V/RXoKzFIDMZaJRiD+O3fQpv+2OrXxgkty3aZ9Gdj1ImGE9t cjUquuaIOXAnui2ZTelGgu1U+Q6hRaZn12dy6PTgVWTZb1w7xzSJRxTsxy0ka+gR5SOR bDmw== X-Gm-Message-State: APjAAAVmRKLYHLAzOssLMubMGoYBicgpexOKw2SRDwJ7wGaP7ci3i9Ug XVLQWQj036daC5k3tfIhhmrWOZHg X-Google-Smtp-Source: APXvYqw7KRMcHDgY1aEVHelMjNlR2hqvb1HrSmSGkC3CPDWYFRjLdaVWnuiRLVcZgguwbr/o+ndkGg== X-Received: by 2002:a63:4e57:: with SMTP id o23mr59359274pgl.368.1554151922534; Mon, 01 Apr 2019 13:52:02 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id t24sm8498523pfe.110.2019.04.01.13.52.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Apr 2019 13:52:02 -0700 (PDT) Date: Mon, 1 Apr 2019 13:52: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 Subject: [PATCH v3 3/4] rebase: fast-forward --onto in more cases Message-ID: <281443b2ae2dcf6a5a4d5766d4c006a4d0e22c91.1554151449.git.liu.denton@gmail.com> References: <20190328221745.GA3941@dev-l> 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. While we're at it, remove a trailing whitespace. 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 3e6362dd9c..414b4216d6 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 Mon Apr 1 20:52:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10880565 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 5D6DC14DE for ; Mon, 1 Apr 2019 20:52:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 426BD28689 for ; Mon, 1 Apr 2019 20:52:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 406ED2871A; Mon, 1 Apr 2019 20:52:10 +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 2EE1F27F3E for ; Mon, 1 Apr 2019 20:52:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727447AbfDAUwI (ORCPT ); Mon, 1 Apr 2019 16:52:08 -0400 Received: from mail-pl1-f195.google.com ([209.85.214.195]:42094 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726968AbfDAUwG (ORCPT ); Mon, 1 Apr 2019 16:52:06 -0400 Received: by mail-pl1-f195.google.com with SMTP id cv12so5068952plb.9 for ; Mon, 01 Apr 2019 13:52:06 -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=06zGSIOvlTEKmIrN9ecJxVTIlas5rzEUjQW+KHAXsnw=; b=VGL6B0sxaejRnBgyylXo+pyXcYuUDWTEFNVUCGkBpMjZ3zfUtN2sa00eEB/eqJfED8 bL03oX9PQtFBzNIspMXIS+YXGMgCv9nvecG7S2m4K2UrYY6mlPVvWcCmN3BlKb37OZYb q3USK4Xu3n7sp4b/DB9wlU83pyB3kMgYmEp216f79XbI0lpIk7WOzpw9z+4UR99yetcx TzV1p4zuXJ59begmbfWCllhwqMVmAUhA78qlbEMbbjOe3c/3GAto5939JSrxf94aq/zZ Ek/amBk4P0vzjUZlFR3WZUqCnqsWcKRXZiRyvzZaZr7FsNmkDGpUHRtZXUjSWIcbO8eE Qf9g== 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=06zGSIOvlTEKmIrN9ecJxVTIlas5rzEUjQW+KHAXsnw=; b=cw02ps+1t+r1w+GjL2OQGaz2Ql3jA4BQpxDCHASU+gX4Mk5UM7WGoESjYZmE819gzp d3DoaqFqk8rFig3lLsmwc/L5E9tio7nHhfJ+wRbmNrHjYzLE1BYwB9toGJuwFnjfl7fI IMOgqAkzBRiy0gl5huGDepWzGktaeUcWAD65Dr6/6ZffpjnOVz7sFoXK2hgJLAKBIY35 g5XBK3OVdEU1WXhMF5UUhpiO7OApX7veQZeFJBXcEEVs9jSA+yUWvFpZ69TJvMhIdmWp ut7w8NjSYxX6+BvYG0TK9+0hRgNVjMw2V9wk32KIi7maCxDi6akWO/RoHoaTrAld2Pm3 IC3w== X-Gm-Message-State: APjAAAVr+oiAN/8dgcItkpDnBt2/Fs4L8diDEYx+ScKKuGmFoWA1vCCT CCHj4/NQ3n8XRhjKnwYE7PnDOK71 X-Google-Smtp-Source: APXvYqyXfGaiYESPKVLVMNnfor+8MBDvgL90FwrF4Q8HC3cwI6wAp2PmjeURNS1yTjPiOJinXKg9Mg== X-Received: by 2002:a17:902:2b8b:: with SMTP id l11mr67955033plb.18.1554151925236; Mon, 01 Apr 2019 13:52:05 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id p3sm20249704pfn.167.2019.04.01.13.52.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Apr 2019 13:52:04 -0700 (PDT) Date: Mon, 1 Apr 2019 13:52:02 -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 Subject: [PATCH v3 4/4] rebase: teach rebase --keep-base Message-ID: References: <20190328221745.GA3941@dev-l> 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=