【问题标题】:How to pick specific commits and pushed those into another branch?如何选择特定的提交并将它们推送到另一个分支?
【发布时间】:2017-05-01 14:30:41
【问题描述】:

TL;DR

我可以只将我所做的更改(即对 code3 和 code4 所做的更改)推送到我们的 UAT 分支而不触及 developer1 所做的更改(code1、code2 和 my-js.js)吗?


我认为我的情况最好用一个例子来说明。

开发人员通常在包含 7 个文件的 dev 分支上工作。

code1.php
code2.php
code3.php
code4.php
code5.php
my-js.js
my-css.css

该项目有 3 名开发人员。

developer1 = able to push new branches but not able to merge into any branch
developer2 = same access as developer1
developer3 = me. I have admin access to the repository. If developer1 and 2 needs to merge changes to the dev branch, they send it my way for approval

出现了一个新问题,该问题已分配给 developer1。 Developer1 git 拉上远程开发分支以获取最新代码。然后,他创建了一个名为“jira-ticket1”的新本地分支,并对文件 code1 和 code2 进行了更改。他还对 my-js.js 进行了更改

出现了另一个问题 (jira-ticket2),这已分配给 developer2。他还 git 拉上了远程 dev 分支,然后创建了一个名为“jira-ticket2”的新本地分支,并对 code5 进行了更改。

一天结束时,只有 developer1 完成了。他将他的新分支推送到我们的远程存储库中,然后创建了一个拉取请求供我批准。我在收到拉取请求 5 分钟后批准了它。

第二天早上,有一些紧急的事情 (jira-ticket3) 出现了,这被分配给了我。这张票要求我对 code3 和 code4 进行更改。在开始工作之前我还做了一个 git pull (从而获得了develop1所做的更改)。我还创建了一个新分支,然后在完成后推送并批准我的更改。

由于问题的紧迫性,测试人员只能测试我的更改,他已批准将其转到我们的 UAT 分支

现在我的问题

我可以将我所做的更改(即对 code3 和 code4 所做的更改)推送到我们的 UAT 分支而不触及 developer1 所做的更改吗?

通常显示在我的本地存储库上的唯一分支是 dev 和我自己的分支。

ps。我已经阅读了几个“类似”的问题,但我不确定这是否适用于我的情况。

【问题讨论】:

  • 你能制作一个 tl;dr 版本吗?如果您想选择特定的提交,我有一个答案
  • 我们处理这个的常用方式是一个ticket分支,稍后会被合并——这不是一个好的解决方案吗?分支到提交 1 之前。
  • @Mr.Alien 刚刚做到了。谢谢!
  • @kabanus 你能解释一下票务分行吗?当我批准 developer1 完成的提交时,我无法知道我会收到与 jira-ticket1 无关的紧急请求。
  • @mrjayviper 假设您有两个分支,master 和 branch1,现在您在 master 中提交了多个提交,并且您只想选择特定的提交,您可以先签出到 master 分支,然后使用 git cherry-pick HASH_ID_OF_BRANCH1_COMMIT ,这将只选择 branch1 的特定提交并将其放入主分支。希望你能理解。

标签: git


【解决方案1】:

我们处理这个问题的方式是票务分支。假设原来的树是:

A-B

在拉取请求之后,您将拥有

A-B-C

使用 C 包含更改(使用 git 讨论提交而不是文件更容易。)现在出现了紧急情况,您不能使用 C 代码来处理它。签出 B(使用哈希或 HEAD~1),分支并提交您的修复:

A-B-C  <-Master
   -D  <-Ticket branch

现在你们没事了,历史会证明你们不得不分开一段时间。一旦事情解决,只需合并回来:

A-B-C---E
    -D-/

当然,您可以将拉取请求更改为坐在 master 上,然后在 master 上

git reset --hard <hash of B commit>

在这张照片中你有:

A-B-C <- Some temp branch
   -D <-Master now

提交文件,推送 master 分支,然后将 C 合并/rebase 到 master。

============================

使用第二种方法对代码进行说明。拉后你有:

A-B-C <-UAT

现在,

git checkout -b tempbranch #to save C
git checkout master
git reset --hard HEAD~1 #Or explicitly B hash

现在树是:

A-B(<-UAT)-C <- tempbranch

进行更改并

git commit -a -m"My changes"

树:

A-B-C <-tempbranch
   \
     D<-UAT

现在你可以推动它了。当你想包含 C 时,要么变基要么合并它。对于变基:

git checkout tempbranch
git rebase UAT
git checkout master
git merge tempbranch
git branch -D tempbranch #Not needed!

现在你有:

A-B-D-C

推。

【讨论】:

  • 你好。我们使用一个名为 UAT 的分支进行 UAT 测试。如何仅将我的提交(在您的示例中为 D)合并到此 UAT 分支?我们的自动编译器的设置方式总是选择 UAT 分支。
  • 我展示了一个变基解决方案。你也可以合并,如果你已经推送了C,那会更安全。
  • 似乎只有当我 git 拉“B”时这才有效?如果 developer1 有另一个任务,他不知道 git pull 而只是获取最新的呢?
  • 在我的图片中,每个人都从 A 和 B 开始。你最终将不得不拉 C,因为它已经可供每个人使用我建议将你的修复提交到 temp(错误修复)分支而不是 master,并且然后稍后推送合并。
猜你喜欢
  • 2012-12-03
  • 2013-05-03
  • 2010-12-31
  • 2019-04-28
  • 2011-09-16
  • 2010-10-27
  • 2011-11-24
  • 1970-01-01
相关资源
最近更新 更多