回滚远程git repo但保持本地更改

时间:2017-06-28 23:41:58

标签: git github atlassian-sourcetree

合作者应该推送到一个单独的分支,但是对一个回购的master做了大约60次提交。他现在已成为该分支的哈希。我需要:

  1. 还原他的更改
  2. 理想情况下,将他所做的更改推送到单独的分支
  3. 提交并推送我在master分支
  4. 上所做的本地更改

    如何在git / sourcetree中执行此操作而不会丢失我的本地更新?

4 个答案:

答案 0 :(得分:1)

我不知道在sourcetree中执行此操作的等效步骤,但以下是如何从终端完成此操作。希望您可以在sourcetree中复制这些步骤。

要执行这些任务,您将使用git reset --hard以及git push -f。您需要确保您的遥控器允许非快速前进推送(防止非快速前进推送的设置位于[receive]> denyNonFastforwards = true下的远程&#c; .git / config文件中。只需设置它在你解决问题时暂时“假”

  1. 克隆遥控器
    • git clone <url> <fix-the-repo>
  2. 使用SHA应该是什么样的主人:
    • cd <fix-the-repo>
  3. 创建协作者应该推送到的功能分支
    • git checkout master
    • git branch feature(主要和功能现在指向相同的commit-id)
  4. 将master重置为它应该是什么
    • git reset --hard <SHA>
  5. 将更新的分支指针推送到远程
    • git push -f origin master
    • git push origin feature
  6. 转到您当地的回购
    • cd <local-repo>
  7. 获取遥控器以确保一切正常和花花公子
    • git fetch origin(您应该看到有关强制更新主分支的消息)
    • git log --oneline --decorate --graph --all
  8. 推送您的本地更改
    • git push origin master
  9. 呼!

答案 1 :(得分:1)

这是相对简单的。

  1. 创建一个指向应该的主要临时分支。例如,如果您提供了最新版本的master 除外),那么您将运行:

    git branch tmpMaster origin/master
    ## Or
    git branch tmpMaster sha_of_good_master
    
  2. 获取他们对主人所做的更改

    git fetch --all
    
  3. 将他们的更改推送到新分支

    git push origin origin/master:newBranch
    
  4. 强制推送应该掌握的主人。

    git push --force origin tmpMaster:master
    

答案 2 :(得分:0)

如果你可以直接登录服务器,你可以用相对较少的大惊小怪来修复它,但你必须知道一些关于Git内部的东西。

如果没有,最好的办法是使用临时存储库(即新的git clone)或临时工作树(即git worktree add,假设你的Git至少是2.6版左右)在您控制的具有推送访问权限的计算机上。这根本不需要任何特殊的Git专业知识,但如果您使用git worktree add,则需要不在master分支上(即,如果您在自己的分支机构内工作) ,你在这里很好。)

要使用新的临时克隆,请照常运行git clone(在新目录中创建新克隆)。然后像往常一样将chdir(cd)放入新克隆中。你应该在master;如果没有,请运行git checkout master。您的master将与origin/master匹配,因为这是一个新的克隆版。

要使用临时工作树,请从常规工作树的顶层运行git add worktree ../fix master。 Chdir进入新的工作树,现在位于您自己的master分支上。运行git fetch origin && git reset --hard origin/master更新您的master以匹配origin/master

既然你的master已与其他人应该是其他分支的master同步,请创建他应该创建的分支:git checkout -b feature或其他。然后像往常一样将新分支推送到服务器。

接下来,将master设置为原样。在这里你有两个选择:你可以用git reset --hard回滚他的所有变化,只要你能得到自己,他和其他任何获得他的变化的人同样回滚,这是好的。 (如果您使用自己的存储库和临时工作树,则此回滚对于是全自动的。)或者,您可以在使用自己的主服务器上进行 new 提交他应该把树留在原地。无论哪种方式,您都必须确定要恢复的提交。

要执行前者,请运行git reset --hard <commit-hash>。要执行后者,请运行git rm -rf . && git checkout <commit-hash> -- . && git commit(请注意此处有额外的点)。前者回复master,删除提交;后者创建一个与前一次提交具有相同树的新提交(这就是为什么我们首先删除所有内容,然后检查先前提交中的所有内容)。

现在,对于后一种情况,您可以像往常一样git push origin master。对于前一个(git reset)案例,您必须git push --force origin master

(使用--force方法的危险在于推送到master的其他用户可能会在您执行此操作时进行更改;您将失去他们的更改但是由于现在情况很糟糕,你应该确保没有其他人正在进行这些改变。)

您现在已完成或已完成:您可以删除克隆或临时工作树。如果您使用克隆,则使用&#34;重置master&#34;方法,你可能还需要重置你自己的存储库master,如果你拿起了其他人的提交并将它们合并到你自己的主人的克隆中(那个是不是临时克隆)。如果你只是添加了一个新的提交来修复他的错误,那么你就可以了。

答案 3 :(得分:0)

如果我正确理解您的问题,您可以执行以下操作:

要保持当前的未提交更改(如果有):

  • 存放它们以便以后使用它们:
git stash

保存他的更改:

  • 使用他的更改创建一个新的本地分支:
git checkout -b BRANCH_NAME
  • (可选)将他的更改推送到github:
git push origin BRANCH_NAME


现在,他的更改在新的远程分支上是安全的。

要还原master上的更改:

  • 返回master分支:
git checkout master
  • 在更改之前将master重置为提交:
git reset --hard COMMIT_HASH
  • 推送更新的分支:
git push -f origin master


您可能需要检查.git / config文件上的denyNonFastforwards标志是否设置为true(您可以将其更改为false并在之后将其撤消)。

要取回之前隐藏的更改:

  • 应用最后一个藏匿处:
git stash apply

就是这样!