如何在Git中完全用远程分支替换本地分支?

我有两个分支:

  1. 本地分支(与我合作的分支)
  2. 远程分支(公共,只有经过良好测试的提交才会去那里)

最近我严重搞砸了我当地的分支机构。

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

我已经搜索过SO并且本地签出到远程分支没有任何效果。

614886 次浏览

丑陋但更简单的方法:删除本地文件夹,然后再次克隆远程存储库。

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

  1. 确保您已签出要替换的分支(来自Zoltán的评论)。
  2. 假设master是您要替换的本地分支,而“原始/主”是您要重置到的远程分支:

    git reset --hard origin/master

This updates your local HEAD branch to be the same revision as origin/master, and --hard will sync this change into the index and workspace as well.

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

这就像三个步骤一样简单:

  1. 删除本地分支:git branch -d local_branch

  2. 获取最新的远程分支:git fetch origin remote_branch

  3. 基于远程分支重建本地分支:

    git checkout -b local_branch origin/remote_branch

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

所以对我来说:

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

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

所以重置后

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

如果您想更新当前未签出的分支,您可以执行以下操作:

git fetch -f origin rbranch:lbranch

用远程替换当前本地分支的最安全和最完整的方法:

git stashgit merge --abortgit rebase --abortgit branch -M yourBranch replaced_yourBranchgit fetch origin yourBranch:yourBranchgit checkout yourBranch

stash行保存您尚未提交的更改。branch行将您的分支移动到不同的名称,释放原始名称。fetch行检索远程的最新副本。checkout行将原始分支重新创建为跟踪分支。

或者作为bash函数:

replaceWithRemote() {yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`}git stashgit merge --abortgit rebase --abortgit branch -M ${yourBranch} replaced_${yourBranch}_`git rev-parse --short HEAD`git fetch origin ${yourBranch}:${yourBranch}git checkout ${yourBranch}}

将当前分支重命名为replaced_master_98d258f。

用远程分支替换所有内容;,仅从您的本地分支所在的同一提交:

git reset --hard origin/some-branch

,从远程分支获取最新并替换所有内容:

git fetch origin some-branchgit reset --hard FETCH_HEAD

顺便说一句,如果需要,您可以清除尚未提交的未跟踪文件和目录:

git clean -fd

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

git checkout mastergit fetch origin mastergit reset --hard origin/mastergit pull
git submodule foreach git submodule update
git status

它与您将(cd)递归到每个子模块的工作目录并运行相同:

git submodule update

这与

git checkout mastergit pull

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

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

git submodule foreach git pull
git reset --hardgit clean -fd

这对我很有效——Clean也显示了它删除的所有文件。如果它告诉您您将丢失更改,您需要隐藏。

它可以通过多种方式完成,继续编辑此答案以传播更好的知识视角。

1)重置硬

如果您从远程开发分支工作,您可以将HEAD重置为远程分支的最后一次提交,如下所示:

git reset --hard origin/develop

2)删除当前分支,并从远程存储库再次签出

考虑到您正在本地仓库中开发分支,与远程/开发分支同步,您可以执行以下操作:

git branch -D developgit checkout -b develop origin/develop

3)中止合并

如果你在一个坏的合并之间(错误地完成了错误的分支),并且想避免合并回到最新的分支,如下所示:

git merge --abort

4)中止Rebase

如果您处于错误的rebase之间,您可以中止rebase请求,如下所示:

git rebase --abort

我很惊讶没有人提到这一点;我几乎每天都在使用它:

git reset --hard @{u}

基本上,@{u}只是当前分支正在跟踪的上游分支的简写。例如,这通常等同于origin/[my-current-branch-name]。这很好,因为它与分支无关。

确保首先git fetch以获取远程分支的最新副本。

附注:在大多数shell中,命令将按书面形式工作,但如果您在PowerShell或csh中使用Git,则需要先转义特殊字符,尽管我也确认它在两者中都可以作为字符串工作,例如:

git reset --hard '@{u}'

git签出。

我总是使用此命令将我的本地更改替换为存储库更改。git检查空格点。

  1. 获取来源remote_branch
  2. git重置-硬FETCH_HEAD