我继承了最初存储在CVS中的项目以及所有修订版。我做了很多编辑,我正在尝试比较我在原始目录中所做的所有更改,包括添加的新文件和旧文件。
hg / git有哪些实用工具,我可以做树差异,还是那种性质的东西?那么说,新添加的文件,删除的文件之间有标记,我要求的太多了吗?
答案 0 :(得分:72)
从两个任意文件或目录中简单地以git的diff格式创建差异补丁,没有任何花哨的存储库内容或版本控制:
git diff --no-index some/path other/path >> some_filename
JakubNarębski对knittl答案的评论暗示了答案......为简单起见,这就是完整的命令。
>>
部分创建一个文件并将输出重定向到它。如果您不想要文件并且只想在控制台中打印输出以便复制它,只需删除>> some_filename
部分。
为了便于复制和粘贴,如果您已经cd
编辑了包含名为a
的原始目录/文件和修改后的目录b
的目录,那么它将是:
git diff --no-index a b >> patch
答案 1 :(得分:22)
git diff [--options] [--] [<path>...]
[...]
如果给出了两个路径,并且至少有一个未跟踪,则比较两个文件/目录。--no-index
可以强制执行此行为。
如果您想在两个不同的存储库中比较两个版本(例如两个标记版本或两个分支),您可以使用Git Wiki上GitTips页面中描述的技巧,在“如何比较两个本地存储库”下。
假设您在一个存储库中,第二个存储库位于/path/to/repo
中,因此如果它是非裸存储库,则其GIT_DIR为/path/to/repo/.git
,您可以执行以下操作:
$ GIT_ALTERNATE_OBJECT_DIRECTORIES=/path/to/repo/.git/objects \
git diff $(git --git-dir=/path/to/repo/.git rev-parse --verify A) B
其中A和B是您要比较的修订版。当然,您也可以在上面的表达式中指定路径限制器。
说明: GIT_ALTERNATE_OBJECT_REPOSITORIES
变量可用于使git命令连接两个存储库的对象数据库。 git --git-dir=... rev-parse ...
用于将作为git-dir
选项参数的存储库中的名称(扩展SHA-1表达式)转换为唯一的SHA-1标识符。 $( ... )
构造在命令行中调用给定命令的结果。 git diff
用于比较两个修订版(其中一个来自备用对象存储库)。
替代解决方案是使用git remote add
(和git fetch
)将导入其他存储库简单地导入到给定的存储库中。然后你就可以在本地获得所有东西,并且能够在单个存储库中进行比较。
答案 2 :(得分:9)
hg / git是否有某种实用工具我可以做树差异... [s] o说,新添加的文件,删除的文件之间有标记 ... [强调补充]
是。我们可以git diff
当前目录对另一个目录和...
...标记已添加,已删除和已修改的文件:
git diff --name-status --no-index ./ path/to/other/dir
...仅显示已添加的文件:
git diff --diff-filter=A --name-status --no-index ./ path/to/other/dir
...仅显示已删除的文件:
git diff --diff-filter=D --name-status --no-index ./ path/to/other/dir
...仅显示已修改的文件:
git diff --diff-filter=M --name-status --no-index ./ path/to/other/dir
答案 3 :(得分:7)
这不是特定于git的,但作为Windows的一般差异实用工具,我非常喜欢WinMerge。
答案 4 :(得分:7)
我真的不明白你想要什么,但是diff -ur
对你来说不够?它甚至可以在没有任何版本控制的目录上工作。
答案 5 :(得分:3)
git diff
正是如此。但它只适用于git项目。
hg diff
,svn diff
漂亮的每个版本控制系统都可以对目录树进行区分
答案 6 :(得分:1)
还有两种方法可以在两个目录/项目之间进行区分。
语法:git-diff [] [-] [……] 该表单用于查看您相对于索引(下一次提交的暂存区域)所做的更改。换句话说,差异就是您可以告诉Git进一步添加到索引中的内容,但您仍然没有。
这里是。 网址:https://git-scm.com/docs/git-diff
git diff --no-index目录1项目/路径目录2项目/路径>>文件名
使用 Linux命令 diff --brief --recursive dir1path / dir2Path /
如果您使用的是Windows,则有一个应用程序 WinMerge 。
答案 7 :(得分:0)
创建从dir1到dir2的补丁程序(--binary
仅用于二进制文件):
git diff --no-prefix --no-index --binary dir1 dir2 > dir.diff
将补丁应用于工作目录的内容,该工作目录的内容与dir1相同:
cd dir1_copy
git apply ../dir.diff
git apply
具有默认的-p1
,它会删除diff命令中的前导目录。