天道酬勤,学无止境

Using Mercurial, is there an easy way to diff my working copy with the tip file in the default remote repository

When using mercurial, I'd like to be able to diff the working copy of a file with the tip file in my default remote repository. Is there an easy way to do this?

I know I can do an "hg incoming -p" to see the patch sets of changes coming in, but it'd be nice to just directly see the actual changes for a particular file that I'd get if I do a pull of the latest stuff (or what I might be about put push out).

The easiest thing I can think of right now is to create a little script that takes a look at the default location in .hg/hgrc and downloads the file using curl (if it's over http, otherwise scp it over ssh, or just do a direct diff if it's on the local file system) and then to diff the working copy or the tip against that temporary copy.

I'm trying to sell mercurial to my team, and one of my team members brought this up today as something that they're able to do easily in SVN with their GUI tools.

评论

After some digging, I came across the Rdiff extension that does most of what I want it to.

It doesn't come with mercurial, but it can be installed by cloning the repository:

hg clone http://hg.kublai.com/mercurial/extensions/rdiff 

And then modifing your ~/.hgrc file to load the extension:

[extensions] 
rdiff=~/path/to/rdiff/repo/rdiff.py

It's a little quirky in that it actually modifies the existing "hg diff" command by detecting if the first parameter is a remote URL. If it is then it will diff that file against your tip file in your local repo (not the working copy). This as the remote repo is first in the arguments, it's the reverse of what I'd expect, but you can pass "--reverse" to the hg diff command to switch that around.

I could see these being potential enhancements to the extension, but for now, I can work around them with a bash/zsh shell function in my starup file. It does a temp checkin of my working copy (held by the mercurial transaction so it can be rolled back), executes the reverse diff, and then rolls the transaction back to return things back to the way they were:

hgrdiff() {
    hg commit -m "temp commit for remote diff" && 
    hg diff --reverse http://my_hardcoded_repo $* &&
    hg rollback      # revert the temporary commit
}

And then call it with:

hgrdiff <filename to diff against remote repo tip>

You could try having two repositories locally - one for incoming stuff, and one for outgoing. Then you should be able to do diff with any tools. See here:

http://weblogs.java.net/blog/kohsuke/archive/2007/11/using_mercurial.html

