git diff [--cached] 显示没有更改,但我发誓有一些更改。
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
问题原因:出现这个问题的原因是由于使用了一个带有选项"-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/5470596 和 stackoverflow.com/q/6050836/5470596