【发布时间】:2018-01-25 03:05:27
【问题描述】:
我计划为 Kafka 开源做出贡献。我将 Kafka 分叉到我的 git hub 帐户中。 然后我在本地克隆了它。现在,我应该在 master 中进行更改还是应该在本地创建一个以票命名的分支?
【问题讨论】:
标签: git github apache-kafka
我计划为 Kafka 开源做出贡献。我将 Kafka 分叉到我的 git hub 帐户中。 然后我在本地克隆了它。现在,我应该在 master 中进行更改还是应该在本地创建一个以票命名的分支?
【问题讨论】:
标签: git github apache-kafka
创建一个分支来实现功能或错误修复,将您的分支推送到您自己的存储库(您的 fork),然后打开一个拉取请求以将您的分支合并到您的 fork 中,与主分支(通常为 master)在Kafka 官方存储库。
以下是在 GitHub 上为项目做出贡献时标准工作流程的更详细说明:
GitHub 标准分叉和拉取请求工作流程 https://gist.github.com/augustoproiete/256b560d008d39afc0814a19f41a1d49
无论您是想回馈开源社区还是在自己的项目上进行合作,了解如何正确分叉和生成拉取请求都是必不可少的。不幸的是,当您最初学习该过程时,很容易犯错误或不知道应该做什么。我知道我一开始确实遇到了相当大的麻烦,而且我发现 GitHub 上和互联网上的很多信息都相当零碎和不完整——这里描述的过程的一部分,那里描述的另一个过程,不同地方的常见挂断,等等。
为了为我自己和其他人收集这些信息,我发现这个简短的教程是创建分叉、完成工作、发出拉取请求并将拉取请求合并回的相当标准的程序原来的项目。
只需前往 GitHub 页面并单击“Fork”按钮。就是这么简单。完成后,您可以使用您最喜欢的 git 客户端来克隆您的 repo 或直接进入命令行:
# Clone your fork to your local machine
git clone git@github.com:USERNAME/FORKED-PROJECT.git
虽然这不是绝对必要的步骤,但如果您打算做的不仅仅是一个微小的快速修复,您需要通过跟踪原始“上游”存储库来确保您的分支保持最新状态你分叉了。为此,您需要添加一个遥控器:
# Add 'upstream' repo to list of remotes
git remote add upstream https://github.com/UPSTREAM-USER/ORIGINAL-PROJECT.git
# Verify the new remote named 'upstream'
git remote -v
每当您想使用最新的上游更改更新您的分支时,您需要首先获取上游存储库的分支和最新提交,以将它们带入您的存储库:
# Fetch from upstream remote
git fetch upstream
# View all branches, including those from upstream
git branch -va
现在,检查你自己的 master 分支并合并上游 repo 的 master 分支:
# Checkout your master branch and merge upstream
git checkout master
git merge upstream/master
如果本地 master 分支上没有唯一提交,git 将简单地执行快进。但是,如果您一直在对 master 进行更改(在绝大多数情况下,您可能不应该这样做 - 请参阅下一节,您可能必须处理冲突。这样做时,请注意尊重上游所做的更改。
现在,您的本地 master 分支是最新的,所有内容都在上游进行了修改。
每当您开始处理新功能或错误修复时,创建一个新分支非常重要。它不仅是正确的 git 工作流程,而且还可以使您的更改井井有条并与主分支分开,以便您可以轻松地为您完成的每项任务提交和管理多个拉取请求。
创建一个新分支并开始工作:
# Checkout the master branch - you want your new branch to come from master
git checkout master
# Create a new branch named newfeature (give your branch its own simple informative name)
git branch newfeature
# Switch to your new branch
git checkout newfeature
现在,去镇上乱砍乱砍,做任何你想做的改变。
在提交您的拉取请求之前,您可能需要做一些事情来清理您的分支,并使原始存储库的维护者能够尽可能简单地测试、接受和合并您的工作。
如果对上游主分支进行了任何提交,您应该重新设置您的开发分支,以便合并它是一个简单的快进,不需要任何冲突解决工作。
# Fetch upstream master and merge with your repo's master branch
git fetch upstream
git checkout master
git merge upstream/master
# If there were any new commits, rebase your development branch
git checkout newfeature
git rebase master
现在,可能需要将一些较小的提交压缩为少量更大且更具凝聚力的提交。您可以使用交互式变基来做到这一点:
# Rebase all commits on your development branch
git checkout
git rebase -i master
这将打开一个文本编辑器,您可以在其中指定要压缩的提交。
一旦您将所有更改提交并推送到 GitHub,请转到 GitHub 上的 fork 页面,选择您的开发分支,然后单击拉取请求按钮。如果您需要对拉取请求进行任何调整,只需将更新推送到 GitHub。您的拉取请求将自动跟踪您的开发分支上的更改并进行更新。
请注意,与前面的部分是从创建分叉并生成拉取请求的人的角度编写的不同,本部分是从处理传入拉取请求的原始存储库所有者的角度编写的。因此,“forker”将原始存储库称为 upstream,我们现在将其视为原始存储库的所有者和标准的 origin 远程。
打开.git/config 文件并在[remote "origin"] 下添加一个新行:
fetch = +refs/pull/*/head:refs/pull/origin/*
现在您可以获取和签出任何拉取请求,以便测试它们:
# Fetch all pull request branches
git fetch origin
# Checkout out a given pull request branch based on its number
git checkout -b 999 pull/origin/999
请记住,这些分支将是只读的,您将无法推送任何更改。
如果合并是简单的快进,您只需单击 GitHub 上拉取请求页面上的按钮即可自动执行合并。
要手动进行合并,您需要在源代码库中签出目标分支,直接从 fork 中拉取,然后合并和推送。
# Checkout the branch you're merging to in the target repo
git checkout master
# Pull the development branch from the fork repo where the pull request development was done.
git pull https://github.com/forkuser/forkedrepo.git newfeature
# Merge the development branch
git merge newfeature
# Push master with the new feature merged into it
git push origin master
现在您已经完成了开发分支,您可以随意删除它。
git branch -d newfeature
版权
版权所有 2017,蔡斯·佩蒂特
MIT 许可证,http://www.opensource.org/licenses/mit-license.php
补充阅读
来源
【讨论】: