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

Yem*_*lat 708 git

我有两个分支:

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

最近我严重搞砸了我当地的分店(猜猜每个git-newbie在某个时间点都在我的位置)

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

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

ara*_*nid 1167

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

    git reset --hard origin/master
    
    Run Code Online (Sandbox Code Playgroud)

--hard会将您的本地HEAD分支更新为与origin/master相同的修订,并将此更改同步到索引和工作空间.

  • 您应该注意,这将取代**您当前使用****的**内容中的任何一个分支**.因此,如果你在一个功能分支上,它将用`master`替换它的所有提交,所以请确保你已经检查了你要替换的分支. (48认同)
  • 可能你需要先获取:`git fetch origin remote_branch` (21认同)
  • @KonstantinLevin:啊,是的,这些选项的命名相当令人恼火.默认情况下,`git reset`将重新指定当前分支并同步索引.`--soft`将跳过更新索引,`--hard`也将同步工作区.我自己的经验大部分时间都在使用`--hard`,除非我想撤消最后一次提交(这只是`git reset HEAD ^`) (13认同)
  • 在获得更多git经验后,我确信这是一个更好的解决方案,谢谢. (9认同)
  • 感谢您的建议,我已经非常"害怕"使用--hard和--force了,所以我选择了不使用它们的解决方案. (4认同)

ada*_*ith 200

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

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

  • 如果您的分支未合并,您可能需要在第一步中执行`git branch -D local_branch`. (9认同)
  • 实际上@araqnid所说的是正确的,更简洁.我测试了它,你也可以尝试一下. (7认同)
  • 我们应该确保当前分支不是要删除的分支. (2认同)

TTT*_*TTT 121

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

git reset --hard @{u}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @KevinLee 哈哈。太严酷了!当我写这篇文章时,我是 DevOps 团队的一员,每天都会对构建和合并进行大量一次性测试。作为一名开发人员,我有时仍然会这样做,但不可否认,这不再是“每天”。如今,通常是当我在进行代码审查时发现一些小问题时,我会修复它们并为它们修改或重新设置其他开发分支的基础。当我完成后,我指示他们在自己的本地分支上执行此命令,以便他们可以在解决 PR​​ 中的其他建议之前获取我的更改。至少可能是每周一次。;) (8认同)
  • 这看起来像是最现代的方法,之前的“git reset --hard origin/master”方法在我的 2.29.2 git 可执行文件上被拒绝,它打印出“# fatal:无法使用路径进行硬重置”。 (2认同)
  • 令人惊讶的是,没有人提到每天使用它似乎是一种反模式——你经常破坏哪些局部变化?这种情况应该很少发生,或者您需要重新设计 VCS 的使用。 (2认同)

Sai*_*esh 39

git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>
Run Code Online (Sandbox Code Playgroud)

  • @GitSync,这就是`git help branch`所说的`--track`.`创建新分支时,设置分支.<name> .remote和branch.<name> .merge配置条目,将起点分支标记为新分支的"上游".这个配置会告诉git在git status和git branch -v中显示两个分支之间的关系.此外,它在没有参数的情况下引导git pull从新的分支签出时从上游拉出.我在答案中修复了这个命令.谢谢你提出这一点. (3认同)
  • 您可以说这只是为了方便。如果执行`git status`,它将在关联本地分支时报告本地分支是位于远程分支之前还是之后。另外,如果您已经将分支设置为跟踪“ &lt;remote / branch&gt;”,则可以执行“ git pull”(或“ push”)来代替完整的“ git pull &lt;remote&gt; &lt;branch&gt;”。 (2认同)

bit*_*ess 15

用远程分支替换所有内容; 但是,只有来自本地分支的相同提交:

git reset --hard origin/some-branch
Run Code Online (Sandbox Code Playgroud)

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

git fetch origin some-branch
git reset --hard FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)

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

git clean -fd
Run Code Online (Sandbox Code Playgroud)


Jos*_*a S 9

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

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch
Run Code Online (Sandbox Code Playgroud)

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}
}
Run Code Online (Sandbox Code Playgroud)

它将当前分支重命名为replacement_master_98d258f.


Ana*_*ika 9

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

1)硬重置

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

git reset --hard origin/develop
Run Code Online (Sandbox Code Playgroud)

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

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

git branch -D develop
git checkout -b develop origin/develop
Run Code Online (Sandbox Code Playgroud)

3) 中止合并

如果您正在进行一次错误的合并(错误地使用了错误的分支),并且希望避免合并返回到最新的分支,如下所示:

git merge --abort
Run Code Online (Sandbox Code Playgroud)

4) 中止变基

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

git rebase --abort
Run Code Online (Sandbox Code Playgroud)