git使用方法详解(适合新手)
设置用户信息
用户的名称和邮箱在提交更改时用于标识。
- 全局配置: 所有git仓库默认的配置,在当前git仓库参数为设置时的默认值。通过
--global
设置全局配置。 - 非全局配置: 仅在当前仓库有效。
设置用户名
命令格式
git config --global user.name "<username>"
<>
表示要自行替换的部分,<>中是提示词,例如这里表示你需要<username>
这一整体替换成你想设置的用户名
示例
git config --global user.name "user1"
设置邮箱
命令格式
git config --global user.email "<email>"
示例
git config --global user.email "email@qq.com" #示例1
查看的用户名
git config user.name
git config --global user.name
查看email
git config user.email
git config --global user.email
名词
提交别名
git中我们每个提交都会有一个唯一的哈希值,但是哈希值用起来并不是很方便,因此就会用一些名词来表示一个版本,接下来进行简要的介绍:
HEAD和HEAD~0
表示当前最新的一次提交。
HEAD~1和HEAD^
表示最新提交的上一次提交。
HEAD~n和HEAD^^……
表示最新提交的上n次提交。
工作区和暂存区
工作区
当前进行工作,开发等操作的区域。
暂存区
在本地暂时存放若干个提交的区域。
远程仓库
将暂存区的提交推送到云端的云端区域。
操作集合
初始化
当我们需要对一个项目进行控制时,我们需要在项目的目录下进行初始化操作。它会生成一个.git
的目录用来存放git仓库的文件。每个项目的git仓库都在它的根路径的.git目录中。
git init
提交更改
提交更改,每个更改都会有一个唯一的哈希值,用于对更改进行唯一标识。提交信息用于对提交进行标注,不能为空
git commit -m "<提交信息>"
查看
当前状态
git status
提交的内容
命令格式
git show [<提交/哈希值>] # 默认为HEAD
示例
git show HEAD
git show 9f030d1bf10c4a211237d4cd99755c44f6a22a2a
提交历史
git log [<branch>]
git log --graph # 图像化显示
git log --oneline # 单行格式显示
git log --all # 查看所有的记录,在使用less做分页器的情况下,用不用该参数效果相同
git log --since="2022-01-01" --until="2022-06-30"
git log --author="John Doe"
git log --follow -- <file> # 查看文件的修改历史,--follow可以跟踪到文件的重命名和移动操作,以便在文件重命名或移动后仍然显示文件的完整修改历史。
中括号[]
中的参数表示可选参数,可以不指定
删除
硬删除
标记为删除,并删除本地文件
git rm <file>
软删除
标记为删除,但不删除本地文件
git rm --cached <文件路径>
比较
查看不同提交之间的区别
命令格式
git diff # 比较当前工作区和最新提交的区别
git diff <提交1/哈希值> <提交2/哈希值>
选项介绍
无选项
$ git diff HEAD^ HEAD
diff --git a/Markdown/git使用指南.md b/Markdown/git使用指南.md
index 4e3402d..297badd 100644
--- a/Markdown/git使用指南.md
+++ b/Markdown/git使用指南.md
diff --git a/Markdown/git使用指南.md b/Markdown/git使用指南.md
这一行表示在文件Markdown/git使用指南.md
中有变更。文件在两个提交的路径相同(a/Markdown/git使用指南.md
和b/Markdown/git使用指南.md
),因此对比的文件是同一个文件,但来自不同的提交。index 4e3402d..297badd 100644
index 4e3402d..297badd
是 Git 用来表示两个版本文件的哈希值。4e3402d
是第一个提交中该文件的哈希值,297badd
是第二个提交中该文件的哈希值。100644
是文件的权限模式,表示这是一个普通文件。--- a/Markdown/git使用指南.md
这一行中的---
表示“旧版本”的文件,这里是来自9f030d1bf10c4a211237d4cd99755c44f6a22a2a
提交的文件版本。+++ b/Markdown/git使用指南.md
这一行中的+++
表示“新版本”的文件,这里是来自fb19fa78461ff7954c43489724977a5935c731d1
提交的文件版本。
–name-only
只显示文件名称
git diff --name-only HEAD^ HEAD
–name-status
显示文件修改的状态。D表示删除,A表示添加,M表示更改
git diff --name-status HEAD^ HEAD
回滚
restore
我们修改文件后,可能感觉修改的有问题,希望将该文件回滚到最新提交中的状态。
git restore <file>
reset
希望恢复到分支中的某处提交。
git log -- graph # 查看要恢复到提交的哈希值
# 恢复
git reset --soft <提交/哈希值> # 只将HEAD重置,工作区和暂存区的更改保持不变
git reset --mixed <提交/哈希值> # (默认)重置HEAD和暂存区,工作区的更改保持不变
git reset --hard <提交/哈希值> # 重置HEAD、暂存区、工作区,所有更改都会丢失
暂存
我们需要切换分支,但不想将修改提交,而是暂存起来。
git stash # 暂存
git stash list # 查看暂存
git stash apply stash@{1} # 恢复暂存的更改到工作区
git stash drop stash@{1} # 删除暂存的更改
恢复
需要恢复重置操作等意外操作。
[root@VM-63-236-tencentos study]# git reflog # 查看需要恢复到的位置的哈希值,比如fb19fa7
76a90bb (HEAD -> dev, origin/dev) HEAD@{0}: reset: moving to HEAD
76a90bb (HEAD -> dev, origin/dev) HEAD@{1}: merge origin/dev: Fast-forward
fb19fa7 HEAD@{2}: commit: 日常更新
9f030d1 HEAD@{3}: merge origin/dev: Fast-forward
a7357a0 HEAD@{4}: commit (merge): Merge remote-tracking branch 'origin/dev' into dev
8a1db9a HEAD@{5}: commit: 日常更新
8f29ad4 HEAD@{6}: commit: 日常更新
c7976cc HEAD@{7}: checkout: moving from master to dev
bbb8066 HEAD@{8}: clone: from github.com:memories198/study.git
[root@VM-63-236-tencentos study]# git reset --hard fb19fa7 # 恢复到该哈希值处
远程仓库
在远程仓库配置ssh密钥
配置远程仓库之前,我们需要在个人账户中配置ssh密钥。
添加远程仓库
仓库地址(url)是一个较长的字符串,使用起来不方便,因此需要给它起一个别名,别名一般起origin,后续对仓库的操作也是使用这个别名进行。一般在本地有项目时使用
git remote add <别名> <url>
查看远程仓库
命令
git remote -v
输出解析
[root@VM-63-236-tencentos study]# git remote -v
origin git@github.com:memories198/study.git (fetch)
origin git@github.com:memories198/study.git (push)
fetch表示你具有获取远程仓库更改的权限,push表示你具有向远程仓库提交更改的权限
删除远程仓库
git remote rm <别名>
从远程仓库获取项目
clone
用于在从远程仓库把项目完整的拉取下来。一般在我们第一次获取项目
时使用。一般在本地没有项目时使用
git clone <项目地址>
pull
获取远程仓库中所有的更新,并自动合并到当前分支。它是fetch和merge的组合。
git pull <别名> <分支>
fetch
获取远程仓库的所有更新,并自动合并到对应的分支。
git fetch <别名>
merge
将远程仓库上的所有更新内容(假设已经被推送到服务器了)合并到你的当前分支。
git merge <别名>/<分支>
聚合合并
将另一个分支的所有更改合并到当前分支但不把它的提交合并到当前分支
。
git merge --squash <branch-name>
推送提交到远程仓库
git push origin <branch-name>