如何选择特定提交并将其推送到另一个分支?

时间:2017-05-01 05:21:00

标签: git

TL; DR

我是否可以在不触及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在远程dev分支上拉取以获取最新代码。然后他创建了一个名为“jira-ticket1”的新本地分支,并对文件code1和code2进行了更改。他还对my-js.js进行了更改

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

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

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

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

现在我的问题

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

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

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

1 个答案:

答案 0 :(得分:1)

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

A-B

拉动请求后你会有

A-B-C

使用C包含更改(使用git更容易讨论提交而不是文件。)现在出现紧急情况,并且您无法使用C代码。结帐B(使用散列或HEAD~1),分支并提交修复:

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

现在你很好,历史将证明你们不得不拆分一段时间。一旦事情解决,只需合并回来:

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

当然,您可以将拉取请求更改为主人,然后是主人

git reset --hard <hash of B commit>

在这张图片中你有:

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

提交文件,推送主分支,然后将C /合并/转换为主文件。

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

使用第二种方法澄清代码。拉后你有:

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

推。