用远程分支覆盖我的本地分支


153

我已经完全取消了我的本地分支机构,并希望重新开始。服务器上的版本正确。

我不想从头开始,我想利用自己的本地历史来修复我的庞大问题。(如果需要,我可以。)

git fetch branchname,并且git pull branchname不起作用。我收到的消息是“ 最新的 ”,但是,我的本地版本与服务器的版本不匹配。

git pull origin/branchname给我一个“ 找不到 ”错误。


Answers:


248

首先,在当前位置创建一个新分支(以防您需要旧的“拧紧”历史记录):

git branch fubar-pin

更新您的远程分支机构列表并同步新的提交:

git fetch --all

然后,将分支重置为原点/分支指向的位置:

git reset --hard origin/branch

小心,这将从您的工作树中删除所有更改!


2
+1,但你可能要添加提醒做git fetch origin复位前
马克Longair

我做了一点改动,却没有用:git fetch --all,git reset --hard SHA1OFANOLDCOMMIT,(其他一些东西),git reset --hard origin / branch。最终结果是我仍旧处于提交状态。因此,这种方法在某些情况下可能行得通,但我认为并非所有方法都有效。
令人作呕的2012年

@greggles:有任何错误吗?最后一条命令之后,HEAD必须指向原点/分支。
knittl

1
@Gavin:不,这绝不会影响以外的其他分支机构origin/branch。决不。
knittl

1
@greggles我知道这是迟,但对于其他人想知道为什么会发生,这种做法只会工作,如果你有一个分支签出。它对您不起作用,因为您处于分离的HEAD状态(HEAD指向提交而不是分支),并且这些命令仅在HEAD指向分支时才起作用。当git resetHEAD指向分支时,该分支将跟随。
Michael Dorst,

60

当弄乱本地分支时,我要做的只是重命名断开的分支,然后再次签出/分支上游分支:

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

然后,如果确定您不希望从旧分支中获取任何东西,请将其删除:

git branch -D branch-old

但是通常我会把旧分支留在本地,以防万一我在里面有东西。


4
这似乎是最好的答案。它可以帮助创建备份副本,以防万一,并且很可能导致本地分支成为远程分支的精确副本。
令人作呕的2012年

很好的答案,对我有用。一个问题:官方git-checkout文档似乎说您的第三个命令应该是:如果git checkout -b <branch> --track <remote>/<branch>没有,您的命令是否同样有效--track
Starman

1
我认为config var branch.autoSetupMerge(我认为默认为true)使--track隐式。而且,是的,在我的所有git设置中--track,执行checkout -bYMMV 时都不需要显式。
凯西·马歇尔

5

您的本地分支可能已对其进行了修改,而您希望将其丢弃。为此,您需要用于git reset将分支头重置为与上游仓库的分支分开的最后一个点。使用git branch -v发现上游分支的SHA1 ID,并使用重置您的分支它它git reset SHA1ID。然后,您应该可以执行git checkout放弃保留在目录中的更改。

注意:请始终在备份存储库上执行此操作。这样一来,您可以确保自己工作正常。否则,您将有一个备份要还原。


感觉这可能会起作用,但是鉴于“在其他地方制作您的工作副本,在远程分支机构中重新制作副本”方法的简单性和可靠性,我看不出这样做有什么好处。
令人作呕的2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.