我们面临着这样一种情况:我们正在为我们的公司(GA)定制一个 Web 应用程序,并且需要通过 pull 请求将一些更改发送到 git 上游存储库。上游 Web 应用程序是“AUS”。更改将保存在特定文件中,并且在工作完成之前就已知晓。所有工作(即使是 AUS)都将在 GA 中捕获。
我们如何在不重复提交(来自 cherry-pick
和 rebase
)的情况下解决这个问题,并保持干净且易于遵循?
我为此制定了一个“秘诀”并想分享它。
最佳答案
我描述了配方并显示了 SourceTree 所看到的存储库状态的屏幕截图(因为它一次显示了所有分支)。请注意,分支是“au”、“ga”和“master”,而不是配方中使用的 GPT-99_description_AU、GPT-99_description_GA 和 GPT-99_description。
(您可能会问为什么每个代码块之前有一个额外的行和一个句点 - 这是我今天可以对其进行格式化的唯一方法!)
- 创建 3 个分支。他们应该反射(reflect)正在解决的问题,并为 AuScope 制定一个,为 GA 制定另一个。我们还需要一个来 merge 到
.
$ git checkout master # or whatever base branch we will be using
$ git branch GPT-99_description
$ git branch GPT-99_description_AU
$ git branch GPT-99_description_GA
- 执行 GA 分支上的所有工作
.
$ git checkout GPT-99_description_GA
- 根据需要执行编辑、添加文件和删除文件
- 确定将发送到 AUS 的文件,因为它们必须单独提交(否则我们如何将这些提交发送到 AUS?)
- 提交 AUS 文件。使用标识为 AUS 文件提交的内容开始提交消息
.
$ git add <files>
$ git commit -m "GPT-99 - AUS files - ..."
也许可以使用标记来代替消息。稍后再看。
- 提交 GA 文件。不需要识别信息。
.
$ git add <files>
$ git commit -m "GPT-99 - ..."
- 切换到 AuScope 分支
.
Switch to the AuScope branch
- 挑选 AuScope 提交(查看日志)
.
$ git cherry-pick SHA#1
$ git cherry-pick SHA#2
...
- 现在发生的事情是提交已被复制并将存在于 GA 和 AUS 分支上。提交是分开的(它们具有不同的 SHA),但它们的实质是相同的 - 如果两者都重播,则会出现冲突,因为两者都将尝试添加/删除/编辑相同的内容。我们可以使用 https://git-scm.com/book/en/v2/Git-Branching-Rebasing#Rebase-When-You-Rebase 中描述的 git 技巧。 ,其中复制的提交将有一个 patch-id,用于将提交标识为相同。这允许我们进行 rebase,并且 git 会将不同的提交解析为一个
.
$ git rebase --onto GPT-99_description GPT-99_description_AU GPT-99_description_GA
- 重复的提交现已 merge 。然而,GA 分支没有 AUS 更改。为了实现这一点,我们 merge :
.
$ git checkout GPT-99_description_GA
$ git merge GPT-99_description_AU
- 存储库现在处于以下状态:所有更改都位于 GA 分支上,并且打算作为 pull 请求发送到 AuScope 的更改位于 AU 分支上。
关于git - 仅与上游存储库共享( pull 请求)一些提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32600066/