在发出拉取请求后继续在Git分支上工作

Isa*_*ell 32 git version-control github

我最近发现自己处于这种情况的几次,而且我不确定如何最好地处理它.

所以我有一个我正在贡献的git存储库的分支.我让我的主分支与上游主分支同步.

当我想开发一个新功能,bugfix等时,我会从我的主人那里创建一个分支并做任何工作.当我完成后,我合并了在此期间对上游主服务器所做的任何更改,然后从我的feature/bugfix分支向上游主服务器发送一个pull请求.

现在,当我等待拉取请求被接受时,我想要处理稍微不同的事情.但是,新功能工作需要我刚刚发送了pull请求的bugfix/new功能.我需要建立它.

如何以可以处理延续的方式分支/合并/处理分支,同时在第一个拉取请求被接受到主服务器后,仍然能够以干净的方式合并/拉取我的更改中的请求?

这都是使用Github,虽然我想这个答案一般适用于Git.

mna*_*gel 13

根据对feature1的最后一次提交创建一个新分支(feature2).feature1将不再向前移动,并且可以合并.然后可以稍后合并feature2(有些人会争辩在feature1被合并到上游的提交中rebase feature2,但我个人不喜欢rebasing).


Hea*_*ery 6

考虑到这种工作流程的普遍性以及一路上的陷阱,我认为缺乏指导。特别是,OP 提到了 GitHub,但几乎没有发现当您单击此工作流程中常见的“使用变基更新”或“使用合并提交更新”按钮时会发生什么。

为了更加清楚起见,这里有一种应该具有说明性的方法。首先是设置:

$ git pull # on master branch, will update master branch
$ git switch -c feature1 # create new branch *from master*. Note `switch -c` is the less ambiguous form of `checkout -b` since Git 2.23
$ # work on feature 1
$ git add . && git commit -am "commit1"
$ # more work on feature 1
$ git add . && git commit -am "commit2"
$ git push # pushes "feature1" branch with "commit1" and "commit2", from which you can make a Pull Request to be merged with master.
Run Code Online (Sandbox Code Playgroud)

而现在OP的困境——master还没有包含feature1,那么如何解决feature2取决于它呢?仅从当前分支分支:

$ git switch -c feature2 # create new branch *from feature1*.
$ # work on feature 2
$ git add . && git commit -am "commit3"
$ # more work on feature 2
$ git add . && git commit -am "commit4"
Run Code Online (Sandbox Code Playgroud)

此时,没有什么可以阻止您push使用新分支。它只会包含commit3commit4。您甚至可以创建一个 Pull Request 将其合并到 master 中。但是,默认情况下,GitHub 会阻止您启动合并,因为它检测到该分支与 master 相比“已过时”。

因此,此时我们假设远程主机是最新的。feature1已被合并,也许还添加了其他无关紧要的提交。我们只需要更新我们自己的分支。feature2我们可以在我们当前的分支机构舒适地完成这一切:

$ git rebase master # or `git merge master`, pick your poison
Run Code Online (Sandbox Code Playgroud)

现在,feature2就 GitHub 而言,我们的分支是“最新的”,但我们需要推送,以便它知道这一点。但是,如果您喜欢的毒药是这种rebase类型,请记住您的提交已在新基地上重播,因此就遥控器而言,它们是不同的提交。因此,为了避免事情变得非常糟糕,尽管命令行给出了善意的建议,但此时不要发出 a 。git pull相反,请执行以下操作:

$ git push --force-with-lease # safer version of --force. Not necessary if you merged instead of rebased.
Run Code Online (Sandbox Code Playgroud)

瞧,您的 Pull 请求现在将与 master 保持“最新”状态,并且可以开始合并。另外,我们知道 GitHub 按钮背后的魔力(现在不那么神秘了):

  • Update with rebase ”相当于在 PR 分支上并git rebase master随后发布git push --force-with-lease.
  • Update with merge commit ”相当于在 PR 分支上并git merge master随后发出git push.