簡體   English   中英

強制git push后如何拉?

[英]How to pull after a forced git push?

假設我從 git repo 中提取更改。 然后回購力的作者推到中央回購。 現在我不能拉,因為歷史被改寫了。

假設作者強制推送了正確的版本,我該如何拉新提交(並放棄舊提交)?

我知道這是糟糕的 git 工作流程,但有時您無法避免這種情況。

丟棄您的本地更改

如果你想放棄你的工作, fetchreset 例如,如果您有一個名為origin的遠程和一個名為master的分支:

$ git fetch origin
$ git reset --hard origin/master # Destroys your work

保持本地更改

如果你不想扔掉你的工作,你將不得不做一個git rebase --onto 假設舊的origin是這樣的:

A ---> B ---> C
              ^
              origin/master

你有這個:

A ---> B ---> C ---> X ---> Y ---> Z
              ^                    ^
              |                    master
              origin/master

現在,上游的變化改變了事情:

A ---> B ---> C ---> X ---> Y ---> Z
 \                                 ^
  ---> B'---> C'                   master
              ^          
              origin/master

您必須運行git rebase --onto origin/master <C> master ,其中<C>是上游更改之前舊origin/master分支的 SHA-1。 這給你這個:

A ---> B ---> C ---> X ---> Y ---> Z
 \
  ---> B'---> C'---> X'---> Y'---> Z'
              ^                    ^
              |                    master
              origin/master

請注意 B、C、X、Y 和 Z 現在如何“無法訪問”。 它們最終會被 Git 從您的存儲庫中刪除。 在此期間(90 天),Git 會在 reflog 中保留一份副本,以防您犯了錯誤。

修正錯誤

如果你git resetgit rebase錯誤並且不小心丟失了一些本地更改,你可以在 reflog 中找到更改。

在評論中,用戶建議git reflog expire使用--expire=now不要運行此命令,因為這會破壞您的安全網。 擁有 reflog 的全部目的是當你運行錯誤的命令時,Git 有時會保護你的脖子。

基本上,此命令將立即銷毀上面示例中的 B、C、X、Y 和 Z 提交,因此您無法取回它們。 運行此命令並沒有真正的好處,只是它可能會節省一點磁盤空間,但是 Git 會在 90 天后清除數據,因此這種好處是短暫的。

我遇到了這個場景的一個稍微修改過的版本。 這是我所做的:

初始條件

A--->B--->C--->D--->E
                    |
             local-1/master

A--->B--->C--->D--->E
                    |
              origin/master

A--->B--->C--->D--->E
                    |
             local-2/master

擠壓和強力推動

A--->B--->CDE
           |
    local-1/master

A--->B--->CDE
           |
     origin/master

A--->B--->C--->D--->E
                    |
             local-2/master

在 local-2/master 上同步更改

$ git reset --soft B


    A--->B---> (local uncommitted changes)
         |
  local-2/master


$ git stash save "backup"


    A--->B
         |
  local-2/master

$ git pull origin master


    A--->B--->CDE
               |
        local-2/master

如果您沒有對本地分支進行任何更改,您可以嘗試以下命令序列。 請記住,這是實現您所要求的粗略方法。

git checkout master
git pull
git remote update origin -p
git branch -D myBranch
git checkout myBranch

git remote update origin -p是可選的。

如果您進行了更改並且不關心本地分支的內容,則可以嘗試以下操作:

git stash
git stash drop
git checkout master
git pull
git remote update origin -p
git branch -D myBranch
git checkout myBranch

這兩種技術都非常漫長和繁瑣。 但要完成工作。

如果沒有本地提交,這將從強制推送中恢復您的結帳。 您將了解遠程分支的最新情況,並且可以稍后提交您的本地工作。

git fetch
git stash
git reset --hard origin/master # destroys your work
git stash pop # restores your work as local changes
git mergetool # fix any conflicts

此時,您的本地更改與以前一樣。 您的結帳與 master 或您正在工作的任何分支上的所有更改都是最新的。

暫無
暫無

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

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