合作者应该推送到一个单独的分支,但是对一个回购的master
做了大约60次提交。他现在已成为该分支的哈希。我需要:
master
分支如何在git / sourcetree中执行此操作而不会丢失我的本地更新?
答案 0 :(得分:1)
我不知道在sourcetree中执行此操作的等效步骤,但以下是如何从终端完成此操作。希望您可以在sourcetree中复制这些步骤。
要执行这些任务,您将使用git reset --hard
以及git push -f
。您需要确保您的遥控器允许非快速前进推送(防止非快速前进推送的设置位于[receive]> denyNonFastforwards = true下的远程&#c; .git / config文件中。只需设置它在你解决问题时暂时“假”
git clone <url> <fix-the-repo>
cd <fix-the-repo>
git checkout master
git branch feature
(主要和功能现在指向相同的commit-id)git reset --hard <SHA>
git push -f origin master
git push origin feature
cd <local-repo>
git fetch origin
(您应该看到有关强制更新主分支的消息)git log --oneline --decorate --graph --all
git push origin master
呼!
答案 1 :(得分:1)
这是相对简单的。
创建一个指向应该的主要临时分支。例如,如果您提供了最新版本的master (除外),那么您将运行:
git branch tmpMaster origin/master
## Or
git branch tmpMaster sha_of_good_master
获取他们对主人所做的更改
git fetch --all
将他们的更改推送到新分支
git push origin origin/master:newBranch
强制推送应该掌握的主人。
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
git push origin BRANCH_NAME
现在,他的更改在新的远程分支上是安全的。
master
分支:git checkout master
git reset --hard COMMIT_HASH
git push -f origin master
您可能需要检查.git / config文件上的denyNonFastforwards
标志是否设置为true
(您可以将其更改为false并在之后将其撤消)。
git stash apply
就是这样!