我有两个分支:
当地分公司(和我一起工作的那家) 远程分支(公共的,只有经过良好测试的提交才会去那里)
最近我把我当地的分公司搞得一团糟。
如何将本地分支完全替换为远程分支,以便从远程分支现在所在的位置继续工作?
我已经搜索了SO,在本地签出到远程分支没有任何影响。
我有两个分支:
当地分公司(和我一起工作的那家) 远程分支(公共的,只有经过良好测试的提交才会去那里)
最近我把我当地的分公司搞得一团糟。
如何将本地分支完全替换为远程分支,以便从远程分支现在所在的位置继续工作?
我已经搜索了SO,在本地签出到远程分支没有任何影响。
你可以像@Hugo of @Laurent说的那样做,或者你可以使用git rebase删除你想要摆脱的提交,如果你知道是哪些。对于这种操作,我倾向于使用git rebase -i head~N(其中N是一个数字,允许您操作最后N次提交)。
确保您已经签出了要替换的分支(来自Zoltán的评论)。 假设master是你要替换的本地分支,而“origin/master”是你想重置到的远程分支: Git重置-硬源/主
这会将您的本地HEAD分支更新为与origin/master相同的版本,并且——hard也会将此更改同步到索引和工作区中。
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>
这就像三步一样简单:
删除本地分支:git branch -d local_branch 获取最新的远程分支:git Fetch origin remote_branch 基于远端分支重建本地分支: Git checkout -b local_branch origin/remote_branch
选择的答案是绝对正确的,但它没有离开我与最新的提交/推送…
所以对我来说:
git reset --hard dev/jobmanager-tools
git pull ( did not work as git was not sure what branch i wanted)
因为我知道我想暂时将我的上游分支设置几个星期到一个特定的分支(与我之前切换到/签出并进行了硬重置的分支相同)
所以是AFTER reset
git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status ( says--> on branch dev/jobmanager-tools
用远程取代当前本地分支的最安全、最完整的方法:
git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch
存储线保存您尚未提交的更改。分支线将分支移动到不同的名称,释放原来的名称。获取行检索远程的最新副本。结帐行将原始分支重新创建为跟踪分支。
或者作为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 reset --hard origin/some-branch
或者,从远程分支获取最新的并替换所有内容:
git fetch origin some-branch
git reset --hard FETCH_HEAD
顺便说一句,如果需要,你可以清除你还没有提交的未跟踪文件和目录:
git clean -fd
如所选解释所述,git重置是好的。 但是现在我们经常使用子模块:存储库中的存储库。例如,如果您在项目中使用ZF3和jQuery,您很可能希望从它们的原始存储库克隆它们。 在这种情况下,git重置是不够的。 我们需要将子模块更新到存储库中定义的确切版本:
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
它可以通过多种方式完成,继续编辑这个答案,以传播更好的知识视角。
1)硬复位
如果你从远程开发分支工作,你可以重置HEAD到远程分支上的最后一次提交,如下所示:
git reset --hard origin/develop
2)删除当前分支,并从远程存储库再次签出
考虑到,你正在本地回购中开发分支,这与远程/开发分支同步,你可以这样做:
git branch -D develop
git checkout -b develop origin/develop
3) 中止合并
如果你正处于一个糟糕的合并(错误地使用了错误的分支)之间,并且想要避免合并以返回到最新的分支,如下所示:
git merge --abort
4)取消重置
如果你处于一个糟糕的重基之间,你可以中止重基请求,如下所示:
git rebase --abort
我有点惊讶居然没有人提到这一点;我几乎每天都用它:
git reset --hard @{u}
基本上,@{u}只是当前分支正在跟踪的上游分支的简写。例如,这通常等同于origin/[my-current-branch-name]。它很好,因为它是分支不可知的。
确保git首先获取远程分支的最新副本。
附注:在大多数shell中,命令会像写的那样工作,但如果你在PowerShell或csh中使用Git,你需要先转义特殊字符,尽管我也确认了它在这两种情况下都是作为字符串工作的,例如:
git reset --hard '@{u}'