🚀 Git 操作大全
3
准备
图解
Git 配置 SSH key
https 和 ssh 的区别
clone 项目:使用 ssh 方式时,首先你必须是该项目的管理者或拥有者,并且需要配置个人的 ssh key。而对于使用 https 方式来讲,就没有这些要求。
在使用 ssh 方式 push 时,是不需要验证用户名和密码,如果你在配置 ssh key 时设置了密码,则仅需要验证配对密码(可配置无密码)。而对于使用 https 方式来讲,每次 push 都需要验证用户名和密码。
git bash
git 的命令行工具,需要安装 git,才能使用,其集成了**linux 的命令行,操作非常便捷直观。**
Commit 注释符规范
feat:新功能(feature)
fix:修补 bug
refine: 优化
docs:文档(documentation)
style: 格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动/小的新功能
工作流
概述
- 创建一个独立的文件夹,文件夹运行 git bash,或其他命令行
git init
仓库初始化,如果已存在,可以删除后,重新初始化。git config --global user.name"把子君"
git config --global user.email"[1324022569@qq.com](mailto:1324022569@qq.com)"
(注意此的账号,邮箱不是 github,gitee 的 而是 git 本身的。且只用全局配置一次)- 连接远程
git clone [url]
常用 –从远程端下载克隆仓库 不用自己手动初始化了。因为 git clone 通过复制位于您指定的 URI 上的现有 git 存储库来创建新的 git 存储库。git remote add origin [url]
–与远程仓库连接git remote rm origin
–删除当前的远程
- 拉取远程
git pull origin master
–从远程服务器更新数据- 注意 github 20 年 10 月 把默认分支 改为了 main,所有上面的命令,当主分支为 main 时,应当
git pull origin main
- 提交远程
git add . | [path]
–把改动的文件加入暂存区,.
表示所有文件git commit -m '提示信息'
–提交修改和打上提交备注git push
–提交到远程- 仓库首次提交或新建分支后首次提时,由于远程上游不存当前提交的分支,所以需要使用
**-u**
或**--set-upstream**
,建立远程分支后,方可提交:**git push ****<font style="color:rgb(255, 0, 0);">-u</font>****/****<font style="color:#F5222D;">--set-upstream</font>****<font style="color:rgb(255, 0, 0);"> </font>****origin newBranch**
- 列如:
git push -u origin master
- 如果远程分支名重复,先修改分支名,再提交
git branch -m master master-new
git push -u origin master-new
- 列如:
其他
之前公司的工作流简述
- 确保当前分支 add commit 过 干净
- 然后 git checkout master
- 在主分支 master 中 首先要先 git pull
- 然后在主分支中新建分支 git checkout -b 日期-分支类型-具体类容-ran
- 开始工作
操作
基础
状态 status
git status
–查看工作区的状态
分支 branch
(分支:一个项目的同源,但版本不同的分支)
git branch
–查看所有分支,当前分支有*
git branch 分支名
–创建分支
git branch -D 分支名
–删除分支
git branch -M/m 别名
–当前分支重命名
git checkout -b 分支名
--创建分支
git push origin --delete 分支名字
–删除远程分支
1. 切换分支
git switch 分支名
git checkout 分支名
[checkout 的使用]
2. 合并分支
1.git merge 其他分支
把其他分支的内容合并到当前分支 官方文档详解
git cherry-pick 参数可以是 hash 也可以是 分支名,为分支名,就是获取当前分支最近的一个提交,控制的是提交 commit。跟 git reset –hard
类似 一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick
标签 Tags
git tag
查看 tags 列表
<font style="color:rgb(77, 77, 77);">git tag <tagName></font>
创建本地 tag
<font style="color:rgb(77, 77, 77);">git push origin <tagName></font>
推送到远程仓库
<font style="color:rgb(77, 77, 77);">git push origin --tags</font>
若存在很多未推送的本地标签,你想一次全部推送的话:一次全部推送的话
日志 log
git -log -p
–按补丁格式显示每个提交引入的差异 –就是 diff
git log origin/master -n 3
–查看远程分支的更新日志
git log --pretty=oneline
–用于多数据展示 (pretty 格式化)
git log --pretty --oneline
–格式化,简短 hash
git log --pretty=format:"%h - %an, %ar : %s"
–简短格式化展示
git log --pretty=format:"%h:%s"
–格式化为 hash 和信息
**git log --stat**
–显示每次提交的修改增加情况
**git log -S [代码中增删的字符串]**
–可找出增删过某字段的 commit。
你一定奇怪 作者 和 提交者 之间究竟有何差别, 其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。 所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。 我们会在 分布式 Git 再详细介绍两者之间的细微差别。
**git log --pretty=format:'%h %s' --graph**
–展示树结构
git diff
–比较不同 commit 版本的代码文件异同
git diff hash1 hash2 file
git diff fa13bef 74aac04 src/components/bzComponents.js
实战
git 保存和恢复工作进度(stash)
stash命令可用于临时保存和恢复修改,可跨分支。
在 git add 之后使用,它会将暂存的更改和工作目录中未暂存的更改一并保存起来。如果在 git add 之前使用,则只会保存工作目录中未暂存的更改。__如果本次更改 新增了文件,则需要在 add 后,使用 stash
- git stash [save message]保存,save为可选项,message为本次保存的注释
- git stash list所有保存的记录列表
- git stash pop stash@{num}恢复,num是可选项,通过git stash list可查看具体值。只能恢复一次,
**<font style="color:rgb(64, 64, 64);">且会</font>**
删除 stash 记录 - git stash apply stash@{num}恢复,num是可选项,通过git stash list可查看具体值。可回复多次,
**<font style="color:rgb(64, 64, 64);">不会</font>**
删除 stash 记录 - git stash drop stash@{num}删除某个保存,num是可选项,通过git stash list可查看具体值
- git stash clear删除所有保存
推拉(切到
)非主分支的远程分支
【参考】
方式一:
git remote update origin -p
–更新远程分支,可以看到除主分支外其他分支了git checkout -b 自定义名 origin/远程分支名
–根据远程分支新建本地分支
- 或者 直接
git checkout 远程分支名
, 自动关联远程并拉取。但紧跟一定要git pull
一哈
git push origin HEAD:远程分支名
–内容会推到(覆盖)远程分支上git push origin HEAD
–推成一个当前本地分支名的 新分支git push origin --delete 远程分支名
–master 下 删除远程分支
方式二:
git checkout -b 远程分支名 origin/远程分支名
–** **通过新建远程分支同名分支,建立与远程分支的绑定。如此操作,就相当于 checkout 到了 远程分支上- 修改代码后, git push 即可
commit 记录的合并与改名
操作失误请服用 git rebase –abort
git rebase -i hash|HEAD~n
–启动 vim 编辑 commit 信息。
hash: 填 hash 即选中该 hash 之后所有的 commit
HEAD~n: 表示当前次 commit 到第 n 次前的所有 commit
进入vim
开始编辑 (一定要确定是英文输入法):i
插入(编辑); esc
退出编辑(返回预览);:wq
保存并推出; delete
删除
常用前缀,所有前缀都有用开头字母简写
pick:表示使用该 commit
**squash: **将指定的提交合并到上边的 pick 请求中,保留提交信息
fixup:与 **squash **类似,但不保留提交信息
edit: 编辑 commit 消息
想把后面三条都合并到 commit “new” ,将后三条的pick 改为 s 即可。
:wq 后进入编辑整合后的 commit message。
想修改 commit message, 就把需要修改的 commit 前的 pick 修改为 e
:wq 保存退出后,依次执行
git commit --amend
进入 vim 编辑新 message
git rebase --continue
编辑生效
如果想修改的 commit message,就是最新的一个 commit, 就简单了。
直接执行 git commit --amend
进行 vim 编辑
取消文件跟踪(Tracked 改为 Untracked)
当把对应文件类型加入 .gitignore
,仍被缓存时可以采取如下方法
- 对某个文件取消跟踪
git rm –cached readme1.txt //删除 readme1.txt 的跟踪,但不删除文件。
git rm –f readme1.txt //删除 readme1.txt 的跟踪,并且删除文件。
- 对某个文件夹取消跟踪
git rm –cached **/.idea/ -r //删除所有.idea 目录下文件的跟踪,但不删除文件。
git rm -f **/.idea/ -r //删除所有.idea 目录下文件的跟踪,并且删除文件。
- 对所有文件都取消跟踪
git rm -r –cached . //删除所有文件的跟踪,但不删除文件
git rm -r –f . //删除所有文件的跟踪,并且删除文件
pull 远程 且 完全覆盖本地
由于远程 操作了 reset 。git push -f 强制提交后。本地会和远程不一致。如果本地在 pull 之后触发了 merge。记得执行以下操作,让本地和远程保持一直。
1 |
|
如果你想要保留本地的更改,并且尝试将它们与远程分支合并,可以使用--merge
选项
1 |
|
版本控制
【参考】
情况一: <font style="color:rgb(64, 64, 64);">放弃更改</font>
(checkout)
未使用 git add 缓存代码时:
1 |
|
此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于 git 是未知的。自己手动删除就好了。
情况二: <font style="color:rgb(64, 64, 64);">撤销暂存操作</font>
(reset)
已经使用了 git add 缓存了代码:
首先,Git 必须知道当前版本是哪个版本,在 Git 中,用HEAD表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交 ID 和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上 100 个版本写 100 个^比较容易数不过来,所以写成HEAD~100。
可以使用 **git reset HEAD filepathname**
(比如: git reset HEAD readme.md)来放弃指定文件的缓存,放弃所有的缓存可以使用 **git reset HEAD .**
命令。
此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,也就是还有暂存,需要再使用【情况一】的操作,就能撤销修改了。
情况三: <font style="color:rgb(64, 64, 64);">回退到某个commit, (即撤销某个commit即它</font><u><font style="color:rgb(64, 64, 64);">之后所有</font></u><font style="color:rgb(64, 64, 64);">的提交)</font>
(reset)
已经用 git commit 提交了代码:
git reset HEAD~1
撤销某个 commit,改动还是回到本地
git reset --hard HEAD^
来回退到上一次 commit 的状态。改动会不会回到本地
reset 也可以 reset 相应分支:**git reset --hard origin/<分支名>**
或使用此命令可回退到任意版本:git reset --hard commitHash
你可以使用 git log
命令来查看 git 的提交历史。git log
的输出如下,之一这里可以看到第一行就是 commitHash
拿回回退之间的 commit 记录
**git reflog**
这个命令记录了 你之前所有的提交,分支切换/修改,reset 等操作
HEAD@{n}
说明仓库中 HEAD 在 n 次前的所指向的提交, reset,checkout
然后找到对应 的 commitHash
然后再使用 **<font style="color:rgb(77, 77, 77);">git cherry-pick </font>****commitHash**
或者**<font style="color:rgb(77, 77, 77);">git reset –hard </font>****commitHash**
这个时候 在使用 **<font style="color:rgb(77, 77, 77);">git log</font>**
查看 就会发现之前提交 的记录 回来 了
情况四: <font style="color:rgb(64, 64, 64);">撤销</font><u><font style="color:rgb(64, 64, 64);">某次</font></u><font style="color:rgb(64, 64, 64);"> commit、merge操作</font>
(revert)
如果你想要保留 commit 的历史记录,但撤销指定 commit所做的更改,可以使用 git revert。这会在当前分支上创建一个新的 commit,用于撤销指定 commit的更改。
git revert
:该命令就是为<u>撤销某次提交而存在</u>
的;
1 |
|
有 release、test 两个分支,test 上进行修改提交后,merge 到 release 分支,但 merge 后想撤销此次 merge 操作,那要怎么操作呢?
1 |
|
-m 表示要撤销 merge 操作,不加-m 表示撤销普通 commit 操作。
撤销 merge 操作后 test 分支无法再次 merge 到 release
原因:无法再次 merge 是由于 revert 操作是新操作覆盖旧操作,所以之前的修改相当于被抛弃,此时 test 分支是落后 release 分支的。
但在 test 中 merge release 后, release 就能重新 merge test 啦!
1 |
|
此时 release 分支的修改都被带到了 test 分支,包括在 release 分支的 revert 操作,所以现在 test 分支原本的代码此时没有了。
重点来了⚠️ 这时需要把 revert 产生的提交再 revert 一次,test 上原本的代码又回来了,此时再进行修改或者 merge 到 release 分支都是可以操作的!
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!