Git是什么
Git是目前世界上最先进的一款分布式版本控制系统,可以对我们的代码进行很好的版本管理。全球最大同性交流网站(Github)是程序员必逛的网站,学会使用Git是一个合格成熟的程序员必须掌握的技能之一,本篇文章主要介绍了Git的一个基本原理和常用的使用技巧。
如果使用Window,有一个Git版本控制客户端TortoiseGit非常好用,特别是像我以前使用惯了TortoiseSvn的人来说。
工具推荐:下载地址。
Mac下还没找到特别好用的,暂时就先不推荐了^_^
Git的原理
Git的代码管理原理可以简化如下图。

1、我们在工作目录编辑代码,当觉得OK的时候我们可以git add files
将我们的代码提交大暂存区。
2、然后继续编辑代码,如果没有问题我们可以将一个功能或者特性git commit
提交到版本中,如果发现有问题我们可以git reset
回退代码。
3、如果测试没问题,我们可以将代码提交到远程仓库。
提交规范
1 | feat:新功能 |
基本操作
初始化一个本地仓库。
1
git init
添加远程仓库。有时候你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且将本地仓库同步到远程Git仓库。
1
git remote add origin git@github.com:HDMLOVE/Git_test.git
查看分支
1
2
3
4
5
6
7
8# 查看本地分支
git branch
# 查看远程分支
git branch -av
# 查看当前分支远程地址
git remote -v下载(克隆)远程仓库代码
1
git clone git@github.com:Passion1121/Git_test.git
查看代码提交记录
1
2
3
4
5# 查看提交历史记录
git log --graph
# 查看代码详细修改
git show HEAD(commitid)切换/创建分支
1
2
3
4
5# 切换到Test分支,本地分支不存在该分支,则会自动从远端仓库下载分支代码。
git checkout Test
# 从master分支创建新的分支Git_test并切换到Git_test分支。
git checkout -b Git_test master提交代码文件
1
2
3
4
5
6# 提交某个<file>文件到暂存区。
git add <file>
# 提交当前目录下已经跟踪到的所有文件到暂存区
git add .
git add -u配置相关信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26# 查看当前用户全局(global)配置信息
git config --global --list
# 查看当前仓库配置信息
git config --local --list
# git status 没有颜色区分提示问题
# Git显示颜色设置,也可以对其进行单独配置。
git config --global color.ui true
# git diff 中文显示乱码问题
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在检出代码时不要自动将行尾转换为CRLF(Windows风格的换行符),而是保留原来的LF(Unix风格的换行符)
git config --global core.autocrlf false
# 配置用户名、邮箱等信息
git config --global user.name "张三"
git config --global user.email "helloworl@outlook.com"
# 设置完毕后可以通过下面命令来修正本次提交所用的用户身份信息
git commit --amend --reset-author
配置免密提交
1
2
3
4# 生成ssh key
ssh-keygen -t rsa -C "helloworld@sangfor.com" -b 4096
# 上传到git服务器上或者添加ssh key
cat ~/.ssh/id_rsa.pub修改某个commit
1
2
3
4
5
6
7
8# 修改最近的一次的commit信息
git rebase --amend
# 显示最近的5次修改
git rebase -i HEAD~5
# 修改完成后,强制推送到远程分支 (慎用,会覆盖代码,小心找不回来!!!)
git push origin <master> --force <==> git push master -f删除分支
当我们不需要某个分支的时候我们可以使用以下命令进行分支删除,但是当我们处于该分支的时候是无法删除的,所以我们第一步应该是先使用
git checkout <branch>
切换到一个其他的分支。1
2
3# 删除本地分支
git branch -d <branch> # 删除分支(本地还有代码没推送到本地分支时候是无法删除的)
git branch -D <branch> # 强制删除分支(本地代码没有推送到远程也可以删除)分支重命名
1
2# 将分支old_branch重命名为new_branch
git branch -m old_branch new_branch仓库太大下载单个分支。
当您遇到 Git 仓库太大的情况,只想下载单个分支,可以使用 Git 的
clone
命令配合一些特定的选项来实现。1
2
3
4
5
6
7# 分批拉取,避免失败
git fetch --depth 500
# 浅克隆拉去指定分支代码
git clone --depth 1 --branch feature-branch https://github.com/example/example-repo.git
# 浅克隆:--depth 1 参数来创建一个浅克隆。这会克隆仓库的最近一次提交,从而减少数据量。
# 指定分支:使用 --branch 参数来指定您想要克隆的分支。更新或者恢复某一个文件或者目录
1
2
3
4
5
6
7
8
9# 可以直接使用命令对其进程恢复,或者先删除掉再使用该命令进行恢复
git checkout -- test.c
git checkout -- testdir
# 撤销暂存区的文件,git add 之后想要撤销,恢复到某个提交的版本(HEAD)
git reset --hard HEAD
# 撤销所有则执行如下命令
git reset查看修改比较
1
2
3
4
5工作区(work dict)和暂存区(stage)的比较
git diff
暂存区(stage)和分支(所在)的比较
git diff --cache忽略提交文件和类型
1
2
3
4
5
6项目中添加文件可以忽略不需要提交的文件和类型
.gitignore
内容为:
*.sh
*.d
*.o统计代码行数
1
2
3
4
5统计特定时间范围内的代码行数
git log --author="AuthorName" --since="2022-01-01" --until="2022-12-31" --pretty=tformat: --numstat
统计代码量
git log --author="mengfanxiao" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -暂时保存当前的修改而不(commit)提交,这种一般在需要切换分支的时候非常有用,有时候写了一半的代码,都还不能编译通过的,就被叫去改另一个分支的bug了。Git 会将当前工作目录和暂存区的修改保存为一条栈记录,以便稍后恢复。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29保存当前的代码(紧保存跟踪的文件)
git stash
或
git stash save “修改的信息"
或
保存未跟踪的文件
git stash -u 或 --include-untracked
git stash save -u "备注信息"
弹出(恢复)第一个保存的代码
git stash pop
查看当前暂存区的stash的内容
git stash list
恢复应用第1个
git stash apply stash@{0}
查看 stash 的内容
git stash show
git stash show stash@
删除最近一次的 stash
git stash drop
删除指定的 stash
git stash drop stash@
删除所有的 stash
git stash clear
常见问题
权限问题导致无法clone代码
linux普通用户无法使用git clone 克隆代码问题,一直报口令认证失败,公钥等其他问题均已排查过。
1 | # 解决方案:修改tty权限。 |
window 提示告警
Git window 下提示告警:Windows git “warning: LF will be replaced by CRLF”, is that warning tail backward?
解决方法:
1 | git config --global core.autocrlf false |