我继承了一个最初存储在 CVS 中的项目以及所有修订。我做了相当多的编辑,并且我正在尝试比较我在原始目录中所做的所有更改,关于添加的新文件与旧文件。
hg/git 是否有某种实用程序可以让我进行树差异或类似性质的操作?这样说来,新增文件、删除文件之间都有一个标记,我的要求是不是太高了?
要简单地从两个任意文件或目录以 git 的 diff 格式创建一个 diff 补丁,无需任何花哨的存储库内容或版本控制:
git diff --no-index some/path other/path > some_filename
Jakub Narębski 对 knittl 答案的评论暗示了答案......为了简单起见,这就是完整的命令。
>
部分创建一个文件并将输出重定向到该文件。如果您不需要文件,只想将输出打印在控制台中以便可以复制它,只需删除 > some_filename
部分即可。
为了方便复制和粘贴,如果您已经
cd
到包含名为a
的原始目录/文件和修改后的目录b
的目录,则它将是:
git diff --no-index a b > patch
git diff
手册页:
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
)将其他存储库导入到给定存储库中。 然后您将在本地拥有所有内容,并且能够在单个存储库中进行比较。新添加的文件、删除的文件之间有一个标记...[强调已添加]
是的。我们可以
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
另请参阅:https://git-scm.com/docs/git-diff
diff -ur
对你来说还不够吗?即使在没有任何版本控制的目录上它也可以工作。
git diff
正是这样做的。但它只适用于 git 项目。
hg diff
,
svn diff
几乎每个版本控制系统都可以比较目录树--binary
仅适用于二进制文件):
git diff --no-prefix --no-index --binary dir1 dir2 > dir.diff
将补丁应用于工作目录的内容,其内容与 dir1 相同:
cd dir1_copy
git apply ../dir.diff
git apply
有默认值
-p1
,它会删除 diff 命令中的前导目录。diff
命令:
diff dir1 dir2
输出到文件:
diff dir1 dir2 > diffs.txt