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

时间:2012-02-09 11:59:28

标签: git

我有两个分支:

  1. 本地分支(与我合作的分支机构)
  2. 远程分支(公共,经过严格测试的提交去那里)
  3. 最近我严重搞砸了我当地的分店。

    我如何完全用远程分支替换本地分支,所以我可以从远程分支现在的地方继续我的工作?

    我已经搜索过SO并且在本地检查远程分支没有任何影响。

15 个答案:

答案 0 :(得分:1058)

  1. 确保你已经检查了你要替换的分支(来自Zoltán的comment)。
  2. 假设master是您正在替换的本地分支,并且“origin / master”是您要重置为的远程分支:

    git reset --hard origin/master
    
  3. 这会将您的本地HEAD分支更新为与origin / master相同的修订,--hard也会将此更改同步到索引和工作区。

答案 1 :(得分:188)

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

  1. 删除您当地的分行:git branch -d local_branch
  2. 获取最新的远程分支:git fetch origin remote_branch
  3. 根据远程分支重建本地分支:git checkout -b local_branch origin/remote_branch

答案 2 :(得分:53)

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

git reset --hard @{u}

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

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

答案 3 :(得分:37)

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

答案 4 :(得分:13)

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

git reset --hard origin/some-branch

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

git fetch origin some-branch
git reset --hard FETCH_HEAD

另外,如果需要,您可以删除未跟踪的文件和&amp;你尚未提交的目录:

git clean -fd

答案 5 :(得分:7)

使用遥控器替换当前本地分支的最安全,最完整的方法:

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch

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

或作为bash函数:

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

将当前分支重命名为replacement_master_98d258f。

答案 6 :(得分:2)

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

答案 7 :(得分:2)

选择的答案是绝对正确的,但它并没有让我接受最新的提交/推送......

所以对我来说:

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

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

所以重置后

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

答案 8 :(得分:1)

如果您想更新当前未签出的分支,您可以

var res: Any = ""
PersonResource.getAllPersons{ (result) in
    res = result
}
print(res)

答案 9 :(得分:0)

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

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

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

在那种情况下,当您手动检出一个分支以查找一个或多个子模块时 你可以运行

git submodule foreach git pull

答案 10 :(得分:0)

git reset --hard
git clean -fd

这对我有用-clean显示了它删除的所有文件。如果它告诉您将丢失更改,则需要隐藏。

答案 11 :(得分:0)

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

1)硬重置

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

git reset --hard origin/develop

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

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

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

3)中止合并

如果您处于合并错误(错误地用错误的分支完成)之间,并且想要避免合并,请返回到最新的分支,如下所示:

git merge --abort

4)中止重新设定

如果您处于错误的重设基准之间,则可以如下中止重设请求:

git rebase --abort

答案 12 :(得分:0)

git checkout。

我始终使用此命令将本地更改替换为存储库更改。 git checkout空格点。

答案 13 :(得分:-1)

  1. git fetch origin remote_branch
  2. git reset --hard FETCH_HEAD

答案 14 :(得分:-7)

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