分类 Git 下的文章

逛论坛的时候忽然看到有楼在讨论 git fetch / git pull / git reset --hard 的问题,记录一下回复和我自己查阅的内容

  • git fetch 用于在远程仓库更新时(包括他人上传 / 更改了文件或者说开了一个新的分支),拉取更改到本地

  • git pull = git fetch + git merge origin/<branch> 用于当他人在操作者本地当前工作分支上产生了新的commits,如果操作者想将他人的 commits 合并到自己的本地分支时。git 会首先尝试自动合并,如果产生冲突,需要手动解决

  • git reset 在这个地方是处理 当操作者本地与远程仓库合并时产生了很多冲突时,这个时候如果不是必要保留本地文件更改,使用此命令。该命令会强制将所有本地文件与远程仓库版本同步,一般是先使用git fetch ,再运行git reset --hard origin/<master>


也就是说


git fetch git reset --hard origin/<branch>

将会忽略掉本地更改,强制与远程仓库同步, 而


git fetch git merge origin/<branch> # 或者说下句 git pull

将会尝试保有本地更改,采取手动解决冲突的方式

写在前面

  • 在直接用 Git 命令行上传爬下来的代码的时候,发现上传到Github上的代码文件异常,具体表现为,在代码文件使用 txt 格式结尾的时候,浏览代码结构松散,进一步检查发现在行末有不可见的符号,使用 cc 结尾的文件,在行尾都有一个 ==^M==, 后来谷歌出了结果,记录如下(确实吐槽某度)
  • 换行符和回车符的区别

    • 换行符是另起一行,使用 ‘\n’来表示,意味 ‘newline‘
    • 回车符是回到一行的开头,使用 ‘\r’来表示, 意味 'return'
  • 不同操作系统平台的换行符

    • Unix / Linux 使用的是 'LF' (0x0A)
    • 现在的MacOS使用的是 'CR' (0x0D)
    • DOS / Windown 上使用的是 'CRLF' (0x0D0A)
  • 换行符底层标识符不同也就导致了在不同的平台上,阅读和执行的体验结果可能有区别,这次将在Win平台上爬下来的以 UTF-8 编码保存的文档上传到Github时,就成功入坑了
  • Git 有一个功能叫做 换行符自动转换,在使用 git 的时候,该功能时默认开启的,作用就是,当你将项目clone到本地的时候,git自动的将文件中的换行符换成Win的CRLF,而当add和push 的时候,git再自动的把项目文件的所有CRLF换成LF,WTF?这样首先就把所有的文件每一行都改变了,diff看不出具体修改了哪里

Git

推荐解决方法

  • 首先,在安装Git客户端被询问是否开启自动换行符转换的时候,选择 'Checkout as-is, commit as-is',(尤其是UTF-8,尤其是包括中文)
  • 推荐在命令行下更改设置为不自动替换换行符,但是强制开启换行符检查功能,避免发布的文件出现问题
--------------------------------------
git config --global core.autocrlf false
git config --global core.safecrlf true
  • 再就是如果是爬下来的,或者是编辑时选择的不是Unix格式的换行符的,Git提供了一个叫做dos2unix的命令让文件替换成Unix格式,Linux如果没有的话apt / yum安装一下就好