🚀 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:构建过程或辅助工具的变动/小的新功能

工作流

概述

  1. 创建一个独立的文件夹,文件夹运行 git bash,或其他命令行
  2. git init 仓库初始化,如果已存在,可以删除后,重新初始化。
  3. git config --global user.name"把子君"
  4. git config --global user.email"[1324022569@qq.com](mailto:1324022569@qq.com)" (注意此的账号,邮箱不是 github,gitee 的 而是 git 本身的。且只用全局配置一次)
  5. 连接远程
    1. git clone [url] 常用 –从远程端下载克隆仓库 不用自己手动初始化了。因为 git clone 通过复制位于您指定的 URI 上的现有 git 存储库来创建新的 git 存储库。
    2. git remote add origin [url]–与远程仓库连接
    3. git remote rm origin–删除当前的远程
  6. 拉取远程
    1. git pull origin master –从远程服务器更新数据
    2. 注意 github 20 年 10 月 把默认分支 改为了 main,所有上面的命令,当主分支为 main 时,应当 git pull origin main
  7. 提交远程
    1. git add . | [path] –把改动的文件加入暂存区,.表示所有文件
    2. git commit -m '提示信息' –提交修改和打上提交备注
    3. git push–提交到远程
    4. 仓库首次提交或新建分支后首次提时,由于远程上游不存当前提交的分支,所以需要使用**-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**
      1. 列如: git push -u origin master
      2. 如果远程分支名重复,先修改分支名,再提交
        1. git branch -m master master-new
        2. 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 其他分支 把其他分支的内容合并到当前分支 官方文档详解

  1. git cherry-pick 参数可以是 hash 也可以是 分支名,为分支名,就是获取当前分支最近的一个提交,控制的是提交 commit。跟 git reset –hard类似

  2. 一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(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删除所有保存

推拉(切到)非主分支的远程分支

参考

方式一:

  1. git remote update origin -p –更新远程分支,可以看到除主分支外其他分支了
  2. git checkout -b 自定义名 origin/远程分支名根据远程分支新建本地分支
  • 或者 直接 git checkout 远程分支名, 自动关联远程并拉取。但紧跟一定要 git pull 一哈
  1. git push origin HEAD:远程分支名 –内容会推到(覆盖)远程分支上
  2. git push origin HEAD –推成一个当前本地分支名的 新分支
    1. git push origin --delete 远程分支名 –master 下 删除远程分支

方式二:

  1. git checkout -b 远程分支名 origin/远程分支名 –** **通过新建远程分支同名分支,建立与远程分支的绑定。如此操作,就相当于 checkout 到了 远程分支上
  2. 修改代码后, 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 ,仍被缓存时可以采取如下方法

原贴

  1. 对某个文件取消跟踪

git rm –cached readme1.txt //删除 readme1.txt 的跟踪,但不删除文件。

git rm –f readme1.txt //删除 readme1.txt 的跟踪,并且删除文件。

  1. 对某个文件夹取消跟踪

git rm –cached **/.idea/ -r //删除所有.idea 目录下文件的跟踪,但不删除文件。

git rm -f **/.idea/ -r //删除所有.idea 目录下文件的跟踪,并且删除文件。

  1. 对所有文件都取消跟踪

git rm -r –cached .   //删除所有文件的跟踪,但不删除文件

git rm -r –f .    //删除所有文件的跟踪,并且删除文件

pull 远程 且 完全覆盖本地

由于远程 操作了 reset 。git push -f 强制提交后。本地会和远程不一致。如果本地在 pull 之后触发了 merge。记得执行以下操作,让本地和远程保持一直。

1
git reset --hard origin/<分支名>

如果你想要保留本地的更改,并且尝试将它们与远程分支合并,可以使用--merge选项

1
git reset --merge origin/<分支名>

版本控制

参考

情况一: <font style="color:rgb(64, 64, 64);">放弃更改</font> (checkout)

未使用 git add 缓存代码时:

1
2
3
4
5
// 放弃单个文件修改,注意不要忘记中间的"--",不写就成了检出分支了!
git checkout --'filepathname'

// 放弃所有的文件修改
git checkout.

此命令用来放弃掉所有还没有加入到缓存区(就是 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
git revert <commit哈希值>

有 release、test 两个分支,test 上进行修改提交后,merge 到 release 分支,但 merge 后想撤销此次 merge 操作,那要怎么操作呢?

1
2
# 撤销merge操作 release 分支中
git revert commitHash<需要短hash> -m 1

-m 表示要撤销 merge 操作,不加-m 表示撤销普通 commit 操作。

撤销 merge 操作后 test 分支无法再次 merge 到 release

原因:无法再次 merge 是由于 revert 操作是新操作覆盖旧操作,所以之前的修改相当于被抛弃,此时 test 分支是落后 release 分支的。

但在 test 中 merge release 后, release 就能重新 merge test 啦!

1
2
# 合并release到test test 分支中
git merge release

此时 release 分支的修改都被带到了 test 分支,包括在 release 分支的 revert 操作,所以现在 test 分支原本的代码此时没有了。
重点来了⚠️ 这时需要把 revert 产生的提交再 revert 一次,test 上原本的代码又回来了,此时再进行修改或者 merge 到 release 分支都是可以操作的!


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!