GIT 在新手使用过程中会有一些常见的问题,在这里收集整理。

Windows 系统中的中文文件名乱码

$ git config --global core.quotepath false			# 显示 status 编码
$ git config --global gui.encoding utf-8            # 图形界面编码 
$ git config --global i18n.commit.encoding utf-8    # 提交信息编码
$ git config --global i18n.logoutputencoding utf-8  # 输出 log 编码
$ export LESSCHARSET=utf-8
# 最后一条命令是因为 git log 默认使用 less 分页,所以需要 bash 对 less 命令进行 utf-8 编码

优雅地显示 log 信息

修改 ~/.gitconfig 文件,添加如下内容:

  1. lg1 以单行形式显示所有分支 log
  2. lgm 以单选形式显示当前分支 log
  3. lg2 以双行形式显示所有分支 log
[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lgm = log -m --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' 
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"

只显示当前分支的提交

git log --no-merges

对 log 进行排序

git log --topo-order  # 父提交总是显示在子提交之后,显示提交时尽量避免在多个历史线上交错。
git log --date-order  # 父提交总是显示在子提交之后,显示提交时按照提交的时间戳顺序。

排序小结

–topo-order 选项导致同一个分支上的提交在历史记录中显示尽量保持连续,在查看提交历史的时候,比较方便。 –date-order 选项导致有多个分支同显示的时候,提交按照时间戳顺序显示,最新的提交显示在最上面,在多个分支上同时进行开发的时候,比较方便。

ChangeLog

在项目中经常需要查看一段时间内的所有修改记录

cid=`git rev-parse --short HEAD`
git fetch origin
git lgm ${cid}..origin/${branch}

Filename too long

git有可以创建4096长度的文件名,然而在windows最多是260,因为git用了旧版本的windows api, 用如下配置解决此问题。

git config --global core.longpaths true

删除已经 add 的文件

# 不删除物理文件仅从 git cache 中删除 下次提交时从本地库中删除
git rm --cached "file-path"
# 删除 git cache 中的文件 且 删除工作区中的文件
git rm --f "file-path"

撤消放入缓存区(Index区)的修改

修改或新增的文件通过 git add 加入缓存区之后


GIT 在本地有三个重要的区域概念

  1. 工作区
  2. 暂存区
  3. 本地库

工作区 -> 暂存区

git add filename

暂存区 -> 工作区

撤出一个文件
git reset HEAD filename

暂存区 -> 本地库

git commit -m "xxx"
git commit --amend (对刚才的提交注释进行修改,不产生新的commit-id)

本地库 -> 暂存区

  • 回退一个版本: git reset --soft HEAD~1

本地库 -> 工作区

  • 回退一个版本: git reset HEAD^
  • 回退多个版本: git reset HEAD~n
  • 回退清暂存区: git reset --mixed HEAD~1 (默认参数)
  • 回退双清 : git reset --hard HEAD~1 (重置本地HEAD指针,存置暂存区,工作区代码回退)

取某个文件的指定版本

git checkout commit-id file-path

查看指定文件的提交记录

# 如果该文件存在当前分支
git lg file-path
# 如果该文件不存在于当前分支
git lg -- file-path

查看 Commit 所在的分支

git branch --contains commitId

支付宝打赏 微信打赏

您的打赏是对我最大的鼓励!

linzhanyu


Linux, VIM, OpenGL, OpenCL.

Python, C++, C#, ML.

相看莫相笑,同是竹林人。