Git&Github cookbook
概念
- 查看git版本
git version
- 配置ssh
ssh-keygen -t ed25519 -C "你的邮箱地址"
在系统中创建 SSH 公私钥之后,并将公钥放到 GitHub 指定位置。如此操作即可生成 GitHub 账户对于当前系统中的 Git 授权。
ssh授权优点:
- 免密码推送,执行
git push
时不再需要输入用户名和密码了;- 提高数据传输速度。
- 查看本地仓库所关联的远程仓库信息
git remote -v
当我们在 GitHub 上创建一个仓库时,同时生成了仓库的默认主机名 origin,并创建了默认分支 main(20年之前是master)。注意主机名origin指代的是仓库地址,即该仓库在github上的地址。
- 使用ssh克隆项目到本地
git clone + [仓库地址] // 注意地址选ssh的
当我们在 GitHub 上创建一个仓库时,同时生成了仓库的默认主机名 origin,并创建了默认分支 main(20年之前是master)。
注意主机名origin指代的是仓库地址,即该仓库在github上的地址。克隆远程仓库到本地时的默认设置 :创建 main 分支并自动跟踪远程同名分支。
- issue\tags都不跟随fork,只在当前repo里面存在
基础操作
- git config 类指令(本地配置)
// 查看配置信息
git config -l
// 修改配置(不推荐),global代表了再任何仓库里都默认设置这个username
// username、email是标识提交名称的,表明了在远程仓库是谁提交的
git config --global user.name "Mona Lisa"
// 修改配置(推荐)
vim ~/.gitconfig
//在文件中添加
[user]
name = KylinC
email = k1017856853@icloud.com
// 设置命令别名
git config --global alias.[别名] [原命令]
- Git本地库有三大区域:工作区、暂存区、版本区。一个重要概念:被提交到版本库的文件处于“被跟踪(tracked)”的状态
- git add 类指令
// 提交到stage
git add [文件名]
// 提交全部文件到stage
git add .
- git diff 类指令
// 查看仓库状态:目前分支位置(相对上一次pull&push的commit数量)、追踪文件修改列表、未追踪文件列表
git status
//查看当前所处分支、远程分支、当前提交状态、远程状态
git branch -avv
// 查看工作区(working)和版本库(commit)的区别,前提是文件已经tracked!
git diff
// 查看工作区(working)和暂存区(stage)的区别,前提是文件已经tracked!
git diff --cached
- git log 类指令(查看commit历史记录)
// 查看提交历史(时间倒序,最后commit在前)
git log
// 查看提交历史(时间正序,最早commit在前)
git log --reverse
// 救命命令,这是存在于本地分支的log完整库,只要不删本地,一定可以回退(随你咋搞)
git reflog
// 查看某分支的提交历史,不写分支名查看当前所在分支
git log [分支名]
// 一行显示提交历史
git log --oneline
// 其中 n 是数字,查看最近 n 个提交
git log -n
// 查看指定贡献者的提交记录
git log --author [贡献者名字]
// 图示法显示提交历史
git log --graph
git log会输出紫色框中的版本号,这是根据当前commit文件、作者、时间使用SHA-1算法生成的唯一hash标识。在进行版本号相关操作时,只需要前4位就可以直接操作。
- git commit 类指令
// 使用vim写commit备注
git commit
// 将备注写为参数
git commit -m "messsge is here"
// 将未添加到暂存区的修改,也就是工作区的修改也一并提交,但会略过未被跟踪的文件
git commit -am xxxxx
在github上看到的时间是commit时间,而不是push时间
- git reset 类指令
// 删除暂存区文件(从暂存区撤回到工作区)
git reset -- [文件名]
git restore [文件名]
git rm --cached [文件名]
// 删除暂存区全部文件(从暂存区撤回到工作区)
git reset --
// 撤销最近的一次提交(从版本库撤回到暂存区)
git reset --soft HEAD^
// 撤销最近的二次提交(从版本库撤回到暂存区)
git reset --soft HEAD^^
// 撤销最近的n次提交(从版本库撤回到暂存区)
git reset --soft HEAD~n
// 硬回退(相比软回退,直接删除当前分支,转到之前某一分支)
git reset --hard [版本号]
// 根据git reflog中的标签回退,慎用hard
git reset --hard HEAD@{2}
- git push
// 推送到远程主机同名分支
git push
// 推送到[主机地址] [分支]
git push [主机地址] [分支]
// 强制推送,比如和主分支出现分叉的时候
git push -f
git push --force
// 新分支push
git push [主机名] [本地分支名]:[远程分支名]
// 新分支push,默认远程分支与本地分支一致
git push [主机名] [分支名]
// 新分支push,默认远程分支与本地分支一致,并且直接关联新分支
git push -u [主机名] [分支名]
分支管理 (git最好的功能)
- git pull 类指令
// 将远程仓库的分支信息拉取到本地仓库
// 注意,仅仅是更新了本地的远程分支信息,也就是执行 git branch -avv 命令时,查看到的 remotes 开头的行的分支信息。
git fetch
// 使本地 master 分支基于远程仓库(remote)的 master 分支
git rebase origin/main
// 拉取远程分支到本地,已经 merge,并且更新了remote
git pull
git pull = git fetch + git rebase origin/main
git fetch
和git pull
是两个常用的 Git 命令,它们的主要区别在于它们对远程仓库的更新方式不同。
git fetch
用于从远程仓库抓取最新版本,但是不会自动合并到当前分支。它只会更新本地仓库的指针(例如:HEAD
)和分支指针(例如:origin/master
),以反映最新版本。这样可以让你检查远程仓库的变化,并决定是否要合并到本地分支。相反,
git pull
在远程仓库的更新上更加简单方便。它结合了git fetch
和git merge
的操作,用于从远程仓库抓取最新版本并自动合并到当前分支。总的来说,如果你想保持对远程仓库的变化有更好的控制,并在合并前检查代码,使用
git fetch
更为适合。如果你希望一步到位,快速获取最新版本,那么git pull
更加方便。
- git branch 类指令
// 创建新的分支,在哪个分支上创建,提交记录(版本号)就和哪个分支一致
git branch [分支名]
// 切换分支
git checkout [分支名]
// 创建并切换分支
git checkout -b [分支名]
// 关联远程分支,之后就可以直接git push了
// 如果是设置当前所在分支跟踪远程分支,最后一个参数本地分支名可以省略不写
git branch -u [主机名/远程分支名] [本地分支名]
git branch --set-upstream [主机名/远程分支名] [本地分支名]
// 取消关联本地[分支名]的远程分支,可以省略表示当前分支
git branch --unset-upstream [分支名]
需要注意的点:新建分支并无跟踪任何远程分支,即没有remote
- 远程分支删除操作(可以在任意一个本地分支操作)
// 删除分支
git push [主机名] :[远程分支名]
git push [主机名] --delete [远程分支名]
// 删除多个分支
git push [主机名] :[远程分支名] :[远程分支名] :[远程分支名]
其原理是推送空分支到远端
- 本地分支的操作
// 删除一个/多个本地分支,当前分支不能被删除
git branch -D [分支名]
git branch -D [分支名] [分支名]
// 分支改名,原分支在当前分支可以省略不写
git branch -m [原分支名] [新分支名]
- gitignore下载地址
https://github.com/github/gitignore
- 关闭issue
commit中出现以下字样就会关闭issue
fixes #xxx
fixed #xxx
closes #xxx
close #xxx
closed #xxx
- pull request 方法
在github页面内操作,提 PR 既可以在仓库内,也可以跨用户跨仓库。
Create a merge commit
:这种方式会在组长仓库的 master 分支上生成一个新的提交,且保留 PR 中的所有提交信息。这是一种常规操作,用得最多。
Squash and merge
:压缩合并,它会把 PR 中的全部提交压缩成一个。此方法的优点就是让提交列表特别整洁。一个 PR 里有很多提交,每个提交都是很细小的改动,保留这些提交没什么意义,这种情况就使用此方法合并 PR。
Rebase and merge
:这种方法不会生成新的提交,例如 PR 中有 6 个提交,用此方法合并后,组长仓库也会新增 6 个提交。注意,这些提交的版本号与组员的提交不同,此外完全一样。
注意:从 A 向 B 提 PR 后,在 PR 合并或关闭前,A 上所有新增的提交都会出现在 PR 里。
- git remote 类命令
// 添加远程主机,可以是别人仓库的地址,可以同时存在多个远程主机(但是主机名不能重复)
// 注意,主仓库的地址使用 https 开头的,不能说ssh地址
git remote add [主机名] [主仓库的地址]
多人协作开发时,主仓库的主机名通常定义为 up 或 upstream
- 同步主仓库
例:远程主机为up,分支为master
// 直接pull
git pull --rebase up master
// 先fetch,再pull
git fetch up
git rebase up/master
git pull --rebase = git fetch + git rebase
- git tag
// 在本地创建标签(版本号)
// “-m [备注信息]” 可以不写
// 如果是给当前分支最新的提交创建标签,[提交版本号] 可以省略
// 标签文件储存在 .git/refs/tags 下
git tag [标签名] -m [备注信息] [提交版本号]
// 显示仓库中的全部标签列表
git tag
// 现实标签详情
git show [标签名]
// 删除标签
git tag -d [标签名]
// 推送标签到远程主机
git push origin [标签名]
// 推送所有本地标签到远程
git push origin --tags
// 删除远程标签,命令里的标签名其实就是文件名
git push origin :refs/tags/[标签名]
//本地标签需要另外手动删除
注意:标签是在提交的基础上创建的,如果仓库的多个分支中都有这个提交版本,那么这些分支上就有关于这个提交的相同的标签。
- 依据 tag 签出版本=指定某个提交版本创建一个新的分支
// 切换到之前的某个提交版本
git checkout [标签名]
// 将此提交版本固定到一个新分支上并切换到此分支
git checkout -b [新的分支名]