如何在Git中完全用远程分支替换本地分支?
问题的原因是想要完全用远程分支替换本地分支。解决方法如下:
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` 有什么区别吗?
如何完全用远程分支替换本地分支在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配置很好用。
如何在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 commit
、git 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
。