灰常酷的柳树 · 万豪122亿美元吞下喜达屋创建全球最大酒店集 ...· 4 月前 · |
霸气的佛珠 · 习近平系列重要讲话数据库· 4 月前 · |
酷酷的打火机 · 揭秘涨停 | 超36万手抢筹ST重组股! ...· 10 月前 · |
旅途中的西装 · 沈阳地铁1号线站点线路图(十三号街-黎明广场 ...· 1 年前 · |
鼻子大的生姜 · 用stackedit保存笔记_郭润民的博客- ...· 1 年前 · |
我尝试git-svn的动机是毫不费力的合并和分支。然后我注意到man git-svn(1)说:
不建议在计划从中执行dcommit的分支上运行git-
或git-pull。Subversion不以任何合理或有用的方式表示合并;因此使用Subversion的用户看不到您所做的任何合并。此外,如果合并或拉出的git分支是SVN分支的镜像,dcommit可能会提交到错误的分支。
这是否意味着我不能从svn/trunk (或分支)创建本地分支,删除,合并回svn/trunk,然后dcommit?我知道svn用户将看到与svn 1.5.x之前的合并一样的混乱,但还有其他缺点吗?最后一句话也让我担心。人们经常做这样的事情吗?
发布于 2010-11-21 23:05:32
实际上,我发现了一种更好的方法,在git merge上使用
--no-ff
选项。我以前使用的所有这些壁球技术都不再需要了。
我的新工作流程现在如下所示:
-s
假设您在存储库
trunk/
、
branches/
和
tags/
中有一个标准的SVN布局):
git svn clone -s
-b
创建分支"work")
git checkout -b work
-s
对提交消息进行签名)。在续集中,我假设您进行了3次本地提交
..。(工作)$> git commit -s -m "msg 1“...(工作)$> git commit -s -m "msg 2“...(工作)$> git commit -s -m "msg 3"
现在您想要提交到SVN服务器
SVN
(工作)$> git stash
(工作)$> git签出主程序(主程序)$> git svn rebase
(主)$> git签出工作(工作)$> git rebase master
(工作)主git日志--$> --oneline --decorate
--no-ff
选项将“工作”分支中的所有三个提交合并到“$>”中了
$> git checkout master ($>)$> git merge --no-ff work
(主) svn git日志--图形--oneline -装饰* 56a779b (工作,主)合并分支‘工作’|\ |* af6f7ae消息3|* 8750643消息2|* 08464ae消息1 |/ * 21e20fa (git- SVN ) $>提交
amend
)您的SVN伙伴的最后一次提交(否则他们只会看到一次提交,并显示消息“合并分支‘工作’”)
(主) SVN服务器上的$> git提交--amend
(master)$> git svn dcommit
($>) git签出工作(工作)$> git stash pop
发布于 2008-10-10 07:47:13
使用git-svn创建本地分支绝对是可能的。只要您只是为自己使用本地分支,而不是尝试使用git在上游svn分支之间进行合并,就应该没问题。
我有一个"master“分支,用于跟踪svn服务器。这是我执行dcommit操作的唯一分支。如果我正在做一些工作,我会创建一个主题分支,然后继续工作。当我想提交它时,我会执行以下操作:
<代码>H19git merge topic_branch
我还有另一种情况,我需要维护一些本地更改(用于调试),这些更改永远不应该推送到svn。为此,我有上面的master分支,但也有一个名为" work“的分支,我通常在这里工作。主题分支是工作的分支。当我想在那里提交工作时,我签出master,并使用cherry-pick从我想要提交到svn的工作分支中选择提交。这是因为我希望避免提交三个本地更改提交。然后,我从主分支进行数据提交,并重新设置所有内容的基址。
首先运行
git svn dcommit -n
是值得的,以确保您将要提交的正是您想要提交的内容。与git不同,在svn中重写历史记录很难!
我觉得一定有更好的方法来合并主题分支上的更改,同时跳过那些本地更改提交,而不是使用樱桃挑选,所以如果有人有任何想法,他们将是受欢迎的。
发布于 2010-12-28 21:34:26
简单的解决方案:合并 后删除'work‘分支
简短回答: 你可以随心所欲地使用git (参见下面的简单工作流程),包括merge。只要确保遵循每个“ git merge work ”和“ git branch -d work ”来删除临时工作分支即可。
背景解释: 合并/dcommit问题是,当你“git svn dcommit”一个分支时,该分支的合并历史记录是“扁平的”:git忘记了所有进入该分支的合并操作:只保留文件内容,但这些内容(部分)来自特定的其他分支的事实丢失了。请参阅: Why does git svn dcommit lose the history of merge commits for local branches?
(注意: git-svn对此无能为力: svn根本无法理解更强大的git合并。因此,在svn存储库中,此合并信息不能以任何方式表示。)
但这是整个问题所在。如果你在“工作”分支合并到“主分支”之后删除它,那么你的git仓库是100%干净的,看起来和你的svn仓库一模一样。
当然,我首先将远程 存储库克隆到本地git存储库(这可能需要一些时间):
$> git svn clone <svn-repository-url> <local-directory>
然后所有的工作都发生在“本地目录”中。每当我需要从服务器获取更新时(比如'svn update'),我都会这样做:
$> git checkout master
$> git svn rebase
我的所有开发工作都是在一个单独的分支“work”中完成的,它的创建方式如下:
$> git checkout -b work
当然,您可以为您的工作创建任意多的分支,并根据您的喜好在它们之间进行合并和重新建立基础(只需在完成后删除它们-如下所述)。在我的正常工作中,我经常做以下事情:
$> git commit -am '-- finished a little piece of work'
下一步(git rebase -i)是可选的-它只是在将其归档到svn之前清理历史:一旦我到达一个稳定的英里石,我想与其他人分享,我重写这个‘工作’分支的历史并清理提交消息(其他开发人员不需要看到我在此过程中所犯的所有小步骤和错误-只是结果)。为此,我做了
$> git log
并复制svn储存库中的最后提交的sha-1散列(如git-svn-id所指示的)。然后我会打电话给
$> git rebase -i 74e4068360e34b2ccf0c5869703af458cde0cdcb
只需粘贴我们上次svn提交的sha-1散列,而不是我的。你可能想要阅读'git help rebase‘的文档来了解详细信息。简而言之:这个命令首先打开一个呈现你的提交的编辑器-对于你想用之前的提交来压缩的所有提交,只需将'pick‘改为' squash’即可。当然,第一行应该保留为“选择”。通过这种方式,您可以将许多小提交压缩为一个或多个有意义的单元。保存并退出编辑器。您将看到另一个编辑器要求您重写提交日志消息。
简而言之:在我完成“代码破解”之后,我推敲我的“工作”分支,直到它看起来是我想要向其他程序员展示它的方式(或者当我浏览历史记录时,我想要在几周内看到工作)。
为了将更改推送到svn存储库,我执行以下操作:
$> git checkout master
$> git svn rebase
现在我们回到了旧的'master‘分支,同时更新了svn存储库中发生的所有更改(您的新更改隐藏在'work’分支中)。
如果有一些更改可能与您的新“工作”更改发生冲突,您必须在本地解决它们,然后才能推送您的新工作(请参阅下面的详细信息)。然后,我们可以将更改推送到svn:
$> git checkout master
$> git merge work # (1) merge your 'work' into 'master'
$> git branch -d work # (2) remove the work branch immediately after merging
$> git svn dcommit # (3) push your changes to the svn repository
注意1:'git branch -d work‘命令是非常安全的:它只允许你删除不再需要的分支(因为它们已经合并到你当前的分支中)。如果您在将工作与'master‘分支合并之前错误地执行了此命令,则会收到一条错误消息。
注意2:确保在合并和dcommit之间使用'git branch -d work‘删除你的分支:如果你试图在dcommit之后删除分支,你会得到一个错误信息:当你执行'git svn dcommit’时,git忘记你的分支已经和'master‘合并了。你必须使用不做安全检查的'git branch -D work‘来删除它。
现在,我立即创建了一个新的'work‘分支,以避免意外地攻击'master’分支:
$> git checkout -b work
$> git branch # show my branches:
master
* work
将你的‘工作’与svn上的更改集成在一起: 当'git svn rebase‘显示当我在我的’工作‘分支上工作时,其他人更改了svn存储库时,我会这么做:
$> git checkout master
$> git svn rebase # 'svn pull' changes
$> git checkout work # go to my work
$> git checkout -b integration # make a copy of the branch
$> git merge master # integrate my changes with theirs
$> ... check/fix/debug ...
$> ... rewrite history with rebase -i if needed
霸气的佛珠 · 习近平系列重要讲话数据库 4 月前 |