Git - 回到之前的提交,现在想要写下前面的提交

时间:2014-12-28 00:06:16

标签: git github

我很擅长使用Git。

我在一个存储库上工作,我试图重构代码并失败,所以我最终返回主分支上的1个提交,而是在我以前的位置工作。我现在做了一些我想要保留的更改,并且不希望与之前的提交合并。提前提交已经在远程存储库中。

在保持我所做的更改而不是合并的情况下,什么是不会干扰本地和远程存储库提交的解决方案?

这是一个用于澄清的git日志。 HEAD,主提交是我刚刚尝试做的但不会让我。 origin / master是分支的尖端,也是Github的(我想。)

* bb1d222 (HEAD, master)
| * 832e8af (origin/master)
|/
* 3293d35

3 个答案:

答案 0 :(得分:1)

根据您的问题和后续评论,我的理解是您的回购(最近)历史记录如下,

* bb1d222 (HEAD, master)
| * 832e8af (origin/master)
|/
* 3293d35

其中commit 832e8af对应于您重构代码失败的尝试。

假设

  1. 您是GitHub存储库的唯一贡献者;
  2. 没有其他人克隆或分叉GitHub存储库(a way to find out是否属于这种情况);和
  3. 您会很乐意假装提交832e8af从未存在过,您希望在下列情况下登陆

    * bb1d222 (HEAD, master, origin/master)
    |
    * 3293d35
    
  4. 然后(只有那时),你可以简单地做一个强制推动

    git push --force origin master
    

    请注意,强制推送通常被视为错误,例如crossing the streams。确保你真正想要做的事情;这样的操作很难逆转,并且有可能使你的贡献者(如果有的话)感到沮丧。

    在大多数情况下,最好还原有问题的提交(使用git revert),因为这与强制推送相反,不会删除历史记录,也不需要非快速推送

答案 1 :(得分:1)

1)在您的本地主服务器上,执行git reset HEAD~1,然后执行git stash。这会将您在bb1d222中所做的更改放入您的藏匿处。

2)将本地主分支重置为原点/主控(git reset --hard origin/master

3)在master上,执行git revert 832e8af,这将引入一个新的提交,撤消你在832e8af中所做的更改。

4)git stash pop您在bb1d222中对master进行的更改并提交它们。

这些步骤将生成此提交图,并且不会重写历史记录

* (Commit introducing changes in bb1d222) | * (Commit reverting changes made in 832e8af | * 832e8af | * 3293d35

答案 2 :(得分:0)

您有几个选择:

  1. 您可以创建separate local branch and commit your changes to that local branch only。我更喜欢这种方法,因为那时您的更改会安全地保存到该分支(除非您的计算机死机或删除了分支)。

  2. 使用git stash保存您的更改(您的差异可以这么说)。