【发布时间】:2013-11-20 11:43:06
【问题描述】:
有没有办法恢复提交,以便我的本地副本保留在该提交中所做的更改,但它们在我的工作副本中变成未提交的更改?回滚提交会将您带到上一个提交 - 我想保留所做的更改,但我将它们提交到错误的分支。
这还没有被推送,只是提交。
【问题讨论】:
-
git reset --soft和git reset --mixed都这样做(有点不同),请参阅 git-reset
标签: git
有没有办法恢复提交,以便我的本地副本保留在该提交中所做的更改,但它们在我的工作副本中变成未提交的更改?回滚提交会将您带到上一个提交 - 我想保留所做的更改,但我将它们提交到错误的分支。
这还没有被推送,只是提交。
【问题讨论】:
git reset --soft 和 git reset --mixed 都这样做(有点不同),请参阅 git-reset
标签: git
有很多方法可以做到这一点,例如:
如果您没有公开推送提交:
git reset HEAD~1 --soft
就是这样,您的提交更改将在您的工作目录中,而 LAST 提交将从您当前的分支中删除。见git reset man
如果您确实公开推送(在名为“master”的分支上):
git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )
正常还原提交并推送
git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master
现在,如果您想在工作副本中进行本地更改时进行这些更改(“以便您的本地副本保留在该提交中所做的更改”) - 只需使用 --no-commit 选项恢复还原提交:
git revert --no-commit 86b48ba (hash of the revert commit).
我制作了一个小例子:https://github.com/Isantipov/git-revert/commits/master
【讨论】:
reset 命令是说“软”重置到头部之前的 1 转,这会保留所有本地更改。对于我在 SourceTree 中的使用,这并不是立即显而易见的。只需确保您正在软重置为上一个版本,而不是您尝试重置的版本
"Already up to date"。
如果您推送了更改,您可以undo 并在不使用其他分支的情况下将文件移回舞台。
git show HEAD > patch
git revert HEAD
git apply patch
它将创建一个包含最后一个分支更改的补丁文件。然后它恢复更改。最后,将补丁文件应用到工作树。
【讨论】:
rm patch
对于案例:“这还没有被推送,只提交了。” - 如果您使用 IntelliJ(或其他 JetBrains IDE)并且您还没有推送更改,您可以执行下一步。
完成。
这将“取消提交”您的更改并将您的 git 状态返回到您上次本地提交之前的位置。您所做的任何更改都不会丢失。
【讨论】:
git reset --soft "HEAD^"。 :)
2020简单方法:
git reset <commit_hash>
您要保留的最后一次提交的提交哈希。
【讨论】:
对我来说,这主要发生在我将更改推送到错误的分支并稍后意识到时。并且大部分时间都在关注作品。
git revert commit-hash
git push
git checkout my-other-branch
git revert revert-commit-hash
git push
【讨论】:
请确保在单独的文件夹中运行这些命令之前备份您的更改
git checkout 分支名称
在您的分支机构结帐
git 合并 --abort
中止合并
混帐状态
中止合并后检查代码状态
git reset --hard origin/branch_name
这些命令将重置您的更改并将您的代码与 branch_name(分支)代码对齐。
【讨论】:
添加我遵循的步骤,希望对像我这样的初学者有所帮助。
下图显示了我已经推送到 bitbucket 中远程分支 'A' 的提交。
从这 5 次提交中,我想保留最后 2 次,但我希望前 3 次提交推送到另一个分支“B”。
这些是我遵循的步骤:
内部分支'A':
git revert <commit-hash> 用于 3 个提交中的每一个。例如,d4a3734 是图片中最后一次提交的提交哈希。 (如果您愿意,您可以一次还原多个提交 - 请参阅 How to revert multiple git commits?)git push推送后是这样的:-
现在,我的分支“A”中只有前 2 次提交,这正是我想要的。接下来,结帐到想要的分支。如果是新分支,请使用git checkout -b <branchname>。就我而言,我做了git checkout B。
内部分支'B':
我只是挑选了我想要分支“B”的提交。就我而言,我做到了:
git cherry-pick <commit-hash>
对于我还原的那 3 个提交。
(再次以git cherry-pick d4a3734 为例,其中 d4a3734 是图片中最后一次提交的提交哈希)
【讨论】: