<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Fwolf's Blog &#187; Svn/Git - Fwolf's Blog</title>
	<atom:link href="http://www.fwolf.com/blog/post/tag/scm/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fwolf.com/blog</link>
	<description>随心·随意·随缘·努力～</description>
	<lastBuildDate>Sun, 29 Aug 2010 14:52:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Git 合并 patch 时的冲突处理一例</title>
		<link>http://www.fwolf.com/blog/post/448</link>
		<comments>http://www.fwolf.com/blog/post/448#comments</comments>
		<pubDate>Tue, 25 Aug 2009 15:02:35 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Svn/Git]]></category>
		<category><![CDATA[conflict]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[merge]]></category>
		<category><![CDATA[patch]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/?p=448</guid>
		<description><![CDATA[git version 1.6.0.4 几个新手刚刚开始接触 Git，为了维护核心仓库的“纯洁”，避免太多无关信息被误提交进仓库（再次批评一些图形化工具默认的“Select All”），采用了核心仓库只读，邮件提交 patch，审核后再提交的工作流程。 期间有时会遇到合并冲突，正常的原因一般是未及时下载新版本产生了冲突，特殊一点的原因是手工修改 patch 内容导致的。有时候看注释写得不够准确，忍不住就改了，有时候是 Geany 保存时自动去除了 patch 原文中的行尾空格，有时候是文件回车格式、BOM 等变动了，总之合并 patch 的时候，如果生成 patch 的“原稿”找不到，一般就产生了冲突，比如： $ git am 0001-BUG-Sybase.patch Applying: CHG: 读取Sybase如果时间为空,设置默认时间的修改 error: patch failed: source.php:38 error: source.php: patch does not apply Patch failed at 0001. When you have resolved this problem run "git am --resolved". If you would prefer to [...]]]></description>
			<content:encoded><![CDATA[<p>git version 1.6.0.4</p>

<p>几个新手刚刚开始接触 Git，为了维护核心仓库的“纯洁”，避免太多无关信息被误提交进仓库（再次批评一些图形化工具默认的“Select All”），采用了核心仓库只读，邮件提交 patch，审核后再提交的工作流程。</p>

<p>期间有时会遇到合并冲突，正常的原因一般是未及时下载新版本产生了冲突，特殊一点的原因是手工修改 patch 内容导致的。有时候看注释写得不够准确，忍不住就改了，有时候是 Geany 保存时自动去除了 patch 原文中的行尾空格，有时候是文件回车格式、BOM 等变动了，总之合并 patch 的时候，如果生成 patch 的“原稿”找不到，一般就产生了冲突，比如：</p>

<pre><code>$ git am 0001-BUG-Sybase.patch
Applying: CHG: 读取Sybase如果时间为空,设置默认时间的修改
error: patch failed: source.php:38
error: source.php: patch does not apply
Patch failed at 0001.
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".
</code></pre>

<p>刚开始一看有些懵，因为没有任何冲突在哪里的提示，后来找到一种方法，am 操作出问题后先手工 apply：</p>

<pre><code>$ git apply --reject 0001-BUG-Sybase.patch
Checking patch source.php...
error: while searching for:
        // 注释
        // 以下为几行代码片断
error: patch failed: source.php:38
Applying patch source.php with 1 rejects...
Rejected hunk #1.
</code></pre>

<p>这样，就把没有冲突的文件先合并了，剩下有冲突的作了标记。先看输出，error: while searching for: 说明是这段代码有冲突，error: patch failed: source.php:38 指明了产生冲突的代码<strong>片断</strong>的开始行号，相应的，patch 中应该有这么一段：</p>

<pre><code>diff --git a/source.php b/source.php
index 8770441..4e77b8a 100644
--- a/source.php
+++ b/source.php
@@ -38,27 +38,23 @@ class Site extends Module
        // 注释
        // 以下为几行代码片断
</code></pre>

<p>同时，还会产生一个 source.php.rej 文件，里面也是上面这段因为冲突无法合并的代码片断。</p>

<p>现在，在这段代码中查找冲突原因，并对文件进行修改，source.php.rej 参考完了可以删掉。改好之后，用 git add 把 source.php 添加到缓冲区，同时也要把其他没有冲突合并成功了的文件也加进来，因为在作 apply 操作的时候他们也发生了变化：</p>

<pre><code>$ git add source.php
$ git add 其他 apply 进来的文件们
</code></pre>

<p>最后：</p>

<pre><code>$ git am --resolved
Applying: CHG: 读取Sybase如果时间为空,设置默认时间的修改
</code></pre>

<p>大功告成。</p>

<p>中间如果处理乱了，用 git reset 恢复即可，所以合并 patch 在一个“干净”的分支上处理更好。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/conflict" title="conflict" rel="tag">conflict</a>, <a href="http://www.fwolf.com/blog/post/tag/example" title="example" rel="tag">example</a>, <a href="http://www.fwolf.com/blog/post/tag/git" title="git" rel="tag">git</a>, <a href="http://www.fwolf.com/blog/post/tag/import" title="import" rel="tag">import</a>, <a href="http://www.fwolf.com/blog/post/tag/merge" title="merge" rel="tag">merge</a>, <a href="http://www.fwolf.com/blog/post/tag/patch" title="patch" rel="tag">patch</a>, <a href="http://www.fwolf.com/blog/post/tag/scm" title="Svn/Git" rel="tag">Svn/Git</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/446" title="[Git]初学者注意事项 (2009-08-04)">[Git]初学者注意事项</a> (0)</li>
	<li><a href="http://www.fwolf.com/blog/post/127" title="利用SVN更新网站 (2006-01-19)">利用SVN更新网站</a> (7)</li>
	<li><a href="http://www.fwolf.com/blog/post/162" title="[ubuntu]安装vmware时找不到c header files的小问题 (2006-05-09)">[ubuntu]安装vmware时找不到c header files的小问题</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/441" title="[Git]真正回滚已上传的更新 (2009-05-14)">[Git]真正回滚已上传的更新</a> (0)</li>
	<li><a href="http://www.fwolf.com/blog/post/431" title="[Git]提交后自动发email (2009-03-27)">[Git]提交后自动发email</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/448/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Git]初学者注意事项</title>
		<link>http://www.fwolf.com/blog/post/446</link>
		<comments>http://www.fwolf.com/blog/post/446#comments</comments>
		<pubDate>Tue, 04 Aug 2009 13:57:05 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Svn/Git]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[newbie]]></category>
		<category><![CDATA[rule]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/?p=446</guid>
		<description><![CDATA[实在是受不了有些人的 Git 提交，费大力气“回滚”，遂整理了这些刚开始用 git 或者还没有建立 scm 概念时容易犯的错误。 和源码无关的东西，尽量不要进仓库 不得不说一些图形化软件，在提交内容的时候大多提供一个“全选”或者“Select All”功能，这是最不好的了，一些懒惰的同志看都不看就连瓢带碗都提交了。 测试时上传的文件，测试时的临时文件，统统不要 对应上一条，强烈建议把所有文件的上传保存目录另行设置，放到源代码目录以外 编辑器产生的备份文件、临时文件，编译时的中间文件，统统不要 对应上一条，有个例外就是为了实现通过 Git 更新系统，.NET 的 bin 文件要进仓库，导致那个仓库现在都 100+m 了 图片等资源文件，进仓库也可以，但应当使用有意义的文件名，便于后期管理 对应上一条，现在设计网站界面喜欢先作图然后切割，产生一大堆 001_r5_c1.jpg 这样的文件，讨厌之极 使用的外部类库，比如 php 类、js 类等，统统扔到源码目录以外，如果实在没办法要放在目录树中，也可以留出空目录，打包发行的时候再包含进来，依然不进代码仓库 不要中文文件名，主要是跨平台使用有问题，文件名完全能够只用字母数字减号下划线 尽量采用相对小、相对独立的提交 Git 是作什么用的？Git 不是代码上传工具，也不是网站更新工具，而是软件开发过程的记录工具，为了更加准确的定位每个问题、每个功能修改，就需要在每完成一部分可以称得上是“一项”的工作时，就 commit 一次。哪怕只是修改了一两行，只要产生了必要的功能改变，就有价值记录。 当采用代码审核机制或者需要用邮件提交补丁时，较小的提交能够更有效、更容易、更准确的被检查和审核，这个在 linux kernel 开发文档中也有提到。 当然不能矫枉过正，必须有可记录的改变才有提交的价值。对应的，Git 日志大多数情况下主要显示第一行，控制每次提交都能用一句话简单概括，也是有必要的。 注释格式 格式属于个人习惯和团队规范范围，有必要采用相对统一的风格。 Git 本身不允许空注释，同时建议注释的第一行写简要说明，下面留一行空行，再写详细说明。 我的个人习惯，喜欢在每条注释前面用大约三个字母来表示本次修改的性质： Add something Bug [fix&#124;found]: describe the bug or [...]]]></description>
			<content:encoded><![CDATA[<p>实在是受不了有些人的 Git 提交，费大力气“<a href="441">回滚</a>”，遂整理了这些刚开始用 git 或者还没有建立 scm 概念时容易犯的错误。</p>

<h3>和源码无关的东西，尽量不要进仓库</h3>

<p>不得不说一些图形化软件，在提交内容的时候大多提供一个“全选”或者“Select All”功能，这是最不好的了，一些懒惰的同志看都不看就连瓢带碗都提交了。</p>

<ul>
<li>测试时上传的文件，测试时的临时文件，统统不要</li>
<li>对应上一条，强烈建议把所有文件的上传保存目录另行设置，放到源代码目录以外</li>
<li>编辑器产生的备份文件、临时文件，编译时的中间文件，统统不要</li>
<li>对应上一条，有个例外就是为了实现通过 Git 更新系统，.NET 的 bin 文件要进仓库，导致那个仓库现在都 100+m 了</li>
<li>图片等资源文件，进仓库也可以，但应当使用有意义的文件名，便于后期管理</li>
<li>对应上一条，现在设计网站界面喜欢先作图然后切割，产生一大堆 001_r5_c1.jpg 这样的文件，讨厌之极</li>
<li>使用的外部类库，比如 php 类、js 类等，统统扔到源码目录以外，如果实在没办法要放在目录树中，也可以留出空目录，打包发行的时候再包含进来，依然不进代码仓库</li>
<li>不要中文文件名，主要是跨平台使用有问题，文件名完全能够只用字母数字减号下划线</li>
</ul>

<h3>尽量采用相对小、相对独立的提交</h3>

<p>Git 是作什么用的？Git 不是代码上传工具，也不是网站更新工具，而是软件开发过程的记录工具，为了更加准确的定位每个问题、每个功能修改，就需要在每完成一部分可以称得上是“一项”的工作时，就 commit 一次。哪怕只是修改了一两行，只要产生了必要的功能改变，就有价值记录。</p>

<p>当采用代码审核机制或者需要用邮件提交补丁时，较小的提交能够更有效、更容易、更准确的被检查和审核，这个在 <a href="http://wiki.zh-kernel.org/doc/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E_linux_%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91">linux kernel 开发文档</a>中也有提到。</p>

<p>当然不能矫枉过正，必须有可记录的改变才有提交的价值。对应的，Git 日志大多数情况下主要显示第一行，控制每次提交都能用一句话简单概括，也是有必要的。</p>

<h3>注释格式</h3>

<p>格式属于个人习惯和团队规范范围，有必要采用相对统一的风格。</p>

<p>Git 本身不允许空注释，同时建议注释的第一行写简要说明，下面留一行空行，再写详细说明。</p>

<p>我的个人习惯，喜欢在每条注释前面用大约三个字母来表示本次修改的性质：</p>

<ul>
<li>Add something</li>
<li>Bug [fix|found]: describe the bug or fix.</li>
<li>Chg something</li>
<li>Del something</li>
<li>Enh some treatment</li>
<li>New something</li>
<li>Tmp for some cause</li>
</ul>

<p>为了保持语法通顺，也可以采用前三个字母后面加冒号，后面有啥写啥的方法。</p>

<p>最后，我觉得，能够遵守行业规范和团队约定，主动养成良好习惯，应当是鉴别人才的一项重要因素。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/git" title="git" rel="tag">git</a>, <a href="http://www.fwolf.com/blog/post/tag/newbie" title="newbie" rel="tag">newbie</a>, <a href="http://www.fwolf.com/blog/post/tag/rule" title="rule" rel="tag">rule</a>, <a href="http://www.fwolf.com/blog/post/tag/scm" title="Svn/Git" rel="tag">Svn/Git</a>, <a href="http://www.fwolf.com/blog/post/tag/tips" title="tips" rel="tag">tips</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/448" title="Git 合并 patch 时的冲突处理一例 (2009-08-25)">Git 合并 patch 时的冲突处理一例</a> (0)</li>
	<li><a href="http://www.fwolf.com/blog/post/300" title="针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS） (2007-03-18)">针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/410" title="用ssh打通反向隧道，内网也可对外提供服务 (2008-07-10)">用ssh打通反向隧道，内网也可对外提供服务</a> (2)</li>
	<li><a href="http://www.fwolf.com/blog/post/127" title="利用SVN更新网站 (2006-01-19)">利用SVN更新网站</a> (7)</li>
	<li><a href="http://www.fwolf.com/blog/post/377" title="你最希望在哪里看到TIPS？ (2008-01-10)">你最希望在哪里看到TIPS？</a> (5)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/446/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
