git diff [--cached] 显示没有更改,但我发誓有一些更改。

15 浏览
0 Comments

git diff [--cached] 显示没有更改,但我发誓有一些更改。

我的git-diff出了问题!可能是什么原因呢?

$ sh # 启动一个未修改的shell

 

sh-4.2$ git --version
git版本 2.16.2

 

sh-4.2$ git status --short
 M CMakeLists.txt
?? CMakeLists.txt.bak

 

sh-4.2$ git diff
sh-4.2$ echo $?
0

 

sh-4.2$ git add -p
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f527ae0..231dc72 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -101,7 +101,7 @@
实际的差异被移除了
但这是你在执行git diff时预期看到的内容
一些上下文
差异结束
是否将此块暂存?[y,n,q,a,d,/,e,?]? n


好的,我们尝试一下全新的存储库

sh-4.2$ git init
在 /tmp/tmp.git/.git/ 中初始化空的Git存储库
sh-4.2$ echo 42 > answer
sh-4.2$ git add answer 
sh-4.2$ git commit -m"init"
[master (root-commit) 24b402c] init
 1个文件被更改,插入了1个新内容
 创建模式 100644 answer
sh-4.2$ echo '7*6' > answer 
sh-4.2$ git status --short
 M answer
sh-4.2$ git diff
sh-4.2$ git add -p
diff --git a/answer b/answer
index d81cc07..e2d42c8 100644
--- a/answer
+++ b/answer
@@ -1 +1 @@
-42
+7*6
是否将此块暂存?[y,n,q,a,d,/,e,?]? n

嗯?可能是配置问题吗?

sh-4.2$ git config --list
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
core.symlinks=true
core.autocrlf=false
core.fscache=true
core.pager=less -E
core.editor=emacs
user.name=YSC
user.email=YSC@***
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
color.ui=auto
help.format=html
rebase.autosquash=true
alias.st=status -s
alias.l=log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(black)%s%C(reset) %C(magenta)- %an%C(reset)%C(auto)%d%C(reset)' --all
http.sslverify=false
merge.tool=ediff
mergetool.ediff.trustexitcode=false
mergetool.ediff.cmd=emacs --eval "     (progn       (defun ediff-write-merge-buffer ()         (let ((file ediff-merge-store-file))           (set-buffer ediff-buffer-C)           (write-region (point-min) (point-max) file)           (message \"Merge buffer saved in: %s\" file)           (set-buffer-modified-p nil)           (sit-for 1)))       (setq ediff-quit-hook 'kill-emacs             ediff-quit-merge-hook 'ediff-write-merge-buffer)       (ediff-merge-files-with-ancestor \"$LOCAL\" \"$REMOTE\"                                        \"$BASE\" nil \"$MERGED\"))"
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true

0
0 Comments

问题原因:出现这个问题的原因是由于使用了一个带有选项"-E"的分页器(pager)less,该选项会导致less在显示完内容后立即退出。

解决方法:将分页器设置为简单模式,可以通过以下命令实现:

git config --global core.pager less

详细解释:

在配置中使用的分页器是`less -E`,其中"-E"选项会导致less在到达文件末尾时自动退出。这意味着如果你的更改内容小于终端的高度,less会进行分页显示,然后立即退出。

这个问题可以通过关闭终端的"alternate screen buffer"来解决。"alternate screen buffer"是一个与终端窗口大小相同的屏幕缓冲区,当激活时,当前屏幕会被保存并替换为"alternate screen"。关闭"alternate screen buffer"后,less就不会立即退出了。

你可以通过终端模拟器或者通过termcap/terminfo来关闭"alternate screen buffer"。一旦关闭了这个功能,less就不会在到达文件末尾时立即退出了。

推荐将这个问题的解决方法包含在答案中,因为这是整个问题的最后一个关键环节。

参考链接提供了有关"alternate screen"的更多信息,以及关闭"alternate screen buffer"的方法。

相关问题:stackoverflow.com/q/4734844/5470596, stackoverflow.com/q/14564946/5470596, stackoverflow.com/q/29428026/5470596stackoverflow.com/q/6050836/5470596

0