to expand on Lars method (for some reason comment doesn't work), you can use the -R option on the diff command to reference a local repository. That way you can use the same diff application that you've specified within hg

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Mercurial - 如何创建在两次修订之间更改的文件的 .zip 文件?(Mercurial - How do I create a .zip of files changed between two revisions?)
    问题 我有一个个人 Mercurial 存储库,用于跟踪我正在处理的一些更改。 我想与合作者分享这些更改,但是他们没有/无法获得 Mercurial,所以我需要发送整个文件集,合作者将在他们的最后合并。 我正在寻找一种方法来提取在两个修订号之间修改的文件子集的“提示”版本。 有没有办法在 Mercurial 中轻松做到这一点? 添加赏金- 这对我们来说仍然是一个痛苦。 我们经常与内部“客户”合作,他们将我们的源代码发布为 .zip,并且测试一个小的修复作为 .zip 覆盖比作为补丁更容易分发(因为我们经常不知道他们的文件状态)。 回答1 最好的情况是向这些人施加适当的压力以获取 Mercurial,但除此之外,补丁可能比压缩文件集更好,因为补丁将跟踪删除和重命名。 如果你仍然想要一个 zip 文件,我写了一个简短的脚本来制作一个 zip 文件: import os, subprocess, sys from zipfile import ZipFile, ZIP_DEFLATED def main(revfrom, revto, destination, *args): root, err = getoutput("hg root") if "no Merurial repository" in err: print "This script must be run from
  • 初学者Mercurial:权威的实用指南(Mercurial for Beginners: The Definitive Practical Guide)
    问题 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 受Git启发的初学者:权威的实用指南。 这是有关使用Mercurial面向初学者进行实际使用的信息的汇总。 初学者-接触过源代码控制却不太了解的程序员。 实用-涵盖大多数用户经常遇到的情况-创建存储库,分支,合并,从/到远程存储库的拉/推等 注意事项: 说明如何完成某件事,而不是如何实现。 每个答案处理一个问题。 尽可能清晰,简洁地回答。 编辑/扩展现有答案,而不是针对同一主题创建新答案。 请为想要了解更多信息的人提供指向Mercurial Wiki或HG Book的链接。 问题: 安装/设置 如何安装Mercurial? 如何设置Mercurial? 您如何创建新的项目/存储库? 如何配置它以忽略文件? 使用代码 您如何获得最新代码? 您如何签出代码? 您如何提交更改? 您如何查看未提交的内容或当前代码库的状态? 如何从存储库中删除文件? 您如何销毁不必要的提交? 您如何比较文件的两个修订,或者当前文件和先前的修订? 您如何查看文件或存储库的修订历史? 您如何处理二进制文件(例如,visio文档或编译器环境)? 如何合并在“同一时间”更改的文件? 您如何还原变更集? 您如何返回到以前的代码版本? 如何从特定变更集中提取补丁?
  • 有什么办法可以删除Mercurial中的本地提交?(Is there any way to delete local commits in Mercurial?)
    问题 因此,我在Mercurial中不断犯一个愚蠢的错误。 通常,我会在不进行“汞拉”和“汞更新”的情况下开始工作。 当我尝试推送更改时,出现错误。 有什么方法可以删除我的本地提交,以便避免创建多个标头,分支等吗? 我只想删除本地提交,将更改与提示合并,然后重新提交。 听起来很简单,对吧? 我似乎找不到任何轻松删除本地提交的方法,因此可以与技巧完美地合并。 同样,我只想删除使用“ hg ci”所做的本地提交。 我不想修改文件,还原等。 回答1 启用“ strip ”扩展名并输入以下内容: hg strip #changeset# --keep 其中#changeset#是要删除的变更集的哈希。 这将删除所说的变更集,包括从其衍生出来的变更集,并使您的工作目录保持不变。 如果您还希望还原已提交的代码更改,请删除--keep选项。 有关更多信息,请检查剥离扩展。 如果收到“未知命令'strip'”,则可能需要启用它。 为此,请找到.hgrc或Mercurial.ini文件,然后向其中添加以下内容: [extensions] strip = 请注意(如Juozas在其评论中所述),具有多个负责人是Mercurial中的正常工作流程。 您不应该使用strip命令来解决这个问题。 相反,您应该将自己的头部与传入的头部合并,解决所有冲突,进行测试,然后再进行推送。
  • 使用 Mercurial,如果经常提交中间状态,如何与固定修订版进行差异化?(Using Mercurial, how to diff with a fixed revision if commit intermediate states often?)
    问题 使用 Mercurial,假设我执行hg pull和hg up ,现在本地存储库和工作目录都是最新的。 如果我经常提交,比如 1 天后,然后 2 天后,并且想要与现在的修订版有所不同,该怎么办? 否则,差异总是与之前提交的版本进行比较。 我现在可以用铅笔和纸写下修订号,比如4117 ,然后在 1 天后,2 天后,在我确定并推送到远程中央存储库之前的任何时间,做一个 hg vdiff -r 4117 (使用vdiff或diff )。 但不是记住这个“神奇数字”4117,有没有办法让 Mercurial 以某种方式记住这个数字? 这样, hg vdiff是查看针对提交代码的微小更改之间的差异,但有一个差异显示推送到远程存储库之前的所有更改。 (或者,如果有命令显示自上次拉取以来的修订号,它也应该显示4117 ,所以在 bash 上,我们可以执行类似hg vdiff -r `hg --what-is-last-pull` ) 更新: hg out --patch显示推送到远程hg out --patch的差异? 如果是这样,也许它可以在不关心“幻数”的情况下达到目的。 但是如何使用 kdiff3 或任何其他差异工具显示补丁差异? 此外,似乎我们可以执行hg out ,如果我们看到hg vdiff -r ___ ,那么我们知道如果我们执行hg vdiff -r ___我们应该使用
  • 在 mercurial 中,如何将反向补丁应用于特定文件?(In mercurial, how do I apply a reverse-patch to a particular file?)
    问题 与 Mercurial 相关:在一个 repo 中的分支之间合并一个文件,我正在尝试对单个文件执行撤销操作,即使该文件是被撤销的修订的众多参与者之一。 HG 是面向变更集的工具,它不想对文件进行操作。 我能找到的最接近的是使用 hg export 创建差异,手动编辑差异,然后 hg import 以相反的顺序修补文件。 ..但后来我遇到了这种烦人的情况,http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html 声称有一个 --reverse 选项可以在没有时进行hg patch 。 所以我能想到的最接近的事情是像上面那样生成一个手工编辑的补丁,然后使用 vanilla patch -R 来应用一个反向补丁。 hg backout命令在这里似乎很有用,但实际上是一个红鲱鱼。 必须有更好的方法,不是吗? 回答1 您可以仅使用-I (包括与给定模式匹配的名称)参数来使用单行退出: hg backout --merge -I thefiletorevert -m 'message' OFFENDINGREVISIONID 示例脚本: hg init testrepo cd testrepo echo -e "line1\n\nline3" > file1 echo -e "line1\n\nline3" >
  • 将来自不相关存储库的提示与 Mercurial 合并(Merge tip from an unrelated repository with Mercurial)
    问题 我有两个不相关的存储库“public”和“develop”: prj/ public/ develop/ 'develop' 有很多提交,因为这里是我工作的地方。 甚至可能有多个头 有时我想发布开发存储库的快照。 从公共文件夹我可以这样做: >hg pull -f ../develop >hg merge >hg commit -m "alpha2" 但这也会将完整的变更集历史从“开发”拉到“公开”(这不是我想要的)。 我还可以从“public”中删除所有文件,“.hg”子文件夹除外。 然后手动复制'develop'目录中的所有文件并执行 >hg commit -m "alpha2" 但是后来我必须“添加”新文件,“删除”过时的文件并再次“重命名”移动的文件。 使用带有提交的-A选项会盲目地添加/删除所有文件,即使它们在“开发”存储库中不受控制。 必须有更有效的方法来做到这一点;-) 回答1 我建议您只浏览完整的历史记录,但如果您出于某种原因无法忍受,那么您可以执行以下任何操作: 使用 ConcatenatingChangesets 将开发中的所有变更集连接到 public 中的单个结果变更集- 或 - 删除所有公共文件,在开发中制作一个“hg 存档”,然后在公共场合扩展它——这只会让你控制文件——或者在开发中使用“hg manifest”来驱动 xargs
  • 在 Windows 上设置 Mercurial 的执行位(Setting Mercurial's execute bit on Windows)
    问题 我在 Mercurial 存储库上工作,该存储库被检出到 Unix 文件系统,例如某些机器上的 ext3 和其他机器上的 FAT32。 在 Subversion 中,我可以设置 svn:executable 属性来控制在支持此类位的平台上检出文件时是否应将文件标记为可执行文件。 无论我在哪个平台上运行 SVN 或包含我的工作副本的文件系统,我都可以做到这一点。 在 Mercurial 中,如果克隆位于 Unix 文件系统上,我可以 chmod +x 来获得相同的效果。 但是如何在 FAT 文件系统上的文件上设置(或删除)可执行位? 回答1 Mercurial 跟踪执行位作为文件元数据的一部分。 无法在 mercurial 中明确设置它,但它会跟踪chmod在 unix 上所做的更改。 在 Windows 上添加的文件将默认设置执行位,但 windows attrib 命令不允许您设置它们。 如果您执行hg log -p --git您将看到显示执行位更改的补丁格式,如下所示: $ hg log --git -p changeset: 1:0d9a70aadc0a tag: tip user: Ry4an Brase <ry4an-hg@ry4an.org> date: Sat Apr 24 10:05:23 2010 -0500 summary: added execute
  • 如何将变更集从 hg 存储库导出到 svn 存储库(How do I export changesets from hg repository to svn repository)
    问题 我知道 mercurial 有 hgsubversion 扩展。 但在我知道它是如何工作之前,我维护了两个独立的存储库,一个是 SVN 存储库,一个是 Hg 存储库。 我最近在 Hg 存储库中进行了大部分更改,我需要将它们“推送”到 svn 存储库。 最直接的方法是从 svn 获取一个修订版,它与来自 hg 的一个修订版同步。 从那里,我更新到下一个修订版(从 Hg),然后提交(到 svn)。 对许多变更集重复这些步骤相当不方便。 有没有更方便的方法来做到这一点? 如果可能,请使用适用于 Windows 操作系统的解决方案。 问候, 非洲人 回答1 如果您正在谈论一系列线性变更集(无合并),您可以使用 shell for循环 for therev in $(seq $(hg id -n -r .) $(hg id -n -r tip)) ; do hg update $therev svn commit -m "$(hg log --template '{desc}' -r .)" done 从检出修订到提示循环,并依次提交每个保留提交消息。 您可能需要在添加/删除文件周围做一些有趣的事情。 回答2 不是,没有。 您可能已经看过此链接。 目前尚未正式支持与 svn repos 交互。 我不会写一个 shell 脚本来自动化这个。 这可能会产生意想不到的结果,搞砸了回购
  • Cloning github repo with hggit - abort: repository not found
    I am trying to clone some github repos locally with hggit. I am following tutorial instructions to do $ hg clone git://github.com/schacon/hg-git.git abort: repository git://github.com/schacon/hg-git.git not found! $ hg clone git+ssh://git@github.com/schacon/hg-git.git abort: repository git+ssh://git@github.com/schacon/hg-git.git not found! I know I have hggit because the following works $ python -c "import hggit" $ head -n1 `which hg` #!/opt/local/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python $ /opt/local/Library/Frameworks/Python.framework
  • 有没有一种方法可以删除Mercurial中单个文件的历史记录?(Is there a way to remove the history for a single file in Mercurial?)
    问题 我想我已经知道答案了,但是我还是想问一下: 我们有一个文件,其中添加了包含敏感信息的Mercurial存储库。 有什么办法可以在不删除整个存储库的情况下删除该文件及其更改历史记录? 回答1 不,你不能。 阅读那些本不应是在商业红皮书中所涉及的部分的更改; 尤其是包含该段的敏感更改的转义部分如何处理: Mercurial也不提供使文件或变更集从历史记录中完全消失的方法,因为没有办法强制其消失。 有人可以轻松修改其Mercurial副本以忽略此类指令。 此外,即使Mercurial提供了这样的功能,只要没有拉过“使此文件消失”更改集的人也不会受到它的影响,Web爬网程序在错误的时间访问,磁盘备份或其他机制也不会受到影响。 。 实际上,没有分布式修订控制系统可以使数据可靠地消失。 提供这种控制的错觉可能很容易给人一种错误的安全感,并且比根本不提供安全性还差。 回复已提交更改的通常方法是通过backout命令由mercurial支持的(再次,mercurial书籍:处理已提交的更改),但是信息不会从存储库中消失:由于您永远不知道是谁精确克隆了您的存储库,因此错误的安全感,如上所述。 回答2 正确的是,您不能轻易地从Mercurial中删除特定文件,因为这样做会破坏存储库中的所有变更集ID。 更改变更集ID时,每个人都必须重新克隆存储库。
  • 在 Team Foundation Server 中实际使用 Mercurial?(Real-world use of Mercurial with a Team Foundation Server?)
    问题 我的商店使用 TFS,除了缺少本地存储库提交/恢复之外,通常对它很满意。 我开始自己在本地使用 Mercurial 来帮助管理较小的更改块,然后将它们发布到 TFS。 如果中心 VCS 是 Subversion,我看到 Subversion 有一个“桥”组件可以自动启用它。 我还没有为 Team System 找到一个。 这让我感到鼓舞的是,其他人已经走上了将 DVCS 与 CVCS 系统集成的道路。 (1) 有人知道吗? 我有点怀疑它(快速搜索没有找到任何东西)。 (2)是否有人以这种方式使用 Mercurial/TFS? 如果是这样,你能不能分享你的经验。 我特别想了解在通过 Mercurial 进行重大活动后可能会出现哪些关于 TFS 提交的问题并不明显。 到目前为止,只有我使用 if 几天,这似乎是一个全面的双赢 - 但我知道的足够多,认为这就是那么容易。 回答1 不确定这是否是您还不知道的事情,但我已经在本地使用 mercurial 一段时间了,到目前为止,我认为好处超过了管理两个源代码控制系统的额外开销。 这是我一直在做的事情: 我让我的 TFS 结帐成为一个 HG 存储库,我认为它是我的“主人”。 我从 TFS 获取更新并将它们提交到这个 repo,所以它包含来自 TFS 的项目的最新状态。 这里重要的是,没有独立于 TFS 更新或 Hg 合并(这是第 2 部分
  • 将Mercurial存储库转换为Git(Convert a Mercurial Repository to Git)
    问题 我已经尝试过通过快速导出操作hg2git,并且已经尝试过hg-git。 两者都没有成功。 hg2git确实有效,但是我不得不问一个运行Unix机器的朋友来做。 这就弄乱了整个文件中的所有换行符。 hg-git只是由于一些libzip压缩错误而失败。 有没有人在Windows上将hg仓库转换为git取得成功? 明确一点,我不在乎互操作。 我想将整个仓库从hg移植到git,并记录下我的历史记录。 我不需要来回推动更改-只需转换一次。 回答1 在Mac上执行以下操作以成功将Mercurial存储库导出到Git(具有完整分支): mkdir myrepo; cd myrepo; git clone git://repo.or.cz/fast-export.git . rm -rf .git .gitignore git init ./hg-fast-export.sh -r ../path/to/local/hg/repo git clean -f # remove fast-export files 回答2 Windows 7 64位解决方案 如何将Mercurial存储库转换为Git存储库。 这是我不得不弄清楚的最愚蠢的事件序列之一,但是我根本不是Python专家。 我的开始环境 Visual Studio 2010/2012年乌龟2.8.2; 包括Mercurial 2.6
  • Mercurial 命令行:如何显示特定修订的更改?(Mercurial commandline: How to show changes of a specific revision?)
    问题 在我将一个新头拉入我的存储库后,我想看看新头接触了哪些文件。 就像一个hg status但没有改变它。 我不想要整个差异,只是一个概述。 我期望的是更一般问题的特定版本:我如何查看特定修订版中的更改摘要? 这是在命令行上,我不想启动 TortoiseHG 或其他一些 GUI。 回答1 status 命令显示哪些文件已更改。 采用 hg status --rev .:tip 将工作副本父修订(当前签出的修订)与最新修订进行比较。 如果您拉取了多个变更集,那么这与 hg status --change tip 该命令仅显示tip变更集涉及的文件 - 而不是当前检出的变更集 ( . ) 和tip之间的组合更改。 回答2 将--change选项用于 hg status,将您--change的修订版传递给它。 例如, hg status --change tip 列出tip更改的文件。 我相信这个标志是在 hg 1.7 中添加的。 回答3 哈哈。 令人惊讶的是,强迫自己问这个问题是如何让我意识到最好看的地方。 hg diff -r11 --stat --stat 似乎让我得到了我想要的。
  • Mercurial:如何撤消最后一次未推送的提交?(Mercurial: how to undo last unpushed commit?)
    问题 我不小心提交了我的本地存储库。 更具体地说,当我打算一次提交一个文件时,我一次提交了对许多文件的更改。 如何撤消此提交并将我的工作副本恢复到提交之前的状态,以便我可以做我应该做的事情? 自提交以来,我没有推或拉或其他任何东西。 你可能怀疑这是重复的,所以我会解释为什么下面的问题不同,或者不回答我的问题: Mercurial 撤销上次提交 对此的回答指出,您可以使用hg commit --amend执行此hg commit --amend ,但没有解释如何执行此操作或给出执行此操作的示例。 mercurail 帮助也没有为我解释清楚。 你如何在 Mercurial 上“回滚”最后一次提交? 使用hg rollback 。 此命令显然已弃用,无论如何我都尝试使用它,但我收到了消息:没有可用的回滚信息。 可惜这不起作用,因为这将是实现我想要的真正直观的方式。 回答1 根据这个问题的信息: hg strip --keep --rev . --keep: do not modify working directory during strip --rev . (点表示最后一次提交。阅读 sid0 关于后代的回答) 对于更熟悉 git 语言的人,您正在寻找git reset --mixed HEAD^ hard这会丢弃您的更改,使您的工作“消失”(我认为这不是一种选择)
  • 暂存和远程之间的 Git 盲点(Git blind spot between staging and remote)
    问题 我对来自 VSS/TFS/SVN 背景的 git 比较陌生。 我在 Visual Studio 2015 中使用 git 插件。 因此,我克隆了一个存储库并对代码文件进行了一些更改。 然后我查看更改选项卡(我认为它在后台执行了 git diff)并且我看到了我所做的更改。 一切都很好,花花公子。 然后我将更改提交到我的本地存储库,之后我对本地文件进行了更多更改,查看更改并再次提交。 我的问题是我的本地仓库和远程仓库之间现在有一个盲点 - 我已经失去了本地和远程之间差异的可见性。 自从我开始使用 git 以来,这一直让我感到困惑。 我做错了吗...afaik“git diff”显示了我的本地工作代码库和本地存储库之间的更改。 如何轻松查看本地存储库中累积的更改与远程存储库中的代码之间的差异? 回答1 你会想要 diff commits 。 特别是,您将希望将作为另一个存储库中最尖端提交的当前提交与您自己存储库中的最尖端提交进行比较。 但在最一般的情况下,您不能这样做,直到您将该提交(另一个存储库的提交)复制到您的存储库。 这是因为您始终在自己的存储库中工作,除非您将存储库连接到具有第二个存储库的第二个 Git 的短暂时间。 这可能是最好的可视化说明(这需要显示分支的图形表示,这——至少在物理实现方面——在 Git 中与在 SVN 中非常不同)。 考虑这张图: o--o--U <
  • 我可以使用 SVN 或 Mercurial 只提交部分代码吗?(Can I commit only parts of my code using SVN or Mercurial?)
    问题 我通常使用 Tortoise SVN,但我一直在研究 Mercurial,因为它是一个分布式版本控制系统。 在这两个系统中,我正在寻找一种工具,它让我只选择文件的一部分并提交它们。 如果我现在想这样做,我必须复制到文件的临时版本并仅保留我想在当前版本中提交的更改,然后在提交后再次将临时版本复制到当前版本。 这真是太麻烦了,程序应该能够为我做到这一点。 我听说 Git 支持这个,请告诉我这是否正确。 回答1 Mercurial 可以通过记录扩展来做到这一点。 它会提示您输入每个文件和每个差异块。 例如: % hg record diff --git a/prelim.tex b/prelim.tex 2 hunks, 4 lines changed examine changes to 'prelim.tex'? [Ynsfdaq?] @@ -12,7 +12,7 @@ \setmonofont[Scale=0.88]{Consolas} % missing from xunicode.sty \DeclareUTFcomposite[\UTFencname]{x00ED}{\'}{\i} -\else +\else foo \usepackage[pdftex]{graphicx} \fi record this change to 'prelim.tex'?
  • 当项目树有二进制文件时,GIT、Mercurial、SVN 或其他版本控制工具能否正常工作?(Can GIT, Mercurial, SVN, or other version control tools work well when project tree has binary files?)
    问题 有时我们的项目树可以有二进制文件,例如 jpg、png、doc、xls 或 pdf。 GIT、Mercurial、SVN 或其他工具在只更改二进制文件的一部分时能很好地工作吗? 例如,如果规范是用 .doc 编写的并且它是存储库的一部分,那么如果它是 4MB,并且编辑了 100 次但只针对 1 或 2 行,并且在一年中签入了 100 次,那么它是 400MB . 如果它是 100 个不同的 .doc 和 .xls 文件,那么它就是 40GB... 不是一个易于管理的大小。 我尝试过 GIT 和 Mercurial,发现它们似乎都添加了大量数据,即使在 .doc 或 .pdf 中更改了 1 行。 在 GIT 或 Mercurial 或 SVN 中有其他方法可以完成这项工作吗? PS 我试过 Dropbox,我可以有一个 7MB 的文件,然后我突出显示 .PDF 文件中的几个地方,Dropbox 似乎能够在 1 秒内上传更改。 我的上行链路只有大约 200kb/s,所以我认为 Dropbox 在区分我的文件方面做得很好。 所以我们可以使用 Dropbox,除非这种方式没有版本控制。 回答1 一般来说,版本控制系统对文本文件工作得更好。 整个合并/冲突概念实际上是基于源代码的。 但是,SVN 对二进制文件非常有效。 (我们用它来版本 CAD 图纸。) 我要指出的是
  • git merge ours their commands 之间的区别(difference between git merge ours theirs commands)
    问题 我正在练习 GIT。 下面的命令有什么区别? git merge -s ours branch git merge -s theirs branch git merge -X ours branch git merge -X theirs branch 回答1 在我开始回答这个问题之前,让我强调一下,有两个不同的单词都拼写为“merge”。 有一个动词形式to merge ,意思是“结合变化”。 有名词或形容词形式,即合并或合并提交,指的是特定类型的提交。 git merge命令通常同时进行:它合并(动词)一些更改,然后进行合并(名词)或合并提交(形容词)。 不过,Git 有很多方法可以实现合并的动词形式。 它还允许git merge命令省略最后的名词形式 merge (但我们将在这里完全忽略这种情况)。 策略或扩展选项——简短版本 简短的版本是您几乎从不想要策略选项-s ours 。 使用-X (扩展)选项,您可以告诉 Git在发生冲突时支持合并的“我们的”或“他们的”一侧。 也就是说,假设文件wallaby.txt的合并基础版本部分说: The Bennett's wallaby is a variety of the red-necked wallaby. 两个分支提示版本之一——我们称之为左侧或本地或--ours版本——说: The Bennett's wallaby
  • Git的blob数据和diff信息(Git's blob data and diff information)
    问题 据我所知,Git 的 blob 将 SHA1 哈希作为文件名,以免在存储库中复制文件。 例如,如果文件 A 的内容为“abc”,SHA1 哈希值为“12345”,只要内容不变,提交/分支就可以指向相同的 SHA1。 但是,如果将文件 A 修改为“def”以具有 SHA 哈希“23456”会发生什么? Git 是否存储文件 A 和修改后的文件 A(不仅仅是区别,而是整个文件)? 如果是这样,那是为什么? 存储差异信息不是更好吗? 如果没有,diff 如何跟踪文件中的更改? 其他 VCS 系统如何 - CVS/SVN/Perforce...? 添加 以下来自“Git Community Book”的内容回答了我的大部分问题。 需要注意的是,这与您可能熟悉的大多数 SCM 系统非常不同。 Subversion、CVS、Perforce、Mercurial 等都使用增量存储系统——它们存储一次提交和下一次提交之间的差异。 Git 不这样做 - 它在每次提交时存储项目中所有文件在此树结构中的外观的快照。 这是在使用 Git 时需要理解的一个非常重要的概念。 回答1 git 按内容而不是差异存储文件,因此在您的示例中,A 的两个版本(“abc”和“def”)都将存储在对象数据库中。 存储整个对象效果更好,因为只需比较它们的 SHA,就可以很容易地查看文件的两个版本是否相同。
  • 您是否使用分布式版本控制?(Do you use distributed version control?)
    问题 我想听听使用分布式版本控制(又名分布式修订版本控制,分散版本控制)的人们以及他们如何找到它。 您在使用什么,Mercurial,Darcs,Git,Bazaar? 您还在使用吗? 如果您过去使用过客户端/服务器rcs,您发现它更好,更差还是有所不同? 您能告诉我什么让我跳上潮流? 或就此事跳下去,我也很想听听有负面经历的人的来信。 我目前正在考虑替换当前的源代码控制系统(Subversion),这是此问题的推动力。 与其他国家/地区的同事一起使用过的人特别感兴趣,在这些国家您的机器可能无法同时启动,并且连接速度非常慢。 如果您不确定什么是分布式版本控制,请阅读以下几篇文章: 分布式版本控制简介 维基百科条目 回答1 我在工作中和个人项目中都一直使用Mercurial,对此我感到非常满意。 我看到的优势是: 本地版本控制。 有时我正在做某事,并且想要保留其版本历史记录,但是我还没有准备好将其推送到中央存储库。 使用分布式VCS,我可以提交到本地仓库,直到准备就绪为止,而无需分支。 这样,如果其他人进行了我需要的更改,我仍然可以将它们集成到我的代码中。 准备好后,将其推送到服务器。 合并冲突更少。 它们仍然会发生,但是它们似乎不那么频繁,并且风险也较小,因为所有代码都已签入到本地存储库中,因此即使我破坏了合并,我也始终可以备份并再次执行。 将单独的存储库作为分支。