簡體   English   中英

用私有遠程存儲庫重寫git歷史記錄

[英]Rewriting git history with a private remote repository

我使用私有遠程存儲庫的原因主要有兩個,當我從辦公室到家時備份正在進行的工作或在兩個開發機之間同步代碼。

我最近開始玩git(來自hg),我喜歡重寫歷史記錄的想法。 我最近發現的是,如果我執行以下操作

  • # 做工作
  • git提交
  • git推
  • #修復最后一次提交的一些問題
  • git commit-修改
  • git推

與遙控器發生沖突。 我需要再次拉,合並和推動。

  1. 有沒有辦法將本地更改鏡像到遠程存儲庫?
  2. 在我的第二台計算機上,如何將那些鏡像遠程對象拉入本地(最好再沒有完整的克隆)

我知道我是唯一使用它的人,所以我知道沒有其他人需要處理不斷變化的歷史。

您可以使用git push -f remote-name branch-name強制執行推送,然后在第二台計算機上執行git pull 如果發生沖突,您可以使用git fetch --all緊跟git reset --hard remote-name/branch-name強制拉git fetch --all 您最好確定自己在做什么, 不建議將歷史記錄重寫為常規工作流程的一部分。

我的意思是不建議定期強制推拉。

您也可以執行

   git reset HEAD^ --hard 

在遠程存儲庫上執行,並在從本地存儲庫執行git pull之后重做git push。 我認為與git push --force相比,它雖然危險性更高,但涉及程度更小,因為您只需要驗證倒帶的正確內容,並且始終可以使用以下命令將安全副本保留在遠程存儲庫中:

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

在做所有事情之前,不僅要在提交之后保留先前的“意圖”的原始內容,而且還要保持完全相同(原始)的SHA1。

您可以從字面上將“交換/備份”遠程設置為鏡像(一個裸克隆,它使用“強制”樣式的參考更新,而不是要求某些或所有參考更新都是快進的)。

設置了“普通”克隆以強制更新refs/remotes/* :看一下.git/config (或使用git config --get remote.origin.fetch ),您將看到獲取refspec origin是:

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

加號表示“強制”,即“不需要快進”。 因此,當您git fetch origin ,無論(例如)起源的refs/heads/master名稱的任何SHA1提交都成為您的本地refs/remotes/origin/master ,無論您的refs/remotes/origin/master指向哪個提交SHA1 -至。 這通常是安全的(因此對於“普通”克隆也是默認的),因為這些“遠程分支” SHA1指針名稱以refs/remotes/而不是refs/heads ,即,它不會影響本地存儲庫的分支名稱。 -空間以任何方式。

當您使用git push -f -或指定以+開頭的push refspec,這與push和fetch的含義相同-這告訴遙控器它也應允許非快進。 (也就是說,它告訴了換一個更好的詞組“建於勾”,讓快進的想。遙控器上的其他git的鈎子到你是推還是可以拒絕變更)。這通常是可靠,因為它影響遠程倉庫的名稱空間:您正在更新 refs/heads/master ,而不是refs/pushes/JohnsMachineAtHome/master 但是,如果您知道自己在做什么,並且不犯錯誤(或者至少不經常犯錯,:-)),那還是可以的。

還要記住,只要有一些引用(例如reflog)指向git,每次在git中的提交都是合理的粘性,因此從特定的意義上講,只要先提交,就可以安全地強制推送和強制獲取。 (例如,如果您犯規,您可能必須在家中上班/上班,然后在reflog中四處查找才能找到您在鏡像上提交的提交。)請注意,裸克隆(包括裸鏡像克隆) )不要讓所有的東西在reflogs的方式( 一些數據保存,尤其是core.logAllRefUpdates設置;參閱混帳配置文件),因為他們得到了更新EN-集體在推動或提取時間。

另請參閱以下git config選項:

  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. 

您可以在一個臨時分支上工作,並在與master分支合並之前對其重新設置基礎。 重置(->'git rebase -i master')允許您重新排序和編輯提交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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