基本概念
生成ssh
git --version # 查看git版本
git config [--config] user.name [yourname] #查看[修改]全局用户名
git config [--config] user.email [yourname] #查看[修改]全局用户邮箱
#本地git的用户名和邮箱尽量和github保持一致。如果邮箱不一致,会导致github无法统计contributions
git clone <远程仓库地址> #克隆仓库代码到本地
git remote add <远程仓库名> <远程仓库地址> #把远程仓库绑定到本地仓库,<远程仓库名>可自定义,常用origin
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 生成ssh密钥
ssh -T git@github.com #测试github连接
其中:
-t rsa
t 即 Type,指定了使用RSA
加密算法生成密钥,加密类型还有其他可惜类型,比如ed25519
ecdsa
-b 4096
指定密钥的位数(Bit-length),密钥位数越高,安全性越强,但生成和使用时可能略慢。默认 RSA 密钥长度为 3072 位。-C "your_email@example.com"
添加注释(Comment),用于标识密钥的用途或所有者。通常用邮箱作为注释,方便识别密钥归属,注释会附加在生成的公钥文件末尾。
执行后会生成公钥和私钥,分别默认保存在/.ssh/id_rsa
和/.ssh/id_rsa.pub
。公钥可分享给Git服务商,如在GitHub的 settings - SSH and GPG key页面,点击New SSH key,复制公钥的内容然后保存,然后可使用ssh -T git@github.com
测试连接。输入下面类似内容表示成功。
git status
显示文件的状态。选项:
-s
: --short,以简短格式输出-l
: --long,以长格式输出,这是默认的-b
: --branch,即使是简短格式,也输出分支信息-uno -unormal -uall
: 未追踪文件显示规则。默认为-uall
- no 显示未追踪的文件
- normal 显示未追踪的文件或文件夹
- all 显示未追踪的文件或文件夹,以及文件夹中的文件
简短形式下状态码的含义:
- '' :未修改的
- M :modified,修改过的
- T :文件类型已更改
- A :新增的
- D :删除
- R :重命名
- U :更新但未合并
当文件在 暂存区 和 工作目录 中均存在变更时,会显示双状态码(两列字符),其中第一列表示暂存区状态,第二列表示工作目前状态。
git add
将文件的修改添加至暂存区(Stage)。此命令不会将文件提交到版本库,只是为了下一步的提交做准备。
git add <文件名> #将单个文件添加到暂存区
git add . #将当前目录下的所有更改(包括新增、修改和删除)添加到暂存区
git add -p #交互式地添加文件的部分更改到暂存区
git commit
将暂存区的修改提交到本地版本库,形成一个新的提交(Commit)。
git commit -m "commit message" #提交暂存区的内容并附带提交信息
git commit --amend #修改上一次的提交信息,或将新的更改合并到上一次提交
git pull
从远程获取代码并合并本地的版本。其实就是 git fetch 和 git merge 的简写。
git pull <远程仓库名> <分支名> #拉取远程主机的指定分支
git pull origin master:brantest #将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git push
将本地版本库的提交推送到远程版本库(如 GitHub、GitLab 等)并合并。
git push <远程主机名> <本地分支名>:<远程分支名> #如果本地分支名与远程分支名相同,则可以省略冒号
#下面两行命令是等效的,都是将本地主分支 main 的推送到远程的 main 分支
git push origin main
git push origin main:main
git checkout
用于切换分支、恢复文件、回到指定提交的历史版本。
git checkout <分支名> #切换到指定的分支。如果分支不存在,可以创建并切换到新分支
#切换分支
git checkout feature-branch #将当前的工作区切换到 feature-branch 分支上
git checkout - #切换到前一个分支
git checkout -b new-branch-name #创建一个新的分支并切换到该分支,相当于执行了下面俩条命令
git branch <new-branch-name>
git checkout <new-branch-name>
#恢复文件到暂存区版本(上次add后的版本,如果没有add,就是上次commit的版本)
git checkout -- <filename>
#回退到指定提交的版本,同时更新工作区和暂存区
git checkout <commit-hash> -- <filename>
git checkout
可能会导致未保存的更改丢失,尤其是当你在切换分支或恢复文件时未保存当前工作区的更改。
在 Git 2.23 之后,引入了两个更明确的命令:git switch
和 git restore
,用于替代部分 git checkout 的功能:
git switch
:用于切换或创建分支git restore
:用于恢复工作区文件或从历史提交中恢复文件
git reset
用于撤销提交或修改,可以重置暂存区或当前分支的状态。
git reset HEAD~1 #将当前分支的最后一次提交撤销,并将更改保留在工作区
git reset --hard HEAD~1 #将当前分支的最后一次提交和更改完全撤销,工作区也将被重置
git reset <filename> #将指定文件从暂存区移除,但保留工作区的更改
HEAD说明:
HEAD
表示当前版本,等同于HEAD~0
HEAD^
上一个版本,等同于HEAD~1
HEAD^^
上上一个版本,HEAD~2
- 以此类推...
git cherry-pick
将其他分支或提交历史中的某一个或多个特定提交应用到当前分支。常用于将某些独立的更改从一个分支引入另一个分支,而不用合并整个分支或变基。cherry-pick
不会影响原始分支的提价历史。
#将指定提交的更改应用到当前分支,并形成一个新的提交
git cherry-pick <commit-hash>
#挑选多个提交,这些分支会依次应用到当前分支
git cherry-pick <commit1> <commit2> <commit3>
#选择指定范围内的所有提交
git cherry-pick <commit-start>^..<commit-end>
在cherry-pick
过程中,如果遇到冲突,需要手动解决冲突,然后执行以下命令继续:
git cherry-pick --continue
#如果不想继续,可以使用以下命令取消这次操作
git cherry-pick --abort
git merge
将其他分支合并到当前分支
git merge <branch-name> #将指定分支的提交合并到当前分支
git merge --abort #如果合并过程中发生冲突且无法解决,可以使用此命令取消合并
git rebase
将一个分支的修改移到另一个分支上。可以帮助保持提交历史的线性,减少合并时的冲突。
git rebase <branch-name>
git rebase -i <branch-name> #交互式变基
git diff
查看工作区或暂存区的文件改动详情。
# 1.查看工作区中位暂存的修改
git diff
# 2.查看已暂存,但未提交的修改
git diff -staged
或
git diff -cached
# 3.查看两个提交之间的差异
git diff <commit1> <commit2>
# 4.查看特定文件的更改内容
git diff <filename>
# 5.查看当前工作区或暂存区与指定提交的差异
git diff <commit>
# 6.比较分支之间的差异
git diff <branch1>..<branch2>
常用选项
git diff --name-only
:只显示有改动的文件名称,不显示具体内容git diff --stat
:显示更改的统计信息,如每个文件修改、添加或删除的行数git diff -w
:忽略空白字符的差异