【问题标题】:How to work with branches in Git?如何在 Git 中使用分支?
【发布时间】:2011-12-08 03:31:37
【问题描述】:

我知道这是一个基本问题。

完成发布后,我将 master 分支推送到生产环境。

然后,我正在开发分支以添加新功能。

现在的问题:

Q1:当我使用git push app-name-staging development:master 将开发分支推送到暂存(在heroku 上)时,出现以下错误。为什么?如何解决?

! [rejected] development -> master (non-fast-forward)

error: failed to push some refs to 'git@heroku.com:app-name-staging.git'

Q2:在开发分支上工作时,有人发现了一个错误。我切换到主分支,并修复错误。在不更改主分支的情况下,将主分支中所做的错误修复合并到开发分支的正确方法是什么?

谢谢。

【问题讨论】:

  • gitk --all 之类的东西查看历史记录对于弄清楚这样的事情非常有帮助 - 您应该能够看到您随后合并的不同分支。

标签: git version-control heroku branch


【解决方案1】:

倒序,因为2更简单:

git checkout dev
git merge master

就是这样。它根本不会改变主人。它只是将 master 上所做的所有更改合并到您的 dev 分支中。

另一方面,非快进错误告诉您,如果您的推送成功,您正在推送的分支中有提交将被覆盖。通常,当两个人在同一个分支机构工作时会发生这种情况。假设你和我都有提交 A,并且我们都开始在同一个分支中处理它。你创建提交 B1,我创建 B2。两者都有 A 作为他们的父母。假设你先推送,所以现在远程分支有 A---B1。在本地,我有 A---B2。如果我要推送我的分支,那么 A---B2 就是遥控器上的内容,因此您的提交将会丢失。这是我得到非快进错误的地方。解决这个问题的正确方法是首先拉取其他人放在那里的更改,然后推送结果。在示例中,如果我拉动,我最终会得到:

   C
  /  \
B1    B2
  \  /
   A

具体来说,git 首先抓取你的 B1,它是 A 的孩子和 B2 的兄弟,然后它将 B1 和 B2 合并在一起形成 C。现在我可以将 C 推回远程而不会丢失任何历史记录,因为你的 B1 是在那里正确表示。

【讨论】:

  • 有道理,感谢您的明确回答。但我不明白 B1/B2/C 的情况如何适用于我。我是唯一一个修改代码的人。而且,我会从哪里拉?推送前需要合并分支吗?
  • 好的,我想通了。您必须按照您的描述合并分支,然后推送到 heroku。
  • 如果你是唯一一个修改代码的人,那么你曾经将一个分支推送到远程,然后尝试推送另一个分支(可能是相同的但内容不同的分支)已经导致我描述的“覆盖”情况。我很高兴你能成功。
猜你喜欢
  • 1970-01-01
  • 2011-07-07
  • 2014-08-30
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 2012-04-18
  • 2021-11-26
  • 2013-02-24
相关资源
最近更新 更多