From patchwork Mon Apr 15 22:29:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10901657 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 BE984139A for ; Mon, 15 Apr 2019 22:29:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A96F328892 for ; Mon, 15 Apr 2019 22:29:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9DE1E2889E; Mon, 15 Apr 2019 22:29:29 +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 7D6DF28892 for ; Mon, 15 Apr 2019 22:29:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727235AbfDOW3Y (ORCPT ); Mon, 15 Apr 2019 18:29:24 -0400 Received: from mail-pl1-f175.google.com ([209.85.214.175]:42358 "EHLO mail-pl1-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726085AbfDOW3Y (ORCPT ); Mon, 15 Apr 2019 18:29:24 -0400 Received: by mail-pl1-f175.google.com with SMTP id cv12so9288048plb.9 for ; Mon, 15 Apr 2019 15:29:23 -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=p+jGxpYpqOozD2fbHVzCIdAuOR4CHxaRcTMKY/8ZWXc=; b=IucAF+bKJMYfvrSDe6qTd6/Av4W51oEsbzzuX1leLworaO9edVcOQ1yBbtLrhLRns2 xXR3dQnWC8eO0Alj1R1qNMxL6kKDRgrxVdUSuJ45VUBz+hmXcIvDKA7vY3lkWTF/9jJB 6+6Ldm2PvTxvhv+lf7S8lEmhy3MmbiMsj4X2S3dVbj/9V7Ot0JRx5fPpC5Oefe9PeJsp MHAEmPvE7hr8/KfcEjByfzzsgXCu7N/IKafQd6PzdL4fslfDXW/mx+E8TMrDW1ldPkgU XUPiSsLiRliCou9tUI8ulBEySuxRcbgdoDK/XaOvmtXh8ES+yH7MmGuL1Cb6pY7kAASE QiDQ== 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=p+jGxpYpqOozD2fbHVzCIdAuOR4CHxaRcTMKY/8ZWXc=; b=Sc4lGSl+LptCFBUW8nWgg3sgAIH5HwGUA8C0xepw92KjZG0Tp2LF6YA6ATu4sqp9r6 PDS07ve7goiq2YDEJJqIe+qqS/nxsOzawU63USIkoJke9a00c5eZcZff7vR1kffhfgr8 upX60LGUEXUkZmdLCQ5fbIrsSYKwcImFEjTMEAodyDXQr5QpcpTWs5Bjf2AgkcgCBAGo vOosli9QV2Xbyhgt83B2SF/94DCdt/vGHUQJaSnbp9vz8lKIzwGZ68tuFlEOFXLzuE0R heRnwKX0wdvOGYGflnc53iwMkuyfeBXnvd3BldswsLVpyrVPWWpVP9o1I3WnTWTgd5S+ CZsg== X-Gm-Message-State: APjAAAWjZuRpWJkdAc+2brZ/yAtctabEDejrJRzEussemJzmbUNdH4DS Mw+fwywUKmuWKlpa4XGa8xjbSIgQ X-Google-Smtp-Source: APXvYqwJUlxVdJJOxLpmShdXNdCkmUgCi8+Zltqf4mP0ogwG8C2KscLkhvlYbHUL5RU1c76dugsReQ== X-Received: by 2002:a17:902:6bc5:: with SMTP id m5mr78080961plt.180.1555367363035; Mon, 15 Apr 2019 15:29:23 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id t13sm58495888pgo.14.2019.04.15.15.29.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Apr 2019 15:29:21 -0700 (PDT) Date: Mon, 15 Apr 2019 15:29:20 -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 v5 1/5] t3431: add rebase --fork-point tests Message-ID: <0f1e9ac5c8b88649a378f676ee924a966ce0693c.1555366891.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 Mon Apr 15 22:29:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10901659 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 EDC9B1390 for ; Mon, 15 Apr 2019 22:29:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D8F4328892 for ; Mon, 15 Apr 2019 22:29:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CDD0D28899; Mon, 15 Apr 2019 22:29:29 +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 5014428893 for ; Mon, 15 Apr 2019 22:29:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728204AbfDOW30 (ORCPT ); Mon, 15 Apr 2019 18:29:26 -0400 Received: from mail-pl1-f195.google.com ([209.85.214.195]:39142 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726085AbfDOW3Z (ORCPT ); Mon, 15 Apr 2019 18:29:25 -0400 Received: by mail-pl1-f195.google.com with SMTP id a96so9276244pla.6 for ; Mon, 15 Apr 2019 15:29:25 -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=IQRgsrbz2ztUyDBhoaPa2jT2qJ3wAPV7lKCssfGs++Y=; b=fNHj8kATadJof/sTVX6MNL67x4fMzAoWdC2kkkwCyWJmMYBnHty4m3YvJVfzrE1tLB NUj7pQI1Gps9OkrI6RBY7B2jtXXGOOGuxqX3pOOttSThZGORu3YgHSHDc6zo/UdxfgMl L+ZYCGJ0ZiScpe4/pl3c5aHhaFuNj+7w2qRmP081882VkUoT3TorPttccSrXdbwUmVc7 OmmHlmDUXTKR7Ypd1EIXlk7LnPB7kguo84Du2QV3rSQ+S6EKbhbtaHRJT5BMNg8obGV7 VL+MSjz678kIObFrv++i1KLRYBiZK/rQOhoDi1Caj6n5TNd1h2DeQ/c7+j9oFDPfZPch WU+g== 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=IQRgsrbz2ztUyDBhoaPa2jT2qJ3wAPV7lKCssfGs++Y=; b=I9wFr5eKmBBzpO2MeI33nr/URg7pQHTa7yJe3fp6oDOhWjlPhGIxv/pnc9/6z/ROOY fdFCtRtfozqFOnR7Gm2dc/Y2b02ehSz7GNIEGUL1ltBnGz3MYeQ5cIdM/crInv28ZvXb +w7JdwZRHK3AnqS42Ti1p/3mLlhc0oWLB6dRMV4V/WS7cB32PKEbHctWmDq0VjRZ+ob9 7GMObmWAD7fFmACXVAKuS5EIytAhhVkPf6qIRx9NLrHnmcaO5xypgCr/FspsxbqKSwhR VaqjOXJU7ahfQqS5mYejqfrVT0srgbiB9ypNPiyRlIcMlQ8ieP6bjGeB00/iABNHm4Zy kNOA== X-Gm-Message-State: APjAAAVD+QaZtPq+KWy5+1qySQe8vxINuOob45dCd1c2+GksRzN6wvWG P68WDxgd9xKL76G/60fr+TW0N1fg X-Google-Smtp-Source: APXvYqw23Tlcf086kdw5w3/yAMPg9xKO38/EXu0ETNP3UTpy4qafylAAKlJxYrXQeJw2HuzCpxfMGQ== X-Received: by 2002:a17:902:f089:: with SMTP id go9mr75480866plb.309.1555367364448; Mon, 15 Apr 2019 15:29:24 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id i135sm66748143pgd.41.2019.04.15.15.29.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Apr 2019 15:29:23 -0700 (PDT) Date: Mon, 15 Apr 2019 15:29:23 -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 v5 2/5] t3432: test rebase fast-forward behavior Message-ID: <148027a14be9b0ee5dde741e4528255f2ca3577a.1555366891.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 are some cases that currently don't pass. The first case is 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. The second case is when we are doing "git rebase --fork-point" and a fork-point commit is found. Once again, a full rebase happens even though a fast-forward should happen. Mark these cases as failure so we can fix it later. Signed-off-by: Denton Liu --- t/t3432-rebase-fast-forward.sh | 72 ++++++++++++++++++++++++++++++++++ 1 file changed, 72 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..4f04d67fd7 --- /dev/null +++ b/t/t3432-rebase-fast-forward.sh @@ -0,0 +1,72 @@ +#!/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_rebase_same_head success --no-fork-point +test_rebase_same_head success --fork-point master +test_rebase_same_head failure --fork-point --onto B B +test_rebase_same_head failure --fork-point --onto B... B +test_rebase_same_head success --fork-point --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_rebase_same_head success --no-fork-point +test_rebase_same_head success --fork-point master +test_rebase_same_head failure --fork-point --onto B B +test_rebase_same_head failure --fork-point --onto B... B +test_rebase_same_head success --fork-point --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_rebase_same_head failure --fork-point --onto B B +test_rebase_same_head failure --fork-point --onto B... B +test_rebase_same_head failure --fork-point --onto master... master + +test_done From patchwork Mon Apr 15 22:29:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10901663 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 4CA9717EF for ; Mon, 15 Apr 2019 22:29:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3478928893 for ; Mon, 15 Apr 2019 22:29:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 292AD2889E; Mon, 15 Apr 2019 22:29:30 +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 79AF028896 for ; Mon, 15 Apr 2019 22:29:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728208AbfDOW32 (ORCPT ); Mon, 15 Apr 2019 18:29:28 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:40875 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726085AbfDOW30 (ORCPT ); Mon, 15 Apr 2019 18:29:26 -0400 Received: by mail-pg1-f194.google.com with SMTP id d31so9272563pgl.7 for ; Mon, 15 Apr 2019 15:29:26 -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=Mnq02rHN96XPVyG4a6LI5g3kEAAFBh9i22dZzmktRso=; b=qs64WU60OK/4zuBA490VskCdM3WvsE9ULTbvBv+0XtNq5v4llxnQH3aJM/pIpBL1EY 3v2XSsc5rdyc++B4NCDL1fVq8sNvuGEn+DubRjas/JzxXt692p1Qm0F8hasMAfI6+H/4 /uJ2o4tM4KYXB6qU5csM/ruQry4+VTyTvQx3ESWiKgPcL95O+im7zVGeRd+b4kU0FdHH D58ucDujxv88Ff+NfPoSwaUwWJOupyR/ttdVxcIUHpRY8DIl2HSslSqVxK0B1RhqNvFK gyniVaP19/G2+VQNIgYsgGzT1jmgTJi5GU29zg2W7NT5e2g+Yp9xuNFjvOhQ0k05RGc0 cPpA== 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=Mnq02rHN96XPVyG4a6LI5g3kEAAFBh9i22dZzmktRso=; b=NIvDh77KqVuFFNDEyOQDHFwVATFhiue3o0Ntsv4fNqztZTzNCMW4b/7v3tQZOwY4XY NcjN1FDFGmMc+Nuk9ZG8hYMf2VZ+RDRav+QRKCBY1ZKeVJnjx1ePsUoO5ww90PSbncZ1 Qvvyq3ITA+rgBv6L97eFkz5/9BTrXMVVURVTMeuJrZ0Gxbwb3RRCnkdRhob30glYn41N Z3Sb/Axj7eys60S5RpHdt/4UrUrXdJOtvb44RYhiPEjJQJ9rGjGELl6U8W0aEbfBeucJ SxTeUKW6NiS7mdn+JvRlGURYwrHSgsrbiajLtiE/lMm0x/jIvYc3GU3vMnfod70Yqpds OFjQ== X-Gm-Message-State: APjAAAXkwGAJQieVLyFocy6BshyNnz7OUE5FHIl7DB9nUh50KthRoNvQ D94l8kZmvIgZds3KhiYTsTkrUjvP X-Google-Smtp-Source: APXvYqzxSQxl0DfkA+bQDlLNzyS+6eRm9fx2ldUxzubiIQbOnKNbivDOoAZo+ytWvRgH0dvAyQuc4A== X-Received: by 2002:a62:e304:: with SMTP id g4mr72841333pfh.71.1555367365747; Mon, 15 Apr 2019 15:29:25 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id k6sm58245642pfj.173.2019.04.15.15.29.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Apr 2019 15:29:25 -0700 (PDT) Date: Mon, 15 Apr 2019 15:29:24 -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 v5 3/5] rebase: fast-forward --onto in more cases Message-ID: 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 | 4 ++-- 4 files changed, 31 insertions(+), 17 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 4f04d67fd7..d0e5b1f3e6 100755 --- a/t/t3432-rebase-fast-forward.sh +++ b/t/t3432-rebase-fast-forward.sh @@ -64,9 +64,9 @@ 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_rebase_same_head failure --fork-point --onto B B test_rebase_same_head failure --fork-point --onto B... B -test_rebase_same_head failure --fork-point --onto master... master +test_rebase_same_head success --fork-point --onto master... master test_done From patchwork Mon Apr 15 22:29:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10901661 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 33D97186E for ; Mon, 15 Apr 2019 22:29:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1D39E28892 for ; Mon, 15 Apr 2019 22:29:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 11E3528899; Mon, 15 Apr 2019 22:29:30 +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 3100E28898 for ; Mon, 15 Apr 2019 22:29:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728215AbfDOW32 (ORCPT ); Mon, 15 Apr 2019 18:29:28 -0400 Received: from mail-pf1-f195.google.com ([209.85.210.195]:40190 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728206AbfDOW32 (ORCPT ); Mon, 15 Apr 2019 18:29:28 -0400 Received: by mail-pf1-f195.google.com with SMTP id c207so9323257pfc.7 for ; Mon, 15 Apr 2019 15:29:27 -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=59WCqBnAXQktICWHjz4e8DHvy2E8XOWgjme3Yt2djMw=; b=YhBEdIZpRmbFwT6Wgjote+ECziVLHXKyxe6qX1/+MgRhmaCovGUWqpEbLHHH/ZBN44 MgPbQqX2wbQhj6+yKc3gODscqD3jD0nG9yaHe0lspdShj5tGPkgwBXx5zSzb5XJEKS5x 1zufxvlYVzrS2IqbQYss1V6bVTpl+wzpIgUn7zgyCFzcyIc0g77lGDD0O2aYFVHVj/q7 XEM48oFSCp6YPKLu4ToawmuVSz4MVuQ4ZIY2SG3JMZycxiIIbT8SpngNIpiZsT9rv9la pQPfSjadJq4Fx8Hg4Boss8Eau3zT4vXhmr3pamDw4P16cAsyQs972dOXlMuobOBwWHO8 YtuQ== 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=59WCqBnAXQktICWHjz4e8DHvy2E8XOWgjme3Yt2djMw=; b=PzIlLVrJE0/4YSRTapMNYUCGTA0dWd1HLLtvkhXmXbYUwNtECiNKPzwyWlT/WVe/1K abweXYicVWqyx+rqKvalqSzgBQtq9EpCy/YcM5329kTJCsKo0wsy9PkD65KcaJ/f4l7K kEr93ny/VatXmPS0JFwCFZ3n0PlDDN9QuSVpU9xEIFwWKz2x4SMexwk0x+JVyJZW4zFu c7M9+JLkBp10QNoh6KGs06jMKmrOQIC+mK9x3VaIrLV/rb9pPW92lNPyS34T9bp7HpmJ Q2YZDKX04mnxVzrTPQJ4LPgePXrZvpYxcywDxcBvLLUvWXoZPc6NW5xwfuTapHMhaeKB EHnQ== X-Gm-Message-State: APjAAAXnNY5fQm42Z8lw01kGLJMNL23z42kLu5zMAUSNgWc7vDBBCue5 6pN28QHHyk0slWkr6bfOEbWUt7TI X-Google-Smtp-Source: APXvYqyv8S7SsUNEaZiBudtXRNEVhm+bxKj3GEzbXRuP+hN3J4T+xyIec4lTVCFIRg/c4cDTaNfeLw== X-Received: by 2002:a65:480c:: with SMTP id h12mr72325054pgs.266.1555367366995; Mon, 15 Apr 2019 15:29:26 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id 26sm67188664pfj.93.2019.04.15.15.29.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Apr 2019 15:29:26 -0700 (PDT) Date: Mon, 15 Apr 2019 15:29:25 -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 v5 4/5] rebase: fast-forward --fork-point in more cases Message-ID: <2256a902c17fb70ddedeb65f5d0395c5767800f2.1555366891.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 rebased with a --fork-point invocation where the fork-point wasn't empty, we would be setting options.restrict_revision. The fast-forward logic would automatically declare that the rebase was not fast-forwardable if it was set. However, this was painting with a very broad brush. Refine the logic so that we can fast-forward in the case where the restricted revision is equal to the merge base, since we stop rebasing at the merge base anyway. Helped-by: Ævar Arnfjörð Bjarmason Signed-off-by: Denton Liu --- builtin/rebase.c | 9 +++++++-- t/t3432-rebase-fast-forward.sh | 12 ++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 7aa6a090d4..5f00d91b68 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -896,6 +896,7 @@ static int is_linear_history(struct commit *from, struct commit *to) } static int can_fast_forward(struct commit *onto, struct commit *upstream, + struct commit *restrict_revision, struct object_id *head_oid, struct object_id *merge_base) { struct commit *head = lookup_commit(the_repository, head_oid); @@ -915,6 +916,9 @@ static int can_fast_forward(struct commit *onto, struct commit *upstream, goto done; } + if (restrict_revision && !oideq(&restrict_revision->object.oid, merge_base)) + goto done; + if (!upstream) goto done; @@ -1701,8 +1705,9 @@ 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 if this is not an interactive rebase. */ - if (can_fast_forward(options.onto, options.upstream, &options.orig_head, &merge_base) && - !is_interactive(&options) && !options.restrict_revision) { + if (can_fast_forward(options.onto, options.upstream, options.restrict_revision, + &options.orig_head, &merge_base) && + !is_interactive(&options)) { int flag; if (!(options.flags & REBASE_FORCE)) { diff --git a/t/t3432-rebase-fast-forward.sh b/t/t3432-rebase-fast-forward.sh index d0e5b1f3e6..1cb2896fb4 100755 --- a/t/t3432-rebase-fast-forward.sh +++ b/t/t3432-rebase-fast-forward.sh @@ -35,8 +35,8 @@ test_rebase_same_head success --onto B... B test_rebase_same_head success --onto master... master test_rebase_same_head success --no-fork-point test_rebase_same_head success --fork-point master -test_rebase_same_head failure --fork-point --onto B B -test_rebase_same_head failure --fork-point --onto B... B +test_rebase_same_head success --fork-point --onto B B +test_rebase_same_head success --fork-point --onto B... B test_rebase_same_head success --fork-point --onto master... master test_expect_success 'add work to side' ' @@ -51,8 +51,8 @@ test_rebase_same_head success --onto B... B test_rebase_same_head success --onto master... master test_rebase_same_head success --no-fork-point test_rebase_same_head success --fork-point master -test_rebase_same_head failure --fork-point --onto B B -test_rebase_same_head failure --fork-point --onto B... B +test_rebase_same_head success --fork-point --onto B B +test_rebase_same_head success --fork-point --onto B... B test_rebase_same_head success --fork-point --onto master... master test_expect_success 'add work to upstream' ' @@ -65,8 +65,8 @@ 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 success --onto master... master -test_rebase_same_head failure --fork-point --onto B B -test_rebase_same_head failure --fork-point --onto B... B +test_rebase_same_head success --fork-point --onto B B +test_rebase_same_head success --fork-point --onto B... B test_rebase_same_head success --fork-point --onto master... master test_done From patchwork Mon Apr 15 22:29:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Denton Liu X-Patchwork-Id: 10901665 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 A7B0E1390 for ; Mon, 15 Apr 2019 22:29:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 88B4028892 for ; Mon, 15 Apr 2019 22:29:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7742D28898; Mon, 15 Apr 2019 22:29:32 +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 5E7DC28892 for ; Mon, 15 Apr 2019 22:29:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728228AbfDOW3a (ORCPT ); Mon, 15 Apr 2019 18:29:30 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:39314 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728206AbfDOW33 (ORCPT ); Mon, 15 Apr 2019 18:29:29 -0400 Received: by mail-pf1-f193.google.com with SMTP id i17so9324994pfo.6 for ; Mon, 15 Apr 2019 15:29:28 -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=6ZOpwojvfi0WOf9LjTZcG+/lLRztkb6qW5wiVNNq7Cg=; b=GS+Fykl3TcnrC633AYuspJYdCdaRoqOUBZBWYVvbLXwQxJwgQ2DaR4ors6w6N/bw/m 5gdP8r04+5iixoRY+Ze96uQOoMKGw97wLlbpRQe8ezQ6WwMb5xmegHKUZryxD3zpRWMQ /dLbbxcHVtbb3fycMYUbPTbM3d+RqlcUpmApc7nqHG8hwf6XXlziUbqI96nogT+FOopx nNW65zlBPdbHl3f1LplbOrdxuAxN/FFUC7w8qF+2EcN2aEmw+CApyVk85iy1nzEG1M1K pWY7Ujv3UFLPyUeqZYKIBoQ0iMO6RNJMf0bX8AcWVR4QicVb3TU3NeQumhVjKBj+sDvR AqIw== 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=6ZOpwojvfi0WOf9LjTZcG+/lLRztkb6qW5wiVNNq7Cg=; b=Bjxsx3WMJLoKV4sbmWePLJXWtjTx5IxMyQ1B+lnUaXuR54ZseAigsxcXGmIsTF6JgJ ddubI4daeH47eKxSZ0QMjMcDi2qM5VGyXkGhWD68/1jSfHO4mZHQd+Gb1gSuHGGLpGmj CVZBgNo9juNiwN9TZ1lXkeDfWgAFHFkd9wqFx2KsjAbw4rbjKwt+jzC/K9ielGOpY2qJ gmWZqK3nGd6bf++TMuObcRJVLHafG9CPZos2jijAAFYzdZIstLBmYdEUJlV0QgC2ZTvb H2703oY+A65wMGUEeAJLRZKeWVLhYkuB0jdU1Yd+hnoqqudZPiPdugvojxwrpuSKLs9t 9Zew== X-Gm-Message-State: APjAAAVbmOnn1YuJqId5YxfbHgP7Lj/CLEW0si6Vs6N82p8iK6W0gYEc jkHEkkAnvHWitXz3jkVWM4Lc3Shh X-Google-Smtp-Source: APXvYqx4AEHl6V77ZW+cuEZChfIGgY3wClhq7BoB42ElCRt3dcoAUMeq9+zTFLCvQibkPUYbIeZP5g== X-Received: by 2002:a63:8548:: with SMTP id u69mr73895955pgd.85.1555367368250; Mon, 15 Apr 2019 15:29:28 -0700 (PDT) Received: from dev-l ([149.28.200.39]) by smtp.gmail.com with ESMTPSA id c5sm31650194pgh.5.2019.04.15.15.29.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Apr 2019 15:29:27 -0700 (PDT) Date: Mon, 15 Apr 2019 15:29:27 -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 v5 5/5] rebase: teach rebase --keep-base Message-ID: 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 | 11 ++++++ 5 files changed, 125 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=