2013-11-01 214 views
0

我使用私有遠程存儲庫有兩個主要原因,當我從辦公室前往家中或在兩臺開發機器之間同步代碼時備份正在進行的工作。用私有遠程存儲庫重寫git歷史記錄

我最近開始玩git(來自hg),我喜歡重寫歷史的想法。我發現最近是,如果我這樣做

  • #做的工作
  • git的承諾
  • 混帳推
  • #修正了最後一個小問題提交
  • git的承諾--amend
  • git push

與遠程存在衝突。我需要拉,合併,再推。

  1. 有沒有辦法將本地更改鏡像到遠程存儲庫?
  2. 在我的第二臺機器,我怎麼拉這些遠程(最好再沒有一個完整克隆)鏡像到我的本地

我知道我使用的唯一一個,所以我知道沒有其他人將不得不面對不斷變化的歷史。

回答

1

您可以從字面上將「exchange/backup」遠程設置爲鏡像(這是一個裸露的克隆,它需要「強制」樣式ref更新,而不是要求某些或所有ref更新爲快進)。

「正常」克隆設置做refs/remotes/*力更新:看看.git/config(或使用git config --get remote.origin.fetch),你會看到獲取的Refspec爲origin是:

+refs/heads/*:refs/remotes/origin/* 

的加號表示「強制」,即「不需要快進」。因此,當您git fetch origin時,無論您的refs/remotes/origin/master(無論您的refs/remotes/origin/master用於指向什麼提交SHA1),任何提交SHA1(例如,來自的名稱爲refs/heads/master名稱)都將成爲您的本地refs/remotes/origin/master。這通常是安全的(因此即使對於「普通」克隆也是默認的),因爲這些「遠程分支」SHA1指針名稱在refs/remotes/而不是refs/heads,即它不會影響您的本地 repo的分支名稱空間任何方式。

當您使用git push -f - 或者指定一個以+開頭的push refspec,這意味着push和fetch一樣 - 這會告訴遠程設備它也應該允許非快速轉發。 (也就是說,它會告訴我們想要一個更好的短語 - 「內置掛鉤」以允許快進。遠端的其他git掛鉤仍然可以拒絕更改。)這通常是而不是 safe因爲它會影響遠程倉庫的名稱空間:您正在更新refs/heads/master,而不是像refs/pushes/JohnsMachineAtHome/master。但是如果你知道自己在做什麼,不要犯錯誤(或者至少不經常:-)),那畢竟是可以的。

還要記住,只要有一些引用(例如reflog)指向它,每個git提交都是相當粘性的,所以從這個特定的意義上講,只要你強制推送和強制讀取是安全的首先承諾。 (如果你陷入困境,你可能不得不從家裏/工作中匆忙地工作/回家,並在reflog中尋找你在鏡像中放置的提交。)請注意,裸體克隆(包括裸露鏡像克隆)不要在推文或提取時間內保持所有更新(有些數據保留,尤其是使用core.logAllRefUpdates設置;請參閱git config docs),因爲它們所獲得的更新在推或取時間是一致的。

也看到這些混帳配置選項:

remote.<name>.push 
     The default set of "refspec" for git-push(1). See git-push(1). 

    remote.<name>.mirror 
     If true, pushing to this remote will automatically behave as if the 
     --mirror option was given on the command line. 
0

您可以在臨時分支上工作並在與主分支合併之前對其進行重新綁定。重新綁定( - >'git rebase -i master')允許您重新排序和編輯提交。

2

您可以在第二臺機器上用git push -f remote-name branch-name強制推送git pull。如果有衝突,你可以用git fetch --all然後git reset --hard remote-name/branch-name強制拉。你最好確定你在做什麼,重寫歷史作爲你的常規工作流程的一部分不建議。

我的意思是說不推薦強制推送和定期推送。

1

您也可以執行

git reset HEAD^ --hard 
對遠程倉庫

和執行混帳拉形成本地倉庫後重做混帳推。我認爲它比git push -force更危險,雖然涉及更多,因爲你只需要驗證你正在倒回確切正確的東西,並且你可以隨時在遠程存儲庫上保存一份安全副本

git checkout -b safe-copy-old-branch-name 
git checkout -b safe-copy-old-branch-name 

在做所有事情之前,不僅保留提交背後的前一個「意圖」的原始內容,而且保持完全相同(原始)SHA1。

相關問題