完全replace本地分支与远程分支
我有两个分支:
- 当地分行(与我合作的分行)
- 远程分支(公共的,只有经过良好testing的提交去那里)
最近我严重搞砸了我的本地分支(猜测每个git-newbie在某个时间点都在我的位置上)
我如何用远程分支完全replace本地分支,这样我就可以继续远程分支的工作了?
(我已经search过,并检查到远程分支本地没有任何影响)
只是:
git reset --hard origin/master
假设“origin / master”是你想要重置的远程分支。 这会将你的本地HEAD分支更新为与原始/主版本相同的修订版本,而且--hard
会将此更改同步到索引和工作空间中。
这就像三个步骤一样简单:
- 删除你的本地分支:
git branch -d local_branch
- 获取最新的远程分支:
git fetch origin remote_branch
- 重build基于远程的本地分支:
git checkout -b local_branch origin/remote_branch
git branch -D <branch-name> git fetch <remote> <branch-name> git checkout -b <branch-name> --track <remote>/<branch-name>
你可以像@Laurent所说的@Hugo那样做,或者你可以使用git rebase
来删除你想要删除的提交,如果你知道哪些提交。 我倾向于使用git rebase -i head~N
(其中N是一个数字,允许您操作最后N个提交)来执行此类操作。
所选的答案是绝对正确的 ,但它并没有离开我的最新提交/推…
所以对我来说:
git reset --hard dev/jobmanager-tools git pull ( did not work as git was not sure what branch i wanted)
因为我知道我想暂时将我的上游分支设置为一个特定的分支(与之前切换/检出的分支相同,并进行了硬重置)
所以AFTER重置
git branch --set-upstream-to=origin/dev/jobmanager-tools git pull git status ( says--> on branch dev/jobmanager-tools
用远程分支replace所有的东西; 但是 ,只有来自同一个提交你的本地分支:
git reset --hard origin/some-branch
或者 ,从远程分支获取最新信息并replace所有内容:
git fetch origin some-branch git reset --hard FETCH_HEAD
另外,如果需要的话,你可以消除你还没有提交的未跟踪的文件和目录:
git clean -fd
以最安全,最完整的方式replace当前的分支机构:
git stash git merge --abort git branch -M replaced_yourBranch git fetch origin yourBranch:yourBranch git checkout yourBranch
stash
行保存您没有提交的更改。 branch
行将您的分支移动到不同的名称,释放原来的名称。 fetch
线检索远程的最新副本。 checkout
行重新创build原始分支作为跟踪分支。
或者作为一个bash函数:
replaceWithRemote() { yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`} git stash git merge --abort git branch -M replaced_${yourBranch}_`git rev-parse --short HEAD` git fetch origin ${yourBranch}:${yourBranch} git checkout ${yourBranch} }
它将当前分支重命名为诸如replaced_master_98d258f之类的东西。
如果你想更新当前没有被检出的分支,你可以这样做
git fetch -f origin rbranch:lbranch
如所选解释中所提供的, 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)recursion到每个子模块的工作目录,并将运行:
git submodule update
和这是非常不同的
git checkout master git pull
因为子模块指向不分支,但提交。
在这种情况下,当您手动签出一个或多个子模块的某个分支时,可以运行
git submodule foreach git pull
丑陋但更简单的方法:删除本地文件夹,并再次克隆远程存储库。