2011-06-03 111 views
145

我完全fubar'd我的本地分支,並希望重新開始。服務器上的版本是正確的。覆蓋我的本地分支與遠程分支

我不想重新開始,我想用我的本地歷史來解決我的巨大麻煩。 (我可以,如果我必須)。

git fetch branchnamegit pull branchname不起作用。我收到的消息是「最新」,但是,我的本地版本與服務器的版本不匹配。

git pull origin/branchname給我一個「找不到」的錯誤。

+0

[重置本地存儲庫分支就像遠程存儲庫HEAD]可能的副本(http://stackoverflow.com/questions/1628088/reset-local-repository-branch-to-be-just-like-remote- repository-head) – 2016-04-01 02:42:33

回答

2

您的本地分支可能會對您想要丟棄的分支進行修改。要做到這一點,您需要使用git reset將分支機構重置爲您與上游回購分支不同的最後一個分支。使用git branch -v查找上游分支的sha1標識,並使用git reset SHA1ID重置您的分支。然後,您應該可以執行git checkout來放棄它在目錄中留下的更改。

注意:請務必在備份的回購庫上執行此操作。這樣你可以保證你自己的工作是正確的。或者,如果沒有,則需要備份才能恢復。

+0

這種感覺好像可能會起作用,但考慮到「在其他地方複製你的工作副本」的方法的簡單性和可靠性,請創建一個遠程分支的新副本「我沒有看到這是如何更好。 – greggles 2012-10-18 15:55:52

215

首先,在當前位置的新的分支(如果你需要你的老「搞砸了」歷史):

git branch fubar-pin 

更新您的遠程分支機構的列表,並同步新的提交:

git fetch --all 

那麼,您的分支重置到這種地步產地/分支點:

git reset --hard origin/branch 

小心,這將刪除您的工作樹的任何更改!

+2

+1,但你可能想要添加一個提醒來做'git fetch origin'在重置之前 – 2011-06-03 16:22:59

+0

我做了這個只做了一點小小的改動,它不起作用:git fetch --all,git reset --hard SHA1OFANOLDCOMMIT,(一些其他的東西),git reset --hard origin/branch。最終的結果是,我仍然在舊的提交。所以,這種方法在某些情況下可能有效,但我認爲這種方法根本不起作用。 – greggles 2012-10-18 15:56:41

+0

@greggles:任何錯誤?在最後一個命令後,HEAD必須指向原點/分支。 – knittl 2012-10-18 18:10:13

53

我做什麼,當我搞砸了我的本地分行是我剛剛重命名我破碎的分支,並再次檢查了/支上游分支:

git branch -m branch branch-old 
git fetch remote 
git checkout -b branch remote/branch 

然後,如果你確定你不想刪除它:

git branch -D branch-old 

但通常我會在本地離開舊分支,以防萬一我在那裏有東西。

+4

這似乎是最好的答案。它有助於創建一個備份副本以防萬一,並且似乎很可能導致本地分支成爲遠程分支的精確副本。 – greggles 2012-10-18 15:59:16

+0

很好的回答,對我有用。一問: 官方git的結帳文件似乎是說,你的第三個命令應該是: 'git的結帳-b --track /' 請問你工作得很好,沒有'--track'? – Starman 2017-12-12 19:47:27

+0

我認爲config var'branch.autoSetupMerge'(我認爲默認爲true)會使'--track'隱含。而且,是的,在我所有的git設置中,我不需要在執行'checkout -b'時顯式''track',而是YMMV。 – 2017-12-13 20:54:38

相關問題