完全replace本地分支与远程分支

我有两个分支:

  1. 当地分行(与我合作的分行)
  2. 远程分支(公共的,只有经过良好testing的提交去那里)

最近我严重搞砸了我的本地分支(猜测每个git-newbie在某个时间点都在我的位置上)

我如何用远程分支完全replace本地分支,这样我就可以继续远程分支的工作了?

(我已经search过,并检查到远程分支本地没有任何影响)

只是:

git reset --hard origin/master 

假设“origin / master”是你想要重置的远程分支。 这会将你的本地HEAD分支更新为与原始/主版本相同的修订版本,而且--hard会将此更改同步到索引和工作空间中。

这就像三个步骤一样简单:

  1. 删除你的本地分支: git branch -d local_branch
  2. 获取最新的远程分支: git fetch origin remote_branch
  3. 重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 

丑陋但更简单的方法:删除本地文件夹,并再次克隆远程存储库。