[英]Git rebase checks out parent commit
Git 在特定情況下表現異常,我能夠重現該問題。 我有兩個分支,比如 master 和 feature,指向同一個提交。 當我將 master 重置為父提交並嘗試在 master 之上重新設置功能時,功能分支也指向父提交,盡管我希望重新設置什么都不做。 我不確定為什么會這樣。
重現步驟:
運行以下命令重現初始 state:
deepakgupta @ git init
Initialized empty Git repository in /tmp/hello/.git/
deepakgupta (master)@ touch hello
deepakgupta (master)@ git add hello
deepakgupta (master)@ git commit -m "First commit"
[master (root-commit) 1750f9c] First commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 hello
deepakgupta (master)@ touch world
deepakgupta (master)@ git add world
deepakgupta (master)@ git commit -m "Second commit"
[master 7411ad0] Second commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 world
deepakgupta (master)@ git branch feature
此時, git log
如下所示:
commit 7411ad0984841b28dca630d54c3b079ebd01c7e9 (HEAD -> master, feature)
Author: Deepak Gupta <deepakguptacse@gmail.com>
Date: Tue Apr 7 13:58:09 2020 +0530
Second commit
commit 1750f9c5ba95f53742005657e9cee41390165dc7
Author: Deepak Gupta <deepakguptacse@gmail.com>
Date: Tue Apr 7 13:57:54 2020 +0530
First commit
現在試試:
git reset --hard HEAD^
git checkout feature
git branch --set-upstream-to master
現在是 git 日志現在看起來:
commit 7411ad0984841b28dca630d54c3b079ebd01c7e9 (HEAD -> feature)
Author: Deepak Gupta <deepakguptacse@gmail.com>
Date: Tue Apr 7 13:58:09 2020 +0530
Second commit
commit 1750f9c5ba95f53742005657e9cee41390165dc7 (master)
Author: Deepak Gupta <deepakguptacse@gmail.com>
Date: Tue Apr 7 13:57:54 2020 +0530
First commit
當我嘗試git rebase
時會發生什么? 我覺得 state 應該保持不變。 但它變為:
commit 1750f9c5ba95f53742005657e9cee41390165dc7 (HEAD -> feature, master)
Author: Deepak Gupta <deepak.gupta@rubrik.com>
Date: Tue Apr 7 13:57:54 2020 +0530
First commit
(END)
有人可以解釋這種行為嗎?
這個問題——或者功能,正如 Git 的人們喜歡提到的那樣——是由於 Git 的fork-point 模式。 git rebase
文檔對此進行了如下描述:
如果未指定
upstream
,則在branch. name .remote
branch. name .remote
和branch. name .merge
將使用branch. name .merge
選項(請參閱git-config[1]了解詳細信息)並假定--fork-point
選項。 如果您當前不在任何分支上,或者當前分支沒有配置上游,rebase 將中止。
(格式化,尤其是粗體部分,是我的)。 下一段提供了這個神秘的摘要:
在當前分支中提交但不在
upstream
的所有更改都將保存到臨時區域。 這與git log <upstream>..HEAD
顯示的提交集相同; 或通過git log 'fork_point'..HEAD
,如果--fork-point
處於活動狀態(請參閱下面關於--fork-point
的描述); 或通過git log HEAD
,如果指定了--root
選項。
(此描述省略了一些重要的項目:特別是,默認情況下也會丟棄與補丁 ID 等效的合並和提交。但這些都不會影響您的特定情況。)
分叉點描述位於頁面下方。 它提到:
fork_point
是git merge-base --fork-point <upstream> <branch>
命令的結果(參見git-merge-base[1] )。 如果fork_point
最終為空,則upstream
將用作后備。
upstream
是master
, branch
是當前分支feature
。 在我的存儲庫中,我現在運行:
$ git merge-base --fork-point master feature
af07c3c48ff0d499400ac539aa9c665a8dddcd6f
(使用我在復制您的示例時創建的存儲庫中的 hash ID)。 讓我們使用git log
我的存儲庫來查看兩個提交:
$ git log --decorate --oneline
af07c3c (HEAD -> feature) Second commit
dbf1741 (master) First commit
So, given this output from git merge-base --fork-point
, rebase
promises that the commits that it will copy are those that would be shown by git log af07c3c48ff0d499400ac539aa9c665a8dddcd6f..HEAD
:
$ git log af07c3c48ff0d499400ac539aa9c665a8dddcd6f..HEAD
$
沒有列出任何提交,因此不會復制任何提交。
要禁用分叉點模式,請運行:
git rebase --no-fork-point
或者:
git rebase master
即使當前分支feature
的上游是master
,一個顯式的git rebase master
默認禁用分叉點模式。 在使用顯式分支名稱時強制 Git 使用分叉點模式 - 如果您希望這樣做; 在這種情況下,您可能不想要它——您也可以運行:
git rebase --fork-point master
完全沒有 arguments ,您將獲得git rebase --fork-point master
的效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.