簡體   English   中英

Git rebase 檢出父提交

[英]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 .remotebranch. 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_pointgit merge-base --fork-point <upstream> <branch>命令的結果(參見git-merge-base[1] )。 如果fork_point最終為空,則upstream將用作后備。

upstreammasterbranch是當前分支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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM