我们正在从 SVN 过渡到 git,有些概念我无法理解。
我们有如下设置:
我已将我们的源代码转换为 git 存储库,并将其提交给“本地”。一切都很好,当我克隆它时,它会将 master 分支复制到我的本地环境中,无论我在家还是在工作中。 pull 实时服务器也很有效,它将主分支更改 pull 入实时环境。但我想有以下可能性:
编辑:
我对这一切如何运作的假设的实际示例:假设我们的项目是“项目”,我们有开发人员“dev1”、“dev2”和“dev3”,每个人有 2 台机器。团队有 3 个任务:“bug”、“特性”和“协作”。 Bug 分配给 dev1,功能分配给 dev2,并且协作是三个需要一起工作的功能($REMOTE 是我们本地开发服务器上主存储库的 url,即 user@local:repo.git):
==========
一、在本地工作
由于 dev1 被分配给“bug”,他将负责处理。他执行以下操作:
$git branch bug
$git checkout bug // switches to bug branch
( // edit some files)
$git commit -a -m 'I fixed the bug!'
$git push $REMOTE bug
这个开发人员现在如何将他的修复程序 merge 到主存储库中,以及一旦完成 merge ,他如何删除所有机器上的错误分支?我希望当人们进行更新或获取或其他任何事情时,错误分支消失,以防他们检查或检索它。
========
II 在本地工作,然后在另一个位置的同一个同步分支上继续
“功能”已分配给“dev2”,他这样做:
$git branch feature
$git checkout feature // switches to feature branch
( // edit/add some files etc. )
$git commit -a -m 'I made some updates, will continue at home'
$git push $REMOTE feature
// at home, the developer does the following, right?
$git clone $REMOTE -b feature /some_new_folder // if he didn't clone the whole repo previously
or
cd previously_cloned_repo_master_or_whatever
$git fetch
$git checkout $REMOTE feature
( // right? )
( // edit some files then ... )
$git commit -a m 'I finished!'
$git push
// Same as above, what next? How to merge it into all other branches and safely delete the branch afterwards. What happens when someone is in a branch that has been deleted, and makes a pull?
========
III 多人在一个分支,与主分支分开
“协作”是一项共同努力,将由来自所有 6 个地点的所有三位开发人员进行工作。它是由 dev3 创建的。
$git branch collaboration
$git checkout collaboration // switches to needed branch
( // add something, so we have something to commit)
$git commit -a -m 'Initialized new branch'
$git push $REMOTE collaboration
( // The other two devs can then simply call .. )
$git fetch
$git checkout $REMOTE collaboration
( // And they're ready to go, right? )
( // Each dev then makes his own edits on some areas, commits, and pushes. All pushes change the content of the branch, so that if dev2 pushed and dev1 makes $git pull in the root of the project while on this branch, dev1 will get his changes, right? )
========
此外,是否可以将分支限制为特定的分支创建者?例如,我想看看 dev1 在删除“bug”之前做了什么,但如果我想对它进行一些我自己的更改,我不应该被允许这样做,我应该改为为该给定分支发出 pull 请求,并且 dev1 应该必须手动接受我的更改 - 我不应该强制他这样做。
最佳答案
TL;博士
使用 git flow .
它将删除问题并自动处理您所询问的一些问题。当您熟悉 git flow 和分支等时,您可以轻松选择以不同的方式做事 - 或手动。
更改也将反射(reflect)在我的家用机器上
在您的 imac 上推/pull 到非主,在您的家用机器上从非主推/pull 。
其中“not-master”是您当前正在处理的任何分支。
每个开发分支
由您决定,您的工作流程需要帮助而不是阻碍开发。例如。如果两个开发人员在同一任务上进行协作 - 你想强制他们在不同的分支工作吗?功能分支可能更有意义,但拥有用户分支并没有错。
单独的生产分支
不管你怎么做 - 您的实时应用程序应该从已知的稳定标签/分支中提取 ,通常 不要直接推送给master ,因为破坏事物是开发的一部分,但是破坏您的实时应用程序将从中提取的代码是您绝对想要避免的。您应该能够在任何时候毫无疑问地进行实时安装,您可能会引入损坏的代码。如果您使用的是 Continuous Integration server如果所有测试都通过,您可以轻松地从开发分支自动 merge 到 master,甚至自动部署。
当分支完成时
所有的工作流程疑虑都是一样的。当一个分支完成后,你将它 merge 到你的主分支。
IE。
$ git branch working-on-this master
$ git add ...
$ git commit ...
$ # rinse and repeat
$ git push --set-upstream $REMOTE working-on-this
当时机成熟时:
$ git checkout master
$ git pull
$ git merge working-on-this
$ git push
$ git branch -d working-on-this
$ git push $REMOTE :working-on-this
您没有明确删除其他机器上的所有分支;但是任何人都可以随时运行:
$ git branch --merged master
如果分支完成,它将如下所示:
$ git branch --merged master
master
working-on-this
$ git branch -d working-on-this
这表明可以安全地删除 work-on-this。无论如何 -
git branch -d
如果您在执行命令时尝试删除未与您所在的分支 merge 的分支,则会触发警告并中止。如果您发现有多个远程分支被认为已经完成 - 您可以使用一个命令清理它们:
$ git remote prune -n origin
-n
标志意味着它只会报告它将要删除的分支 - 删除该标志以实际删除过时的远程分支如果您有多个开发人员在同一个分支上工作(协作)沟通是关键不要依赖工作流程,在让你的团队成员在(据称)完成的分支中工作之前积极讨论删除内容。
限制分支提交权限
是的,您可以这样做 - 但您真的想要吗?你最好使用交流和约定。
一些建议:
任何人都可以随时执行上述任何操作,但假设您信任整个团队,实际上没有理由限制开发人员以阻止他们这样做 - 有时他们可能需要打破排名和规则防止这种情况发生,而公约则不会。
关于php - Git - 每个开发人员多台机器 - 跨机器提交但不提交到主分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9716608/