2015-10-05 174 views
1

最近,我在改變提交消息的同時重新綁定了僅限本地的存儲庫,並且之後只有提交消息已被更改,但歷史本身沒有更改。git rebase interactive已經推送提交

現在我有我的倉庫 - 遠程和本地。我在幾個分支上做了幾次提交,並且已經推送了它們。由於某些原因,我需要在幾個分支上更改一些提交masseages,並嘗試像以前一樣使用rebase interactive。但是這個提交出現在當前結賬分支的最後。

(我知道如何和我有基礎重建之前我的資料庫恢復到狀態。)

經過一番閱讀中,我意識到這個問題是提交已已被推這是不是在我局地的事實只有存儲庫。

我試圖重新綁定遠程存儲庫,但它是一個裸露的 - 所以它沒有工作。

我知道它不推薦。但爲了學習的目的,我真的很想知道如何更改幾個提交消息,而不會導致分支/存儲庫末尾的重複提交。

(我不喜歡這個解決方案上下工夫,以複製和我的本地庫更改爲裸一個作爲我的新的遠程倉庫,這將解決我的問題。)

我希望我自己做足夠清楚。謝謝。

回答

1

更改提交消息會導致更改提交的散列值,這意味着所有後續提交都必須更改它們的散列值(因爲父項包含在散列計算中,因爲郵件本身也是如此)。

這就是爲什麼通常只有在當地分支機構才允許重新裝訂。很多人或說大多數git遠程倉庫允許重寫推送的歷史記錄,因爲任何人都可以下載它,然後工作在過時的歷史記錄/分支/提交。

Strategy for preventing or catching git history rewrite

但是,如果你的服務器的確讓歷史重寫(例如,如果你是唯一一個在它的工作),你可以用--force推動他們。

作爲一個側面說明在這裏看到https://stackoverflow.com/a/5668050/1756183

編輯有多個分支機構變基:C1結果

C1 <- C2 <- C3 (branch1) 

墊底兒童

C1 <- CR2 <- CR2 (branch1) 

但是,如果您有:

 /C4 <- C5 (branch2) 
C1 <- C2 <- C3 (branch1) 

墊底將最有可能導致:

/C2 <- C4 <- C5 (branch2) 
C1 <- CR2 <- CR3 (branch1) 

的原因是,C2仍然是C4父,「固定」的承諾CR2只與改寫的分行branch1。 如果你想「忘記」C2你必須在CR2之上重新編號C4(你必須玩rebase --onto)。之後,C2沒有作爲任何人的父母或任何分支,並且不會在歷史記錄中顯示(儘管在收集垃圾之前它仍然存在)。

+0

我檢查了一下,我沒有在我的服務器上設置這樣的git-config。另一方面,我已經使用過:'git rebase - interactive SHA',標記爲'reword','git push --force'。但問題依然存在。我已經使用http://stackoverflow.com/a/5668050/1756183的answere,但同樣的問題。在你的第一個鏈接中,我找到了'receive.denyDeletes',這讓我想到刪除遠程分支,重新綁定我的本地歷史記錄,然後推送它。沒有辦法......問題依然存在。 – codekandis

+0

問題可能是當我的第一個項目沒有時,我目前的項目有多個分支。 – codekandis

+0

在帖子中增加了一些信息 - 應該解釋你看到的效果。 – dag