我有分支master
追蹤遠程分支origin/master
。 git
我想將它們重命名爲本地和遠程master-old
。 那可能嗎? 對於跟蹤origin/master
(而且老是經過git pull
更新其本地master
git pull
)的其餘用戶,重命名遠程分支後會發生什麼? 他們的git pull
仍然能夠工做仍是會拋出錯誤,致使找不到origin/master
了? bash
而後,進一步,我想建立一個新的master
分支(本地和遠程)。 一樣,在我完成此操做以後,若是其餘用戶執行git pull
會發生什麼呢? 服務器
我想全部這些都會帶來不少麻煩。 有沒有一種乾淨的方法來獲得我想要的東西? 仍是我應該只保留master
並建立一個新的master-new
分支,而後繼續工做? ide
我假設您仍在詢問與上一個問題相同的狀況。 也就是說,「 master-new」將在其歷史記錄中不包含「 master-old」。*若是您將master-new稱爲「 master」,則將有效地重寫了歷史記錄。 沒關係,你如何進入,其中主不主的前面位置的後裔,只是它是在該州的狀態。 this
其餘嘗試在主服務器不存在的狀況下進行拉取的用戶只會使其拉取失敗(在遠程上沒有此類引用),一旦再次存在於新位置,他們的拉取將不得不嘗試將其主服務器與新的遠程主服務器合併,就像您在存儲庫中合併了master-new和master-new同樣。 鑑於您要在此處執行的操做,合併將產生衝突。 (若是解決了這些問題,而且將結果推回到了存儲庫中,那麼您將處於更加糟糕的狀態-那裏的兩個版本的歷史記錄。) spa
簡單地回答您的問題:您應該接受的是,您的歷史記錄有時會出現錯誤。 不要緊 它發生在每一個人身上。 git.git存儲庫中有還原的提交。 重要的是,一旦咱們發佈了歷史,每一個人均可以信任它。 code
*若是這樣作的話,這等效於將一些更改推送到master上,而後在之前的位置建立一個新分支。 沒問題。 rem
與重命名最接近的是刪除,而後在遠程上從新建立。 例如: get
git branch -m master master-old git push remote :master # delete master git push remote master-old # create master-old on remote git checkout -b master some-ref # create a new local master git push remote master # create master on remote
可是,這有不少警告。 首先,沒有現成的檢出會了解重命名- Git 並不試圖跟蹤分支重命名。 若是新的master
服務器不存在,則git pull將出錯。 是否建立了新的master
。 拉將嘗試合併master
和master-old
。 所以,除非您與先前簽出了存儲庫的全部人進行合做,不然一般這是一個壞主意。 it
注意:默認狀況下,較新版本的git不容許您遠程刪除master分支。 您能夠經過將receive.denyDeleteCurrent
配置值設置爲warn
或ignore
遠程存儲庫來覆蓋此設置。 不然,若是您準備當即建立新的master,則跳過git push remote :master
步驟,並將--force
傳遞給git push remote master
步驟。 請注意,若是您沒法更改遙控器的配置,則將沒法徹底刪除master分支!
此警告僅適用於當前分支(一般是master
分支); 能夠如上所述刪除和從新建立任何其餘分支。
對於Git v1.7,我認爲這已經發生了一些變化。 如今,將本地分支機構的跟蹤參考更新爲新的遙控器很是容易。
git branch -m old_branch new_branch # Rename branch locally git push origin :old_branch # Delete the old branch git push --set-upstream origin new_branch # Push the new branch, set local branch to track the new remote
重命名分支有不少方法,但我將着重解決更大的問題: 「如何讓客戶快速前進,而沒必要在本地弄亂分支」 。
這實際上很容易作到; 但不要濫用它。 整個想法取決於合併提交。 由於它們容許快速前進,而且將分支的歷史連接到另外一個。
# rename the branch "master" to "master-old" # this works even if you are on branch "master" git branch -m master master-old
# create master from new starting point git branch master <new-master-start-point>
# now we've got to fix the new branch... git checkout master # ... by doing a merge commit that obsoletes # "master-old" hence the "ours" strategy. git merge -s ours master-old
git push origin master
之因此可行,是由於建立merge
提交容許將分支快速轉發到新修訂版。
renamed branch "master" to "master-old" and use commit ba2f9cc as new "master" -- this is done by doing a merge commit with "ours" strategy which obsoletes the branch. these are the steps I did: git branch -m master master-old git branch master ba2f9cc git checkout master git merge -s ours master-old
git update-ref newref oldref git update-ref -d oldref newref