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

8 浏览
0 Comments

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

我有两个分支:\n

    \n

  1. 本地分支(我正在使用的分支)
  2. \n

  3. 远程分支(公共分支,只有经过充分测试的提交才会进入此分支)
  4. \n

\n最近我严重搞砸了我的本地分支。\n我应该如何完全用远程分支替换本地分支,以便我可以从远程分支的当前位置继续我的工作?\n我已经搜索了SO,但在本地切换到远程分支没有任何效果。

0
0 Comments

问题的原因是想要完全用远程分支替换本地分支。解决方法如下:

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

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

3. 基于远程分支重新创建本地分支:`git checkout -b local_branch origin/remote_branch`

实际上,上述方法更加简洁。我已经测试过,你也可以尝试一下。

哇,`git checkout -b local_branch origin/remote_branch` 太棒了!我之前总是用两个单独的命令执行这个操作。谢谢!

如果你的分支没有合并,可能需要在第一步中使用 `git branch -D local_branch`。

谢谢,我在使用 gitflow 时遇到了一些困难,发布一个分支并完成后,我想要回到已删除的分支,你的解决方案是唯一有效的,pull 似乎不起作用,或者我可能用得不对--

我们应该确保当前分支不是要被删除的分支。

这种方法和第二步直接执行 `git checkout remote_branch` 有什么区别吗?

0
0 Comments

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

某些情况下过这个问题;我几乎每天都用到它:

git reset --hard @{u}

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

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

附注:在大多数Shell中,命令将按原样工作,但如果您在PowerShell或csh中使用Git,则需要首先转义特殊字符,尽管我已经确认它在这两个Shell中作为字符串也可以工作,例如:

git reset --hard '@{u}'

这看起来是最现代的方法,之前的方法git reset --hard origin/master在我的2.29.2版本的Git可执行文件上被拒绝,它会打印出# fatal: Cannot do hard reset with paths.

很奇怪没某些情况下每天使用它似乎像是一个反模式-你总是在覆盖哪些本地更改?这应该是一个罕见的情况,或者您对版本控制系统的使用需要重新调整。

哈哈。那太苛刻了!当我写下这些话时,我在DevOps团队中经常进行一些可丢弃的构建和合并测试,每天都有。作为一名开发者,我现在有时也会这样做,但诚实地说,这不再是“每天”的事情了。现在通常是在我进行代码审查时捕捉到一些细小问题,我会对它们进行修复并修正或重置其他开发人员的分支。完成后,我会指示他们在自己的本地分支上执行此命令,以便他们可以获取我的更改,然后解决他们PR中的其他建议。这可能是每周至少一次;)

我只是认为你会很高兴知道,在过去几周里,我几乎每天都在做这个。出于各种原因,我经常进行很多可丢弃的提交(回答SO的问题或学习新的Git命令,在公司的同事们介绍Git和向他们演示命令,以及在编码过程中测试合并等),对我来说,键入@{u}比确定我需要用@~X重置多少次提交要快一点。

公平的说,这些都是很好的用例-对于DevOps来说也很有意义。我想这可能是Git API的一个设计问题,reset --hard的命名似乎暗示它应该由知道自己在做什么的人不经常执行。或者也许“正确”的做法是在玩弄之前为您的分支创建一个新的分支,并在完成后覆盖该分支。

为了PowerShill细节而被点踩。Bash和csh(或至少csh)也需要转义/“字符串”,并且更常用。

实际上,我已经在bash、zsh、ksh、dash和Windows命令行中测试过这个命令,它们都不需要转义。只有PowerShell和(现在我知道的是csh也需要转义)。我已经更新了附注,包括csh。

“没有为分支'master'配置上游”

这个答案的简写假设您的本地分支正在跟踪一个远程分支。如果不是这样,那么您可以使用git reset --hard origin/master,或者您可以首先设置上游:git branch -u origin/master,从那时起,您可以使用这个答案的简写。

为了表示感谢,这个答案真是太棒了。对于2023年中期的现代git配置很好用。

0
0 Comments

如何在Git中完全替换本地分支与远程分支?-原因和解决方法

有时候我们需要完全替换本地分支与远程分支,下面是一种解决方法:

首先,确保你已经切换到要替换的分支。

假设master是要替换的本地分支,而"origin/master"是要将其重置为的远程分支,使用以下命令:

git reset --hard origin/master

这将把你的本地HEAD分支更新为与origin/master相同的版本,--hard选项还会将这个更改同步到索引和工作区。

感谢你的建议,但我对使用--hard和--force这两个选项有点“害怕”,所以我选择了不使用它们的解决方案。

对,这些选项的命名确实有点让人烦恼。git reset默认会重定向当前分支并同步索引。--soft选项会跳过更新索引的步骤,--hard选项还会同步工作区。根据我的经验,大部分情况下都使用--hard,只有在想要撤销最后一次提交时才使用git reset HEAD^

硬重置和强制操作可能令人害怕,但是“删除分支”(branch -d)却不会令人害怕?我喜欢这个解决方案,简单明了。

在对Git有了更多经验之后,我相信这是一个更好的解决方法,谢谢。

可能需要先执行fetch命令:git fetch origin remote_branch

可能是因为我没有按照建议的步骤操作,我被回滚到了倒数第二次提交…我执行了git commitgit push然后一些垃圾git reset --hard origin/master,我的本地master分支被回滚到了倒数第二次提交之前…

如果本地文件损坏,这个答案将不起作用。在这种情况下,你应该使用stackoverflow上的解决方法。

尝试过这个方法,陷入了一个无休止的合并工具失败的深渊,无法回滚或前进,只会让情况变得更糟。找不到任何相关文档。Git真是个彻头彻尾的噩梦。

请注意,这将用master的内容替换你当前所在的任何分支。所以,如果你在一个功能分支上,它将用master的内容替换所有的提交记录,所以请确保你已经切换到要替换的分支上。

如果你想保存未提交的更改,你需要先存储它们,因为这将丢弃它们。

git checkout master
git fetch origin master
git reset --hard origin/master
git submodule update

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

如果要替换的分支不是master,应该怎么办?

看起来对于较新版本的Git,实际应该使用git reset --hard remote/origin/master

0