我在Github上分叉了一个项目.
让远程上游upstream和我的远程存储库成为origin.我的本地master分支设置为跟踪远程master分支.然后我在本地添加了一些东西master,我偶尔和上游合并.
直到今天,当我想发出拉取请求时,我才发现问题:拉取请求包括那些合并提交,以及我以前无需担心的那些不需要的提交.然而我想要的只是提交我做的最后一次提交,应该作为单个提交提取.我该怎么做才能解救这个?
我有一个远程存储库,我已经提取并从中分支出来.我想让新分支保持最新状态,对master进行更改.我正在考虑下面的工作流程,它是否有意义,或者有更好的方法来做到这一点?
初始分支和结帐:
git checkout master
git pull
git checkout -b my_branch
Run Code Online (Sandbox Code Playgroud)做一些工作my_branch,然后定期:
git checkout master
git pull
git checkout my_branch
git merge master --no-ff
Run Code Online (Sandbox Code Playgroud)根据需要重复步骤2,定期推送到遥控器my_branch.
然后准备好合并时:
git checkout master
git merge my_branch --no-ff
Run Code Online (Sandbox Code Playgroud)
听起来不错?
我有一个存储库和一些本地更改提交.在提交之前,我使用Eclipse中的Egit将更改提取到我的本地.
它创建了一个合并提交,我提交了它的提交.
现在,当我试图推送到原点时,它表明它将推送我的提交以及合并提交.但理想情况下,合并提交不应该是远程存储库的一部分.
怎么避免这个?
当我使用带有中央仓库的git(Gitorious项目)教我时,我被告知总是使用rebase而不是merge,因为我们想要有线性历史.所以我一直都在努力工作.
现在,当我开始思考它是否真的如此有益?具有许多提交的重新分支比简单合并更耗时.
现在我想到了两个优点:
还有其他好处吗?
在本文中,作者使用此图解释了变基:
alt text http://eagain.net/articles/git-for-computer-scientists/git-history.7.png
Rebase:如果您还没有发布您的分支机构,或者已经清楚地告知其他人不应该以此为基础,那么您可以选择其他方式.您可以重新分支您的分支,而不是合并,您的提交将被另一个具有不同父级的提交所取代,并且您的分支将被移动到那里.
而正常的合并将如下所示:
alt text http://eagain.net/articles/git-for-computer-scientists/git-history.5.png
所以,如果你重订,你只是失去了一个历史状态(这将是垃圾回收在将来某个时候).那么,为什么有人想要做一次变革呢?我在这里错过了什么?
我想使用git rebase它来干净地合并主分支中的一个功能(在较少的提交中或至少在更改日志的顶部).请注意,我是唯一一个在存储库上工作的人.
在阅读了Git工作流程和rebase vs merge问题之后,我发现它git rebase会非常好,就像Micah一样,我想重新git push定义更改只是因为我正在从不同的地方工作(例如:我的笔记本,我的家,另一台PC. ..)
所以这里有两个解决方案(对于双向难看的合并):
git push -f推送,然后拉动其他机器,但如何在其他机器上干净利落地获得最新版本?(2)如下所示:
git co -b feature-a
... change files
git push origin feature-a
... moving to another PC
git pull origin feature-a
... change files
git merge master
... change files (not the "special rebase")
git rebase master
git co master
git merge feature-a
git branch -d feature-a
git push origin :feature-a
Run Code Online (Sandbox Code Playgroud)
您认为哪种解决方案有效?到目前为止,我还没有尝试过其中任何一种(主要是因为害怕让我的日志变得更加混乱).
阅读本文之后,将主要分支的更改收集到我的功能分支是有意义的: Git工作流和rebase与合并问题
clone the remote repo
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature
git checkout master
git merge my_new_feature
Run Code Online (Sandbox Code Playgroud)
如果功能分支对我的机器是本地的,我可以很好地重写历史记录.
但是,如果我在功能分支上与其他人合作,该怎么办?现在我们的功能分支保存在远程存储库中,我们如何从主分支到我们的功能分支获得最新的更改?
那我们合并了吗?或者还有另一种灵巧的GIT方法吗?
提前致谢!
很少的背景:我们是一个由6名开发人员组成的团队,他们正在使 自从发布以来,我们一直使用CVS作为我们在使用ColdFusion w/Eclipse的Windows服务器上的源代码控制系统.随着最近围绕Git和分布式系统的大肆宣传,我们认为我们会检查出来.
作为标准的Web应用程序,我们拥有本地环境,我们可以在其中开发新功能/错误修复.一个开发环境,我们通过QA推送所有内容进行初始测试.我们发送已经测试过的功能/修复的分段我们的环境是尽可能地模仿我们的生产服务器.最后,一切都在旷野的现场系统中进行...
这个过程在某些时候相当痛苦,因为大部分都是通过FTP完成的,而且通常我们遇到冲突,因为某些事情需要比平时更长的时间进行测试或者需要快速修复错误.
关于Git如何在这种情况下工作,我有点困惑,这显然不是一个不常见的场景,但我发现的大部分内容都没有详细谈论它.
如果我理解正确的本地分支机构在Git中发挥重要作用,我首先克隆git存储库然后分支出来修复一些东西并将其全部提交到本地?
然后我将它提交回主干库下的主存储库处理合并冲突,如果有的话?
如果我的假设是正确的,那么主要问题是分期会发生什么.显然,某些功能/修复需要更长的时间来测试,有一些是比较急,等我将能够简单地做一些像某些功能/分支机构的拉到分期进行最后的签核,然后做同样的从直播服务器(拉,因为他们已签字)?
从CVS背景中获取相当多的东西...任何帮助将不胜感激!



以上是合并和rebase的结果.
我的问题是,在最终状态下,C5和C3'是否相同?
或者说,git rebase等于git merge+删除C3?
我有一个完善的软件工具包,但通常需要小的调整(主要是为了应对来自第三方产品的兼容性问题).我现在希望生成一个"新"版本(改进的API),它将基于原始版本 - 随着时间的推移,它将与现有分支不同,但是几年后,我将需要保持原来的"实时"需要兼容性的现有客户.当然,我还需要确保"调整"也适用于"新"版本,因为这些问题(在大多数情况下!)也适用于"新"版本.
所以 - 我的理想(简单)工作流程将是:
我意识到需要偶尔的人工干预,合并是相互矛盾的,但根据过去手动更改的经验,我希望这种情况很少见.
目前,我正在寻求放弃VSS(是的 - 继续嘲笑我保持这么长时间!),我希望Git会让这很容易,但到目前为止,似乎没有任何"简单" "解决方案,我看到的所有建议都是围绕"rebase"构建的,这对我来说似乎是"错误的",因为rebase似乎做了许多其他的事情,比如重写历史,当我需要的只是一个简单,真实的时候" "根据其他分支的变化"前进.
所有的想法非常感谢!