kingfeng's Notes

git 基础

对一直以来使用的Git命令进行一下梳理总结,方便以后使用的时候查找;

Git特点

1、分布式VC;
2、客户端都具有代码仓库的完整镜像,每一次提取操作,都是对代码仓库的完整备份;
3、近乎所有的操作都是在本地执行;

几个最常用的

1
2
3
4
5
6
7
git config --list  // 查看git 配置列表(类似于windows下面的set命令);
git xxx --help // 查看xxx 操作的官方说明文档
history // 查看近期使用的命令, 专治记不住
git log // 显示提交日志列表, 按q enter键退出
git log -n 1 // 查看最近的一条提交日志
git log --pretty=oneline //使用单行展示log日志
git status // 查看项目中文件或目录的版本状态

三种状态切换

a.工作区
b.暂存区
c.版本库

a->b

1
2
3
git add xxx    // xxx为具体的文件(夹)路径
git add . // 添加新建和修改改动
git add -A // 添加所有改动

b->a

1
2
3
4
5
6
7
8
9
10
git reset HEAD <file>        // <file>可以是文件或者文件夹路径 
// 如:
git reset HEAD a.json // 把a.json 文件回到到 unstage 状态
git reset HEAD src/ // 把src下面的所有文件从暂存区回退到工作区


git checkout -- file // 注意 "--" 后面要有空格 直接丢弃工作区, 要谨慎使用
git checkout // 用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”

git checkout . // 本地所有修改的,没有提交的,都返回到原来的状态;

b->c

1
2
3
4
5
git commit -m ""            // 把处于暂存区的文件提交到版本库, xxx 为提交说明
git commit --amend -m "xxx" // 修改提交说明信息xxx,不需要打开vim窗口
git commit --amend // 会打开vim窗口中进行修改
git log -n 1 // 查看刚刚提交的这条日志信息
git log -n 1 --stat // 查看最近一次的commit都更改了哪些文件

c->b

1
2
3
git reset commit_id     // 如果想把最近一次的提交移除, 该commit_id 是上一次提交的commit_id。   代码提交不会撤销,可以使用  git commit 重新提交

git reset --hard commit_id // 撤销commit, 代码提交也会移除

别名Alias

我们可以用git造一些更简单的命令,也更容易理解。

1
git config --global alias.别名 '指定代码'

比如:上面我们想把提交日志列表一行显示,命令太长,不好记, 我们可以直接起个别名 log2

1
git config --global alias.log2 'log --pretty=oneline'

以后我们想单行显示log列表时可以使用 git log2 就能达到效果。
我们可以通过git config --list 在配置列表中查看自己设置的命令别名;

再举一个例子:
取消暂存文件;git config --global alias.unstage 'reset HEAD --'
我们就可以直接使用 git unstage a.txt 就可以把a.txt 再回退到 工作区了。

在磁盘用户目录下,有一个从.gitconfig 文件,里面的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[user]
name = ******
email = ******
[core]
autocrlf = false
pager = less
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[alias]
log2 = log --pretty=oneline
unstage = reset HEAD --

git pull & git fetch

前者 <==> 后者 + git merge origin/master
后者只取,不合并。

.gitignore忽略文件

我们可以通过cat .gitignore 来列出要忽略的文件模式;

文件.gitignore 格式规范如下:
1、所有空行或者以#开头的行都会被Git忽略;
2、可以使用标准的glob模式匹配;
3、匹配模式最后跟反斜杠(/) 说明要忽略的是目录;
4、要忽略指定模式以外的文件或目录,可以在模式前加上感叹号取反;

1
2
3
4
5
6
*.wpy        // 忽略说有以.wpy 结尾的文件
!app.wpy // app.wpy 除外
build/ // 忽略build目录下的所有文件;
/TODO // 仅仅忽略项目根目录下的TODO文件,不包括subdir/TODO
doc/*.txt // 会忽略 doc/a.txt 但不会 doc/server/a.txt
doc/**/*.txt //忽略所有.txt 文件在doc/ 目录下。

解决.gitignore 文件忽略不起作用

使用下面方式:

1
2
3
4
git rm -f --cached -r .idea     # 把.idea 文件夹从git追踪中排除; 
#也可以使用 git rm -r --cached . 删除本地缓存,让文件改为未track
git add .
git commit -m 'modify .gitignore'

看一下执行效果:

1
2
3
4
5
6
7
8
9
F:platform-xxx>git rm -f --cached -r .idea
rm '.idea/caches/build_file_checksums.ser'
rm '.idea//ProjcodeStylesect.xml'
rm '.idea/dbnavigator.xml'
rm '.idea/gradle.xml'
rm '.idea/misc.xml'
rm '.idea/runConfigurations.xml'
rm '.idea/sonarlint/issuestore/0/2/02e99b96f9ad605bf6cff133c88f60a9008cebd9'
rm '.idea/sonarlint/issuestore/0/4/04cc233f9221dea906f58e66f4fa36f1d447f25c'

git 合并多个commit

1
git rebase -i HEAD~3    // 合并最近的三个commit

假设最近三次的提交是c1,c2,c3 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pick 0d642a5 c1
pick c58b4b8 c2
pick 9fab1f3 c3

# Rebase bf7a33d..9fab1f3 onto bf7a33d (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit // 融入先前的commit, 我们想只保留一个commit,那就对 c2,c3 的pick 修改为squash(或s)
# f, fixup = like "squash", but discard this commit's log message // 丢弃某次提交的日志信息
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
~
~

如果我们想把后面两次commit融入c1提交, 我们就对c2,c3 的提交进行修改,pick修改为 squash或者 直接为s, 然后保存。调整一下commit日志再保存就可以了。贼方便;

其它

关于分支模型, 标签管理等高级功能后续会继续补充…

参考:
1、https://git-scm.com/book/en/v2
2、https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

您的支持将鼓励我继续创作