git系统学习
git命令行
usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
[--config-env=<name>=<envvar>] <command> [<args>]
These are common Git commands used in various situations:
start a working area (see also: git help tutorial)
clone Clone a repository into a new directory
init Create an empty Git repository or reinitialize an existing one
work on the current change (see also: git help everyday)
add Add file contents to the index
mv Move or rename a file, a directory, or a symlink
restore Restore working tree files
rm Remove files from the working tree and from the index
examine the history and state (see also: git help revisions)
bisect Use binary search to find the commit that introduced a bug
diff Show changes between commits, commit and working tree, etc
grep Print lines matching a pattern
log Show commit logs
show Show various types of objects
status Show the working tree status
grow, mark and tweak your common history
branch List, create, or delete branches
commit Record changes to the repository
merge Join two or more development histories together
rebase Reapply commits on top of another base tip
reset Reset current HEAD to the specified state
switch Switch branches
tag Create, list, delete or verify a tag object signed with GPG
collaborate (see also: git help workflows)
fetch Download objects and refs from another repository
pull Fetch from and integrate with another repository or a local branch
push Update remote refs along with associated objects
git命令 | 含义 |
---|---|
add | 添加修改的文件,如果改的比较多用 “.” |
bisect | 使用二进制搜索来查找引入bug的提交 |
branch | 列出、创建或删除分支 |
checkout | 命令用于在不同的分支之间切换、恢复文件、创建新分支等操作。git2.23以后引入了 git switch 和 git restore 命令 |
clone | 将存储库克隆到新目录中,从服务器下载代码用的 |
commit | 记录对存储库的更改 |
diff | 显示提交之间的变化,提交和工作树等 |
fetch | 从另一个存储库下载对象和引用 |
grep | 打印与图案匹配的行 |
init | 创建一个空的Git存储库或重新初始化一个现有的Git存储库 |
log | 显示提交日志 |
merge | 将两个或多个发展历史连接在一起 |
mv | 移动或重命名文件、目录或符号链接 |
pull | 从另一个存储库或本地分支获取并与之集成,下载新的代码 |
push | 更新远程引用和相关对象更新远程引用和相关对象,提交代码 |
rebase | 在另一个基本提示之上重新应用提交 |
reset | 将当前HEAD重置为指定状态 |
rm | 从工作树和索引中删除文件 |
show | 展示各种类型的对象 |
status | 显示工作树状态 |
tag | 创建、列出、删除或验证使用GPG签名的标签对象 |
restore | 恢复工作树文件 |
switch | 切换分支 |
上面是部分的命令,想要得到完成的命令列表可以使用git help -all
命令。
获取git 版本号
git --version
创建初始版本库
创建git库
新建一个新的文件夹进入后输入
git init
创建一个.git
的隐藏目录
初始化用户名和密码
然后创建用户名和邮箱
git config --global user.name "用户名"
git config --global user. Email "邮箱"
查看用户名和邮箱
git config --list
在最下面就可以看到。
修改用户名和密码
git config user.name 修改后的用户名
git config user. email 修改后的邮箱
将文件添加到版本库中
在git库中新建一个文件夹里面存放一个main.cpp的文件。
git add . //将本目录下所有修改的文件添加到库中
git status //查看git状态
这里就说已经添加到库中了。这里只是暂存到库中,还没有正式的提交,正式提交使用commit
这个命令,这个命令是需要编写提交log的。add
这个只是一个中间暂存文件,如果确认修改好了,就可以提交了,要不然提交的过于频繁。
删除暂存文件
目前暂存库中有两个文件,一个是C_add.cpp一个是main.cpp我想删除C_add.cpp
git rm --cached .\src\C_add.cpp
可以使用rm
命令--cached
这是是子命令,缓存的意思,意思是删除缓存中的文件。
这里只是删除了暂存库中的文件,本地文件并没有删除。文件中的内容也不会被改动。
提交代码
git commit -m "新建项目"
需要注意的是-m
和后面的log必须写
再看一下git状态
刚才暂存的文件已经提交了。
查看提交信息
git log
条目按照从新到最老的顺序罗列出来了。
每个条目都有提交作者的名字,和email地址,提交日期,变更的日志信息和提交的内部识别码。
其中作者名字和email地址就是在初始化git库的时候设置的。
查看更加详细的信息
git show 8dca406b7b795cdb8cc89b482c69596f18527e10
8dca406b7b795cdb8cc89b482c69596f18527e10
这个就是git内部识别码
如果直接git show
输出的就是最近一次的提交信息。
查看提交差异
git diff 8dca406b7b795cdb8cc89b482c69596f18527e10 bcda568437100cf99a9d4ccf5ce2d100c926f58e
需要注意的是diff后面的识别码旧的识别码在前,新的识别码在后面
绿色的加号后面就是修改的内容。
版本库内文件的删除和重命名
查看库里有那些文件
git ls-files
删除库里的文件
我要删除C_add.cpp
git rm ./src/C_add.cpp
git commit -m "删除了C_add.cpp"
./src/C_add.cpp
这个参数就是通过git ls-files
查看到的。
需要注意的是,删除库中的文件,本地文件也会被删除掉。删除玩还需要commit
提交一下代码。
重命名库里的文件
最简单的方式。
git mv .\src\files.cpp .\src\FFiles.cpp
但是任然要实行 commit命令。
这样本地文件就会被重命名。
重命名库里的文件通常思路就是:
- 重命名本地文件
- 然后删除库里的文件
- 最后提交更新的文件
mv .\src\myadd.cpp .\src\files.cpp
git rm .\src\myadd.cpp
git add .
git commit -m "add.cpp to files.cpp"
打标签
git tag -m "version 1.0.0" V1.0 42b0a2923a2879cafd220c7274cfd89ee70af174
“version 1.0.0” 这个参数是标签log, V1.0是版本号。
查看标签
git tag
配置文件
.git/config //位置在下载代码目录下的 .git 目录下
~/.gitconfig // linux系统在Home下, windows系统在C盘用户目录下。
创建分支
理论上分支的名字是任意的,默认分支是master,大多数开发者在这个分支上保持版本中最强大和最可靠的开发线。
为了支持可扩展性和分类管理组织,可以创建一个带层次的分支名。
例如:
- 修复bug的分支可以创建
bug/001
bug/pr-123
等 - 增加新功能可以创建
newFunc/qa002
这样看到分支名称就可以知道这个分支是干什么的。
分支名不能用的字符:
- 不能以
/
结尾,但是可以出现在中间 - 分支名不能
-
开头 - 以斜杠分割的组件不能以
.
开头(./
是当前目录的意思,不能连着用) - 分支名任何地方都不能出现
..
- 不能出现任何空格或其他空字符
- 不能包含
~ ^ : ? * [
,因为git支持通配符这些都不能用。 - ASCII码,小于八进制的
\040
和\177
不能使用
git branch bug/pr-001 630f582d51f4e8cac3f822053b7dca0c9a619db7 // bug/pr-001 分支名,后面的是ID
查看分支
git branch 是查看分支的命令
git show-branch
比 git branch
显示的更加详细。
git show-branch bug/pr-001
查看bug/pr-001的提交记录。
切换分支
两种方式:
当前分支是mater
,新版本的git使用
git switch bug/pr-001
老版本的git使用:
git checkout master
创建并切换分支
git switch -C bug/pr-003 630f582d51f4e8cac3f822053b7dca0c9a619db7
git checkout -b bug/pr-004 630f582d51f4e8cac3f822053b7dca0c9a619db7
完全等价与
git branch bug/pr-003 630f582d51f4e8cac3f822053b7dca0c9a619db7
git switch(checkout) bug/pr-003
删除分支
不能删除当前使用的分支。
删除当前的分支将导致git无法确定工作目录树应该是什么样子的。
git branch -d bug/pr-004
diff
git diff 命令进行树的比较时2可以通过提交名,分支名,或者标签名。
git diff
会显示当前目录中那些文件进行了修改。
如果这条命令有输出,说明工作目录中已经编辑或修改的东西没有暂存。
git diff --cached
git diff --cached .\src\main.cpp //查看单个文件的
查看暂存文件的差异。如果提交了代码这个命令输出就是空的。
git diff master .\src\main.cpp
我当前的使用的分支是bug/pr-001
我想与master的文件进行比较
路径显示的git diff
~5是最近5次提交
git diff --stat master~5 master
如果只想看src文件下的变化
git diff --stat master~5 master src
只想看main.cpp的差异
git diff --stat master~5 master .\src\main.cpp
合并
git 支持同时合并三个四个或多个分支,但是大多数情况下一次只合并两个分支。
当一个分支修改与另外一个分支不冲突的时候,git会计算合并结果,并创建一个新的提交代表新的统一状态。当分支发生冲突的时候,git并不解决 冲突,这通常出现在多人对同一文件进行修改,git会把这种争议的文件在索引中定义为“未合并”。留给开发人员处理。
合并 bug/pr-002
git merge bug/pr-002
更改提交
作为一般原则,只要没有其他开发人员已经获得你的版本库的副本,你就可以自由的修改和完善版本库提交历史记录。或者说,只要没人有版本库中某个分支的副本,你就可以修改该分支。
如果一个分支已经公开了,并且可能已经存在与其他版本库中,那就不应该重写,修改或更改该分支的任何部分。
使用git reset
git reset命令会把版本库和工作目录改变为已知状态。具体而言git reset调整HEAD引用指向给定的提交,默认情况下还会更新索引以匹配该提交。git reset命令也可以修改工作目录以呈现给定提交代表的项目修订版本。
可以把git reset当成“破坏性的”,因此可以覆盖并销毁工作目录中的修改。事实上数据可能丢失,即使备份了文件,也可能无法恢复。此命令的重点为HEAD,索引和工作目录建立与恢复已知的状态。
git reset命令有三个主要选项: --soft, --mixed, --hard
选项 | HEAD | 索引 | 工作目录 |
---|---|---|---|
–soft | 是 | 否 | 否 |
–mixed | 是 | 是 | 否 |
–hard | 是 | 是 | 是 |