4

我开始在没有分支的情况下处理代码中的一堆新特性。

这些新功能还没有准备好部署。然而,一个紧急请求已经出现,以解决不同的问题。

我想回到开始添加新功能之前的版本,在那里应用修复,然后部署。

但是,我对哪个应该成为分支以及哪个版本应该合并到哪个版本感到困惑。

有人可以为我提供这个问题的解决方案,作为一个逐步完成的 git 过程。

注意,我从来没有在源代码控制上分支过(现在我明白了为什么我应该拥有)!

4

4 回答 4

2

这是一种方法,可能还有一种更简单的方法。这也假设您所做的更改仅在您的计算机上本地进行,而不是推送到任何远程分支。

可以说我们有

           master
             |
A - B - C' - D'

whereC'D'使用您不想部署的新功能标记提交。

首先,在当前提交 ( master) 处创建一个新分支:

git branch new_feature

现在我们必须指向 commitD'和. 这对于不要丢失您已经进行的任何更改很重要。masternew_feature

           master
             |
A - B - C' - D'
             |
        new_feature

现在我们想将master分支重置为没有新功能的状态,即提交B我们可以使用git reset --hard.
重要提示:如果此时您有未提交的更改,它们将丢失。我建议阅读这篇关于 的优秀文章git reset,以了解它真正在做什么。

git reset --hard B

结构现在看起来像:

   master
    |
A - B - C' - D'
             |
        new_feature

master分支上,您现在可以进行修补程序更改(提交E)并将它们推送到 heroku:

      master
        |
A - B - E
     \
      C' - D'
           |
       new_feature

然后您可以将修补程序合并到new_feature分支中,或者只是将其重新定位在修补程序之上:

git rebase master new_feature

这导致:

      master
        |
A - B - E
         \
          C' - D'
               |
          new_feature

Pro Git 书是学习 Git 的一个非常好的资源,而且它是免费的:http: //git-scm.com/book

于 2013-03-24T12:07:06.133 回答
1

我要做的是从您当前的状态创建一个分支作为功能分支,这样您就不会丢失任何工作。

git checkout -b new-features && git push origin new-features

现在您已将当前状态保存到分支(并将其推送到远程),git checkout您的原始分支并将其恢复到当前头部之前的某个点。

最好的方法是使用git revert. 关于为什么以及如何可以找到的一个很好的解释:Revert multiple git commits

一旦您恢复更改、提交和推送,我建议您创建一个分支来开发错误修复。这是一种很好的做法,原因与人们创建功能分支的原因相同。一个好的经验法则是创建一个与您正在处理的问题具有相同或相似名称/编号的分支。在那里进行所有更改,完成后,您可以将其拉入您要标记部署的任何分支。

最好的部分是无论是否将任何更改推送到远程,它都可以工作,它很简单并且遵循最佳实践。

希望有帮助。

编辑:回答评论中的问题。

“这还假设您所做的更改仅在您的计算机上本地进行,而不是推送到任何远程分支。”

如果您已经推送,该方法将不起作用。有一些方法可以解决它,但我不推荐它。

基本上,这两种方法之间的唯一区别在于它们的核心是一种git reset --hard [commit]使用,另一种使用git revert. 重置实际上告诉 git 返回到特定的提交,这本质上是您想要的效果,但如果您已经推送,则不赞成。由于 git 不允许推送进行非快进更改,并且您实际上已经删除了历史记录,因此您必须执行git push origin [branch] --force导致遥控器也丢失更改的操作。

Revert 实际上创建了一个提交,它将有关您正在撤消的提交的历史记录添加到 git。这更好,因为可以跟踪所有恢复的更改,并且从该分支拉出的任何人都不会变得不同步。当他们拉动时,他们将获得回复或回复。这样做的一个好的副作用是,如果您在还原更改中出错,您可以稍后还原它,因为它只是另一个提交。

于 2013-03-24T12:23:43.007 回答
0

你现在可以创建一个新的分支,比如git checkout -b my_current_work,然后你可以回到 master - git checkout master,然后回到已经部署的提交 [希望你记得 ]。您可以使用例如gitk命令来查看图表并获取正确提交的哈希值。之后你可以git checkout hash_of_the_commit或者git reset --hard hash_of_the_commit(我建议结帐,我相信它更安全)。如果是上一次提交,你总是可以使用类似的语法git checkout HEAD~1,其中 ~1 表示上一次提交,~2 表示第二次最后一次提交等。你的整个工作应该仍然在“my_current_work”分支中,所以你不会丢失任何东西。只需确保在创建新分支之前提交所有更改。

于 2013-03-24T12:02:38.890 回答
0

我开始在没有分支的情况下处理代码中的一堆新特性。

假设您没有提交其中任何一个,您可以在临时分支上提交它们。

git checkout -b temp_work
git commit -am "temporary work"

然后你可以再次结帐master,从那里分支并在那里做你的紧急工作。

git checkout -b urgent_work

完成后,通过其测试等,然后将其合并回master

git checkout master
git merge urgent_work
于 2013-03-24T12:04:14.647 回答