我有两个分支:

当地分公司(和我一起工作的那家) 远程分支(公共的,只有经过良好测试的提交才会去那里)

最近我把我当地的分公司搞得一团糟。

如何将本地分支完全替换为远程分支,以便从远程分支现在所在的位置继续工作?

我已经搜索了SO,在本地签出到远程分支没有任何影响。


当前回答

选择的答案是绝对正确的,但它没有离开我与最新的提交/推送…

所以对我来说:

git reset --hard dev/jobmanager-tools
git pull  ( did not work as git was not sure what branch i wanted)

因为我知道我想暂时将我的上游分支设置几个星期到一个特定的分支(与我之前切换到/签出并进行了硬重置的分支相同)

所以是AFTER reset

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 

其他回答

如所选解释所述,git重置是好的。 但是现在我们经常使用子模块:存储库中的存储库。例如,如果您在项目中使用ZF3和jQuery,您很可能希望从它们的原始存储库克隆它们。 在这种情况下,git重置是不够的。 我们需要将子模块更新到存储库中定义的确切版本:

git checkout master
git fetch origin master
git reset --hard origin/master
git pull

git submodule foreach git submodule update

git status

这和你递归地进入(cd)每个子模块的工作目录并运行是一样的:

git submodule update

这和

git checkout master
git pull

因为子模块不是指向分支,而是指向提交。

在这种情况下,当您手动签出1个或多个子模块的某个分支时 你可以跑

git submodule foreach git pull
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>

确保您已经签出了要替换的分支(来自Zoltán的评论)。 假设master是你要替换的本地分支,而“origin/master”是你想重置到的远程分支: Git重置-硬源/主

这会将您的本地HEAD分支更新为与origin/master相同的版本,并且——hard也会将此更改同步到索引和工作区中。

如果你想要更新当前未签出的分支,你可以这样做:

git fetch -f origin rbranch:lbranch

你可以像@Hugo of @Laurent说的那样做,或者你可以使用git rebase删除你想要摆脱的提交,如果你知道是哪些。对于这种操作,我倾向于使用git rebase -i head~N(其中N是一个数字,允许您操作最后N次提交)。