Git 安装与配置
查看 git 版本
git--version
配置 git:config
配置 git 使用
git config
命令。默认情况下必须配置
user.name
和
user.email
用以标识谁提交的代码。
默认情况下
git config
会为当前 git 仓库进行配置,配置文件存放在
git仓库/.git/config
文件中。
如下代码会为当前仓库配置
user.name
:
git config user.name 你的名字
配置 git 的全局属性需要加上
--global
,配置文件存放在
用户主目录/.gitconfig
文件中。
如下命令会为当前用户的所有仓库配置
user.email
:
git config --global user.email 你的邮箱
取消配置
使用
--unset
可以取消已经添加的配置。
如下的命令将取消上面设置的
user.name
:
git config --unset user.name
如果要删除全局的属性,同样要添加
--global
选项。
显示配置信息
可以通过
config
的
--list
来显示当前的配置信息。以下命令将显示当前 git 仓库的配置信息,由于全局配置也在当前仓库中生效,所以也会显示全局配置信息。
git config --list
查看全局配置信息:
git config --global--list
配置别名
可以使用
alias
给 git 命令设置一个别名,后续可以使用别名来取代原本的指令。例如,为
status
命令配置一个
st
的别名:
git config --global alias.st status
后续就可以使用如下别名来替代
git status
命令:
git st
使用别名可以设置简化一个复杂的 git 命令,例如下面设置的别名可以简化 log 命令:
git config --global alias.mylog "log --color --graph --pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset%s%Cgreen(%cr)%C(bold blue)<%an>%Creset' --abbrev-commit"
后续可以使用
git mylog
来替代
git log
命令,以显示更多的提交内容和颜色支持。
创建 git 仓库
使用 init 命令
以下命令将在当前目录中创建一个 git 本地仓库:
git init
使用 clone 命令
git clone
命令用于 clone 一个远程仓库到本地:
git clone https://github.com/Lee-swifter/slide-switch.git
git clone
后面跟着远程仓库的地址。
无论使用哪种方式创建 git 仓库,都会在该仓库目录下生成一个 .git 的隐藏文件夹,该文件夹中包含所有的版本记录和配置信息,默认不要对这个文件夹进行手动修改。
git 的三个区域
Git本地有三个工作区域:工作区、暂存区(Stage/Index)、本地仓库。如果在加上远程的 git 仓库就可以分为四个工作区域:
- 工作区:就是开发者平时工作、修改代码的区域;
- 暂存区:用于临时存放对文件的改动,暂存区用于直接跟工作区的文件进行交互,工作区文件的提交或者回滚首选都是通过暂存区。事实上它只是一个文件,保存即将提交的文件列表信息,一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index);
- 本地仓库:就是安全存放数据的位置,这里面有你提交的所有版本的数据。其中 HEAD 指向最新放入仓库的版本;
- 远程仓库:与本地仓库相连接的另一台机器上的 git 仓库,用于代码交换。
本地仓库常用命令
显示当前仓库状态(git status)
git status
此命令将显示工作区、暂存区、以及对应的远程仓库的同步状态:
- Changes to be committed: 显示提交到暂存区,但没有提交到版本库的文件;
- Changes not staged for commit: 显示工作区中修改的文件,还没有提交到暂存区的文件;
将修改从工作区提交到暂存区(git add / git rm)
gitadd[file]
将指定文件的修改从工作区提交到暂存区,也可以使用下面的命令一次性提交所有文件的修改:
gitadd.
如果文件在工作区被删除,那么将这个删除提交到暂存区,还可以使用
git rm
命令:
gitrm[file]
将修改从暂存区提交到版本库(git commit)
git commit [file_name]-m"commit message"
以上命令将指定文件的修改提交到版本库,不指定 file_name 时将提交所有暂存区的修改。
使用 commit 命令必须为提交添加一个提交信息,使用
-m
参数指定后面的字符串为此提交的信息。也可以不使用
-m
参数,此时
commit
命令会跳转到 vim 编辑中让你输入提交信息。
如果发现提交信息写错了,可以使用以下命令对刚刚 commit 的提交信息进行修改:
git commit --amend-m"new commit message"
同样也可以不使用
-m
参数,跳转到文本编辑器中修改提交信息。此命令实际上是修改 HEAD 指针指向的 commit 的信息。
查看提交记录(git log)
对于所有提交到版本库中的 commit,可以使用如下命令查看提交记录:
git log
每一个 commit 都对应了一个 commit id,此 id 是一个 40 位的 16进制的 SHA-1 散列编码,用来唯一标记一个 commit。
- 可以添加
--pretty=oneline
参数来单行显示一个提交; - 可以添加
--graph
参数为 commit 记录添加图形化显示,在显示分支情况时特别有用; - 可以添加
--abbrev-commit
参数来缩减要显示的提交记录;
git log --pretty=oneline
git log --graph--pretty=oneline
git log --graph--pretty=oneline --abbrev-commit
关于
git log
的更多参数,可以使用以下命令来获取:
git log --help
此命令会打开一个网页,所有 git 的命令后面都可以使用
--help
参数来显示其使用文档。
也可以使用如下命令来按照提交的用户显示提交记录:
git shortlog
查看 git 操作历史(git reflog)
git reflog
显示当前仓库的操作记录,以及相关的 commit id。可以通过这个命令查到某些已经被丢弃的 commit 的 id。
丢弃工作区的修改(git restore / git checkout – file)
可以使用下面的命令来丢弃在工作区的修改:
git restore [file]
此命令必须指定一个文件,将丢弃此文件的修改,文件将恢复到修改前的状态。
还有一个与 restore 具有相同作用的命令,如下:
git checkout -- [file]
此命令将丢弃该文件在工作区的修改,并让这个文件回到最近一次
git commit
或
git add
时的状态。
文件对比 (git diff)
在 git 中一般使用
git diff
命令来对比文件:
gitdiff[file]
这个命令比较文件在暂存区和工作区的差异,如果不指定 file,那么将显示所有文件在两个区域的差异。例如下面的命令将显示 readme.txt 这个文件,已写入暂存区和已经被修改但尚未写入暂存区的内容的区别:
gitdiff readme.txt
可以使用
--cached
或
--staged
选项,来显示暂存区和版本库中的差异:
gitdiff--cached[file]gitdiff--staged[file]
可以使用 HEAD 来比较工作区与版本库中的差异:
gitdiff HEAD [file]
如果不想看所有的差异内容,则可以添加
--stat
来简化
git diff
的输出:
gitdiff--stat HEAD [file]
比较两个 commit 之间的差异:
gitdiff[commit_id_1]...[commit_id_2][file]
以上命令将比较
commit_id_1
和
commit_id_2
这两个提交之间的差异,此处的
commit_id
可以换成分支名或是 HEAD。
工作区的 (git stash)
可以将工作区未提交的内容先暂存起来:
git stash
暂存的工作区内容可以通过下面的命令查看:
git stash list
恢复工作区内容有两种方式:
- 使用
git stash apply
恢复,但是恢复后,stash
内容并不删除,你需要用git stash drop
来删除; - 另一种方式是用
git stash pop
,恢复的同时把stash
内容也删了;
远程仓库
创建 SSH key
一般的远程仓库如 GitHub、GitLab 等,与本地仓库之间的传输都是通过 SSH 加密的,因此在使用这些远程仓库之前需要先在设置 SSH。
以下命令将生成 SSH Key:
ssh-keygen -t rsa -C"[email protected]"
生成完成之后会在用户主目录下生成
.ssh
文件夹,在这两个文件夹中会有
id_rsa
和
id_rsa.pub
两个文件,这两个就是 SSH Key 的秘钥对,
id_rsa
是私钥,不能泄露出去,
id_rsa.pub
是公钥。
在生成 SSH 之后,需要将公钥的内容设置到远程仓库对应的位置。
添加远程仓库
git remote add origin https://github.com/Lee-swifter/demo-application.git
上面的命令将添加名为
origin
的远程仓库,
origin
后面跟的是这个远程仓库的地址。
一般情况下,都会默认远程仓库名为
origin
,但也可以指定其他名称。一个本地仓库也可以添加多个远程仓库,例如下面的命令为本地仓库添加了两个远程仓库:
git remote add github https://github.com/Lee-swifter/demo-application.git
git remote add gitee https://gitee.com/Lee-swifter/demo-application.git
显示当前远程库信息
git remote -v
删除已经绑定的远程仓库
git remote rm origin
以上命令将删除名称为
origin
的远程库。
推送分支到远程仓库
git push origin master
以上命令将推送 master 分支到远程仓库
拉取远程分支到本地
git checkout -b dev origin/dev
以上命令将从远程仓库拉取 dev 分支到本地。
关联本地分支和远程分支
git branch --set-upstream-to=origin/dev dev
以上命令将本地的 dev 分支与远程的 dev 分支进行关联。
分支相关命令
Git 中的分支其实更像是一个指针,默认情况下,会有两个指针,一个是 master 默认分支,一个是 HEAD,指向当前的分支。
显示当前分支
git branch
此命令显示当前仓库中的分支,其中前面有 * 号的是当前所在分支。可以使用 -r 或 -a 选项显示远程分支或所有分支:
git branch -r
创建分支
git branch <name>
此命令只是创建了一个分支,但并不会将当前分支切换到新分支上去。
切换分支
git switch <branch_name>
此命令将当前分支切换到指定的分支。也可以使用 checkout 来切换分支:
git checkout <branch_name>
创建并切换到新分支上
可以将上面的命令进行合并,使用一个命令创建分支并切换到新分支上:
git switch -c<branch_name>
git checkout -b<branch_name>
这两个命令的作用是相同的。
合并其他分支到当前分支
Git 中合并分支是个大学问,合并分支有三种方法,分别是
merge
,
rebase
,
cherry-pick
,这里先讲
merge
:
git merge <branch_name>
以上的命令会将指定的分支上的内容合并到当前的分支。使用
merge
合并分支又有三种模式:
- fast-forward
- no-ff
- squash
这三者之前的区别可以查看这篇文章:图解4种git合并分支方法
删除分支
git branch -d<branch_name>
此命令将会删除指定分支。如果分支上有没有合并的提交,Git 会提示使用
-D
选项。
分支管理策略
这里使用 廖雪峰官方网站中的分支管理策略 中的一张图来总结:
标签相关命令
标签总是和某个 commit 挂钩,可以理解为指向某个 commit 的指针。
显示所有标签
git tag
创建标签
git tag <tag_name>
在当前的提交上创建标签,标签名为后面的 name 指定。如果要在特定的 commit 上打标签,则可以使用如下命令:
git tag <tag_name>[commit_id]
上面的命令将在指定的
commit_id
上创建名为
tag_name
的标签。
还可以创建带有说明的标签,用
-a
指定标签名,
-m
指定说明文字:
git tag -a<tag_name>-m<message>[commit_id]
查看标签信息
git show <tag_name>
删除标签
git tag -d<tag_name>
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
推送标签到远程仓库
以下命令将推送指定标签到远程仓库:
git push origin <tag_name>
也可以一次性推送所有标签到远程仓库:
git push origin --tags
删除远程标签
首先要在本地删除指定标签:
git tag -d<tag_name>
然后推送删除到远程:
git push origin :refs/tags/<tag_name>
版权归原作者 李斯维 所有, 如有侵权,请联系我们删除。