2017-03-05 32 views
2

我正在做的項目有很多分支,其中有兩個分支我的關注點sprint1sprint2。我從分支sprint1創建了我的工作lexis的一個新分支,並將1分配給分支lexis。後來我的隊友告訴我應該從sprint2分支,而不是sprint1。於是,他做了以下這些git命令是什麼意思,以便讓我的分支與某個遠程分支相同?

On branch lexis he deleted my commit 
git fetch origin/sprint2 
git reset --hard origin/sprint2 
Then he cherry picked my commit from reflog 

然後他告訴我,推我的分支lexis提交使用push -f。 我的疑惑是

  1. 我知道正在重置,使我的分支lexis酷似sprint 2。但爲什麼他做了git fetch
  2. 爲什麼使用git psh -f

回答

4

但是他爲什麼要做git fetch?

爲了確保使用最新更新的sprint2分支

爲什麼git push -f使用?

如果你已經沒有推lexis,你需要迫使它考慮它的歷史會改變(因爲它的基礎是不再sprint1sprint2

1

git fetch只是確保你有一個推最新的sprint2快照。

git push -f是必要的,因爲您的本地副本lexis,在git reset之後,與遠程副本不一致。 (你可以把它作爲push版本的git reset --hard;不管是什麼origin/lexis樣子,使它看起來像本地lexis現在。)

3

我想看到的是發生在這裏將你最有益的示意圖。

首先,讓我們假定這兩個lexissprint2開始時一樣:

sprint2: ... A -- B -- C 
lexis: ... A -- B -- C 

在這裏,我用省略號表示在此之前這一切都來了。據推測,他們在某個時候都分支出一個共同的基地,但這與你的問題無關。你做了一個提交到lexis,同時,其他人向sprint2提交了一些號碼(比如說2)。在這一點上,圖中看起來是這樣的:

sprint2: ... A -- B -- C -- D -- E 
lexis: ... A -- B -- C -- F 

在這一點上,你應該已經對sprint2頂部,但你承諾sprint1代替。然後,您的同事核爆您提交F,留給我們:

sprint2: ... A -- B -- C -- D -- E 
lexis: ... A -- B -- C 

然後,他從分支lexis以下兩條命令:

git fetch origin/sprint2   # update local tracking branch for sprint2 
git reset --hard origin/sprint2 # reset local lexis to sprint2 

這左邊的圖看起來像這樣:

sprint2: ... A -- B -- C -- D -- E 
lexis: ... A -- B -- C -- D -- E 

最後,他挑選你的承諾F到這個新的基地:

sprint2: ... A -- B -- C -- D -- E 
lexis: ... A -- B -- C -- D -- E -- F' 

現在,你就是你想成爲的地方。您在當前基地sprint2之上有一個提交。

注意,最後一步看起來是這樣的:

git push --force origin lexis 

這是必要的,因爲你的分支的基地更改,並且需要強制覆蓋。

相關問題