【发布时间】:2012-03-01 21:34:42
【问题描述】:
我有两个分支:
- 本地分支(我工作的那个)
- 远程分支(公共的,只有经过良好测试的提交才会到那里)
最近我严重搞砸了我的本地分支。
如何将本地分支完全替换为远程分支,以便我可以从远程分支现在的位置继续工作?
我已经搜过SO,在本地签出到远程分支没有任何效果。
【问题讨论】:
-
我知道接受的答案有 1280 票赞成,但您真的应该考虑将接受的答案更改为 @TTT 的答案。
标签: git
我有两个分支:
最近我严重搞砸了我的本地分支。
如何将本地分支完全替换为远程分支,以便我可以从远程分支现在的位置继续工作?
我已经搜过SO,在本地签出到远程分支没有任何效果。
【问题讨论】:
标签: git
丑陋但更简单的方法:删除本地文件夹,然后再次克隆远程存储库。
【讨论】:
你可以像@Laurent 的@Hugo 所说的那样做,或者你可以使用git rebase 删除你想摆脱的提交,如果你知道哪些提交。对于此类操作,我倾向于使用git rebase -i head~N(其中 N 是一个数字,允许您操纵最后 N 次提交)。
【讨论】:
假设 master 是您要替换的本地分支,而“origin/master”是您要重置到的远程分支:
git reset --hard origin/master
这会将您的本地 HEAD 分支更新为与 origin/master 相同的修订版,--hard 也会将此更改同步到索引和工作区。
【讨论】:
git reset 默认会重新指向你当前的分支并同步索引。 --soft 将跳过更新索引,--hard 还将同步工作区。我自己的经验是大部分时间都在使用--hard,除非我想撤消最后一次提交(这只是git reset HEAD^)
git fetch origin remote_branch
master 替换它的所有提交,所以请确保您首先检查了要替换的分支。
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>
【讨论】:
git help branch 对--track 的评价。 When creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out. 我在答案中修复了这个命令。感谢您提出这一点。
git status,它将报告您的本地分支是在远程分支之前还是在远程分支之后(如果您关联了它们)。此外,如果您已经将分支设置为跟踪<remote/branch>,则可以使用git pull(或push)而不是完整的git pull <remote> <branch>。
只需三个步骤即可:
删除您的本地分支:git branch -d local_branch
获取最新的远程分支:git fetch origin remote_branch
基于远程重建本地分支:
git checkout -b local_branch origin/remote_branch
【讨论】:
git branch -D local_branch。
选择的答案是绝对正确的,但是它并没有给我留下最新的提交/推送...
所以对我来说:
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
【讨论】:
如果您想更新当前未签出的分支,您可以这样做:
git fetch -f origin rbranch:lbranch
【讨论】:
用远程替换当前本地分支最安全最完整的方法:
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}
}
将当前分支重命名为replaced_master_98d258f。
【讨论】:
git stash pop。如果您想重新应用隐藏的文件。
用远程分支替换所有内容; 但是,仅来自本地分支所在的同一提交:
git reset --hard origin/some-branch
OR,从远程分支获取最新的并替换所有内容:
git fetch origin some-branch
git reset --hard FETCH_HEAD
顺便说一句,如果需要,您可以清除尚未提交的未跟踪文件和目录:
git clean -fd
【讨论】:
git clean 命令为我做了这件事。 git reset hard origin/master 不要清除未跟踪的文件。谢谢!
正如所选解释中所提供的,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
因为子模块指向的不是分支而是提交。
在这种情况下,当您手动为 1 个或多个子模块检出某个分支时 你可以跑
git submodule foreach git pull
【讨论】:
git reset --hard。这增加了一点价值。
git reset --hard
git clean -fd
这对我有用 - clean 也显示了它删除的所有文件。如果它告诉您将丢失更改,则需要存储。
【讨论】:
可以通过多种方式完成,继续编辑此答案以传播更好的知识视角。
1) 硬重置
如果您在远程开发分支上工作,您可以将 HEAD 重置为远程分支上的最后一次提交,如下所示:
git reset --hard origin/develop
2) 删除当前分支,并从远程仓库再次签出
考虑到,您正在本地仓库中开发分支,与远程/开发分支同步,您可以执行以下操作:
git branch -D develop
git checkout -b develop origin/develop
3) 中止合并
如果您处于错误合并之间(错误地使用错误的分支完成),并且希望避免合并返回到最新的分支,如下所示:
git merge --abort
4) 中止变基
如果您处于错误的 rebase 之间,您可以中止 rebase 请求,如下所示:
git rebase --abort
【讨论】:
我有点惊讶没有人提到这一点;我几乎每天都使用它:
git reset --hard @{u}
基本上,@{u} 只是您当前分支正在跟踪的上游分支的简写。例如,这通常等同于origin/[my-current-branch-name]。这很好,因为它与分支无关。
请务必先git fetch 获取远程分支的最新副本。
【讨论】:
git reset --hard origin/master 之前的方法在我的 2.29.2 git 可执行文件中被拒绝,它打印出 # fatal: Cannot do hard reset with paths.
git 结帐。
我总是使用此命令将我的本地更改替换为存储库更改。 git checkout 空格点。
【讨论】:
【讨论】: