标签: git-diff

如何编写外部git diff来比较添加的行到删除的行(并隐藏匹配)?

在我的文本文件中,我经常移动大部分.换句话说,我选择一个长度为3到50行的部分,将其剪切,然后将其粘贴到文件中的其他位置.

在"未提交的更改"下,Git(我使用Github OSX)将这些行显示为在文件的一部分中"删除"并在另一部分中"添加".

鉴于我的工作流程,如果Git的差异显示没有突出显示我只是从一个地方移动到另一个地方的部分,那将会更有帮助.相反,我希望Git只为我突出显示全新的行,以及我从文件中完全删除的行.(以及我改变了一些部分的线条.)

有没有办法指示Git的diff显示忽略3+行的"已删除"部分,如果它在文件的其他地方找到相同的"添加"部分?

目前我用wdiff = diff-highlight.

更新:看起来像指定外部git diff很简单:

gitconfig
[diff]
    external = ~/prose-diffs.py 
Run Code Online (Sandbox Code Playgroud)

有没有人有一个外部的git差异比较"添加"部分与"删除"部分(忽略开头和结尾的换行符),并自动隐藏添加的行与删除的行匹配的任何部分?

git diff git-diff

7
推荐指数
1
解决办法
219
查看次数

恢复合并提交后,GitLab 未显示分支差异

我有两个分支,master并且dev,我在没有 GitLab 上的合并请求的情况下合并到dev了。master

问题: 现在,如果我尝试在 GitLab 上提出合并请求,从dev到master,它没有显示任何差异。

尝试的解决方案: 我创建了另一个分支,master并使用该分支恢复了合并提交

git 恢复-m

执行此操作后,当我尝试在 GitLab 上提出合并请求时,它仍然显示

没有什么可以合并的。

但当我尝试比较本地分支时,我可以看到差异。

请帮忙。

git git-diff git-merge gitlab

7
推荐指数
2
解决办法
5909
查看次数

如何获取两个 git 分支之间不同提交的列表?

我想查看两个分支之间仅包含非常见提交的列表。

我怎样才能得到这样的输出?

基本上是git diff -y master new-feature两个分支之间的摘要:

              master                               new-feature
-------------------------------------|--------------------------------------
xxx - Jan 1st 2018 - initial commit  | xxx - Jan 1st 2018 - initial commit
xxx - Feb 1st 2018 - fix a bug       | xxx - Feb 1st 2018 - fix a bug
                                     > xxx - Mar 1st 2018 - WIP almost done
xxx - Apr 1st 2018 - fix another bug | xxx - Apr 1st 2018 - fix another bug
xxx - May …
Run Code Online (Sandbox Code Playgroud)

git diff git-diff git-log

7
推荐指数
2
解决办法
6533
查看次数

git diff 不显示新文件

file.txt我在工作树中创建了一个新文件。git status正确显示了这一点:

$ git status
On branch mybranch
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        file.txt

nothing added to commit but untracked files present (use "git add" to track)
Run Code Online (Sandbox Code Playgroud)

然而,git diff什么也没显示。

$ git diff

Run Code Online (Sandbox Code Playgroud)

我发现一些相关问题表明寻呼机可能有问题,所以我尝试了

git --no-pager diff file.txt
Run Code Online (Sandbox Code Playgroud)

和

GITPAGER=cat git diff file.txt
Run Code Online (Sandbox Code Playgroud)

具有相同的空结果。

如果我添加文件然后 diff 到 HEAD,我会得到正确的 diff。

$ git add file.txt
$ git diff --cached
diff --git a/file.txt b/file.txt
new file mode 100644
index 0000000..f2d7933
--- …
Run Code Online (Sandbox Code Playgroud)

git git-diff

7
推荐指数
1
解决办法
1万
查看次数

Git本地存储库上的单个开发人员的工作流程

我正在尝试将个人git工作流程改进为更容易处理的东西.

这里有一些背景知道我如何使用git作为这篇文章的目的:

  • 单个开发人员是唯一一个在存储库上工作的开发人员.

  • 存储在本地计算机上的存储库的单个副本.

  • 只有两个分支"开发"和"主人".

  • 所有工作都在"开发"完成.

我想要完成的是达到这样的程度,即对"master"分支的唯一提交是基于完整的"dev"代码的工作生产版本.

实际上,我要做的是:

  1. 当"dev"中的所有内容都经过测试并准备就绪时,请更新"master"以成为"dev"分支文件树的精确克隆.

  2. 对"master"进行微小修改以更新版本号等...

  3. 提交更新的"主"分支.

  4. 从"主"分支创建一个新标签.

我接近第一步的方法是签出"master"分支,然后运行:

'git diff master dev | git apply -'
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这有效地吹走了"master"中的任何内容,并用"dev"的内容替换整个树.运行"git status"似乎表明这正在做出基于上面#1的预期.

那么,第一个问题:这是正确的吗?

在"master"分支收到这些更新后,我运行我的脚本来更新文件中的版本号.然后,我只运行一个标准的"git add".和"git commit -a"添加所有更改.最后,我创建一个新标签并返回"dev"分支再次开始编码.

那么,另一个问题是:该过程中是否存在导致问题的任何问题?

更新:我应该在第一次使用它,但我不是简单地使用merge的原因是更改master上的版本号然后尝试与dev中的更改合并会导致合并冲突.我知道它们无关紧要,但它仍然会阻止这个过程.我之前使用过"merge -Xtheirs {branch}"来处理它,但我也不确定.

更新2:这里有一些我认识不起作用的东西.我已经整理了一个适用于Mac OSX的bash脚本.第一个尝试使用合并:

#!/bin/bash -x

####################
### file: merge1 ###
####################

### clear out the old stuff so you can rerun
rm -rf .git
rm *.txt

### setup the repository
git init

### ignore merge and output files for clarity sake
echo -e "output*\nmerge*" > …
Run Code Online (Sandbox Code Playgroud)

git workflow git-diff

6
推荐指数
1
解决办法
3642
查看次数

修订控制系统如何恢复修订?

我的问题比标题中声明的更为笼统.

我知道源版本控制仅存储有关差异的信息.据我所知,维基百科也是如此,github也是如此.

但他们都有能力显示具有特定修订版的整个文件.他们是否会逐步将其从第一次修订恢复到特定版本?

还有一个问题.如果他们只存储差异,他们如何用上下文显示它们(更改前后的一点点文本).

编辑: github存储整个快照而不是增量

algorithm version-control diff git-diff

6
推荐指数
1
解决办法
1955
查看次数

在git-diff中有类似diff --show-c-function的东西吗?

我一直在我的git存储库中处理一个文件.如果我有一个原始git版本的文件的副本,我可以运行diff --show-c-function来获得2个文件的比较,其中(理论上)它显示了所有已经存在的函数改变.这对于解决我对文件的具体操作非常有用,在编写我需要的注释时.

但是在git-diff中,缺少此选项.有没有办法使这项工作(或者我不得不在我提交之前得到2份文件,git-diff响应稍微复杂)?

diff git-diff

6
推荐指数
1
解决办法
3817
查看次数

如何查看带有某些单词的更改行和git commit的包含文件? - git diff可以打印文件名行前缀吗?

在推送Git提交之前,我通常想要查看我在代码中添加的所有TODO.我已经尝试了几种方法,但我还没有找到一个很好的方法来做到这一点.

例如,使用以下命令,我可以看到在上次提交中添加(和删除)的所有TODO:

git diff HEAD^ | grep "TODO"
Run Code Online (Sandbox Code Playgroud)

但是在此输出中,我没有看到哪些文件包含更改,因此我必须猜测或搜索相应的文件.使用以下命令,我看到所有带有"TODO"的文件发生了变化,但我没有看到实际的TODO:

git diff HEAD^ --name-only -G "TODO"
Run Code Online (Sandbox Code Playgroud)

所以我的问题是我怎样才能看到diff行和包含差异的文件名?例如,是否可以git diff使用文件名为每个diff行创建前缀?然后grep'ed线将提供我需要的所有信息.

git bash awk grep git-diff

6
推荐指数
1
解决办法
386
查看次数

如何让git-diff忽略所有的空白变化而忽略一个?

在另一篇文章中我发现非常整洁

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
Run Code Online (Sandbox Code Playgroud)

它可以很好git-diff地将输出压缩到必要的同时保持清晰(特别是在添加--word-diff=plain额外的[-/ -]和{+/ +}周围的删除/添加时).虽然这确实包括空格更改,但输出不会以任何明显的方式突出显示它们,例如,当更改一行代码的缩进(这是一个严重的更改)将显示为具有较长缩进的行(在之前或之后) ),但没有任何突出显示.

如何空白改变正确地在突出显示,也许是一些Unicode字符,如更换空白·,?和?,或一些更接近git diff --word-diff-regex=.的{+ +}等,但与更聪明的字分离?

git whitespace git-diff

6
推荐指数
1
解决办法
311
查看次数

新的git diff压缩启发式不起作用

更新

由于@ torek的回答,现在已经解决了

我需要在新添加的上方添加更多行,以便Git可以向上移动diff'ed块,我的意思是:

+a
+b
+c
+
+["foo", "bar", "baz"].map do |i|
+  i
+end
+
 ["foo", "bar", "baz"].map do |i|
   i.upcase
 end
Run Code Online (Sandbox Code Playgroud)

注意:我尝试使用单个换行符而不是a\nb\nc\n它也可以使用


原始问题......

我在Mac OSX上使用Git 2.9

这是一个简化的测试用例:

$ mkdir git-highlight && cd git-highlight
$ touch foo.rb
Run Code Online (Sandbox Code Playgroud)

我添加并提交以下内容:

["foo", "bar", "baz"].map do |i|
  i.upcase
end
Run Code Online (Sandbox Code Playgroud)

现在我修改文件以具有以下内容:

["foo", "bar", "baz"].map do |i|
  i
end

["foo", "bar", "baz"].map do |i|
  i.upcase
end
Run Code Online (Sandbox Code Playgroud)

如果我要运行,git diff或者git diff --compaction-heuristic我得到以下意外输出:

diff --git a/foo.rb b/foo.rb
index 9056b22..f0d289a …
Run Code Online (Sandbox Code Playgroud)

git git-diff

6
推荐指数
2
解决办法
1993
查看次数