GIT 使用指南以及常见问题汇总
🖋️

GIT 使用指南以及常见问题汇总

 
👟
日常使用命令
git的提交人名和邮箱设置与查看
  • 查看
git config --global user.name git config --global user.email
  • 设置
git config --global user.name "winston" git config --global user.email "leejiliang@126.com"
💡
—global 表示全局设置, 如果需要可以在特定的仓库设置不同的用户名和邮箱等信息
 
创建仓库, 添加文件到仓库, 提交到仓库
## 创建普通目录 $ mkdir git_test ## 把当前目录变成git仓库, 执行后, 目录下会多出来一个.git影藏目录 $ git init Initialized empty Git repository in /Users/leejiliang/Downloads/git_test/.git/
也可以在非空目录下执行 init 命令.

把文件添加到版本库

 
git只能记录文本文件的版本变动, 对于图片, 视频等文件只能记录, 无法追踪文件的变化, word 文件也是二进制的, 无法使用git来追踪内容的变化.
在仓库中新建一个文件 readme.txt
git is a version control system. git is free software
  • 添加到仓库
git add readme.txt
  • 提交到仓库
$ git commit -m "write a readme file" [master (root-commit) 8fa9208] write a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt
-m 对本次提交的说明.
输出描述了本次提交有一个文件变动, 2行记录的插入, 影响到的文件名: readme.txt
先add 在commit 是为了可以把多个文件变动分开来提交.
  • 修改commit msg
git commit --amend
时光穿梭机, 版本回退, 工作区暂存区, 管理修改, 撤销修改, 删除文件
修改并提交文件
修改readme.txt
git is a distributed version control system. git is free software
  • 查看当前仓库状态
$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a")
On branch master 表示当前所处分支 master
modified: readme.txt 修改的文件
变更未提交到staged暂存区, 提交add, 恢复 restore
  • 查看修改的内容
$ git diff diff --git a/readme.txt b/readme.txt index 488642a..1d72fa6 100644 --- a/readme.txt +++ b/readme.txt @@ -1,2 +1,2 @@ -git is a version control system. +git is a distributed version control system. git is free software
确认提交内容后, 执行两步提交操作.
  • 提交到暂存区
$ git add readme.txt
  • 查看仓库状态
$ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: readme.txt
提示如果执行提交操作, 会提交文件 readme.txt.
  • 执行提交操作
$ git commit -m "add distributed" [master eb743de] add distributed 1 file changed, 1 insertion(+), 1 deletion(-)
  • 查看仓库状态
$ git status On branch master nothing to commit, working tree clean
说明仓库很干净, 没有内容需要提交.
版本回退
  • 多制造几次提交记录, 重复的修改提交即可.
  • 查看提交记录
$ git reflog e7de765 (HEAD -> master) HEAD@{0}: commit: append age 09ab113 HEAD@{1}: commit: append gender e0e8423 HEAD@{2}: commit: append name eb743de HEAD@{3}: commit: add distributed 8fa9208 HEAD@{4}: commit (initial): write a readme file
从上之下是日期从最近追溯到最远的排序状态. 最新的一次提交是: append age, 最早的一次提交到 write a readme file
每一行最开始的字符串是commitId
在第一行记录中有(HEAD → MASTER) 表示当前所属版本.
HEAD^ 表示上一个版本, HEAD^^ 表示上上一个版本, 依次累加. 还可以使用HEAD~100表示回退100个版本.
  • 回退一个版本
$ git reset --hard HEAD^ HEAD is now at 09ab113 append gender
这是查看readme.txt 文件内容刚好还原到app gender的提交状态. 查看log
$ git log commit 09ab1138e9c433715138ad9d3015cf4e4ab54ad6 (HEAD -> master) Author: lee <leejiliang@126.com> Date: Tue Nov 22 20:47:11 2022 +0800 append gender commit e0e8423a35196331f7eb12e668f7531ab6600bf9 Author: lee <leejiliang@126.com> Date: Tue Nov 22 20:46:23 2022 +0800 append name commit eb743defb0cfbfc67c9b871eb53fc8bc4e7756bb Author: lee <leejiliang@126.com> Date: Tue Nov 22 20:38:21 2022 +0800 add distributed commit 8fa92084b66675bdbb86f93db41fa898b4b1e777 Author: lee <leejiliang@126.com> Date: Tue Nov 22 11:27:52 2022 +0800 write a readme file
可以看到最新一次的提交变成了append gender
  • 撤销回退
先找到刚才撤销的回退commitId
$ git reflog 09ab113 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^ e7de765 HEAD@{1}: commit: append age ## 这里是上一步被回退的提交, 在撤回到该版本即可撤销上一次回退. 09ab113 (HEAD -> master) HEAD@{2}: commit: append gender e0e8423 HEAD@{3}: commit: append name eb743de HEAD@{4}: commit: add distributed 8fa9208 HEAD@{5}: commit (initial): write a readme file $ git reset --hard e7de765 HEAD is now at e7de765 append age git log commit e7de765a3e7c7613b0fbcec597152a4e6a6bd947 (HEAD -> master) Author: lee <leejiliang@126.com> Date: Tue Nov 22 20:47:56 2022 +0800 append age commit 09ab1138e9c433715138ad9d3015cf4e4ab54ad6 Author: lee <leejiliang@126.com> Date: Tue Nov 22 20:47:11 2022 +0800 append gender commit e0e8423a35196331f7eb12e668f7531ab6600bf9 Author: lee <leejiliang@126.com> Date: Tue Nov 22 20:46:23 2022 +0800 append name commit eb743defb0cfbfc67c9b871eb53fc8bc4e7756bb Author: lee <leejiliang@126.com> Date: Tue Nov 22 20:38:21 2022 +0800 add distributed commit 8fa92084b66675bdbb86f93db41fa898b4b1e777 Author: lee <leejiliang@126.com> Date: Tue Nov 22 11:27:52 2022 +0800 write a readme file
可以看到刚才回退的版本又回来了.
在看提交记录时, 可以通过 —perty=oneline 来美化输入内容.
  • 查看log
$ git log --pretty=oneline e7de765a3e7c7613b0fbcec597152a4e6a6bd947 (HEAD -> master) append age 09ab1138e9c433715138ad9d3015cf4e4ab54ad6 append gender e0e8423a35196331f7eb12e668f7531ab6600bf9 append name eb743defb0cfbfc67c9b871eb53fc8bc4e7756bb add distributed 8fa92084b66675bdbb86f93db41fa898b4b1e777 write a readme file
  • 如果只想回滚历史提交记录中的某一个文件.
    • 从最新版回滚到历史版本
    • copy要恢复的文件
    • 再回到最新版本
    • 将copy出来的文件覆盖最新版本的文件, 提交即可
工作区和暂存区
  • 工作区可以理解为我们git仓库所在的目录, 在git仓库中对文件所做的修改, 在未执行add之前, 都是保存在工作区中的.
  • 暂存区 当工作区内的文件发生变化时, 这时执行add 操作, 这些发生的变化的文件就会被复制一份到暂存区中去.
在git仓库的根目录中有一个隐藏目录 .git 这个就是git的版本库, 很多git相关的信息都保存在这里, 其中的stage(index) , 就是暂存区的概念. git为仓库创建的第一个分支叫master或者main, 指向master的指针叫HEAD.
add, commit 操作的示意图
notion image
管理修改
commit 只会覆盖
撤销修改
  • 撤销, 未add 的变更
git checkout -- src/main/java/io/creams/auth/controller/BimUserInfoSyncWeb.java
或者
git restore src/main/java/io/creams/auth/controller/BimUserInfoSyncWeb.java
  • 撤销add. 未commit的变更.
git restore --staged readme.txt 恢复暂存区
git restore readme.txt 恢复工作区
  • 撤销commit, 未push到远端仓库
git log 找到目标版本号
git reset --hard e7de765a3e7c7613b0fbcec597152a4e6a6bd947 回滚提交内容
删除文件
被git管理的文件删除后, 可通过git恢复, 如果文件从未被加入到仓库中, 那么是没办法通过git找回的.
  • 删除一个文件后, 通过git查看仓库状态
$ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) deleted: test.txt
  • 恢复
git restore test.txt
  • 提交删除
git add/rm test.txt
 
远程仓库
  • 添加远程仓库
  1. 建立远程仓库地址: gitee/github
  1. 复制仓库地址, 把本地仓库和远程仓库关联起来
origin 是常用远端仓库名称, 可以自定义但不推荐.
  1. 然后执行push即可将本地信息推送到远程仓库中.
  • 删除远程仓库
  1. 查看远程仓库
git remote -v 获取远程仓库名称, 例如上文中的origin
  1. 删除远程仓库
git remote rm origin
这里的删除只是和远程仓库解除了绑定关系.
分支管理
创建合并分支
  • 创建分支
git branch -b dev or git switch -c dev
  • 切换分支
git branch dev or git switch master
  • 合并分支, dev 合并到master
首先要处于最终合并到的目标分支上
$ git switch master $ git merge dev
  • 删除分支
无法删除当前所处的分支
git branch -d dev
合并解决冲突
首先制造冲突, 基于master分支切换一个新的分支 feature1, 然后修改最后一行的内容
然后提交修改到分支feature1
切回master分支, 修改同一文件的同一行内容, 然后提交到master,
执行合并操作
$ git merge feature1 Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result.
根据提示可以看到在readme.txt文件中, 存在自动合并无法处理的冲突, 需要手动去合并, 然后提交修改.
提交后,就完成了本次合并, 查看git日志.
$ git log --graph --pretty=oneline --abbrev-commit * 5d897c0 (HEAD -> master) resolve conflict |\ | * 7c7acaa (feature1) update last line * | e3e04ad update last line |/ * 12d8441 (dev, delete) Creating a new branch is quick. * 2615a4e delete test * 2b0a0ca add test.txt * e7de765 append age * 09ab113 append gender * e0e8423 append name * eb743de add distributed * 8fa9208 write a readme file
可以清晰的看到feature1分支上的 提交记录7c7acaa 被合并到了master分支上. 最后删除分支feature1
合并参数 —no-ff 关闭快速合并, 为合并创建一个新的提交.
—ff-only 快速合并, 不产生新的commit, 如果遇到冲突直接中断.
—ff 这个是default行为, 即默认的快速合并.
分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward 模式,但这种模式下,删除分支后,会丢掉分支信息。
例如直接合并, 查看git记录
$ git log --graph --pretty=oneline --abbrev-commit * 91f29d5 (HEAD -> master, dev) add a new line to last * 5d897c0 resolve conflict |\ | * 7c7acaa update last line * | e3e04ad update last line |/ * 12d8441 (delete) Creating a new branch is quick. * 2615a4e delete test
从记录中无法看出91f29d5 提交是从分支上合并到主分支的. 如果需要体现出来, 可以通过强制禁用Fast forward 模式, Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
$ git merge --no-ff -m "merge with no-ff" dev * e056cf5 (HEAD -> master) merge with no-ff |\ | * 8e98701 (dev) content two | * bb83e42 content one |/ * 91f29d5 add a new line to last * 5d897c0 resolve conflict
可以清晰的看出bb83e42 8e98701 两个提交是从dev分支合并过来的.
原则上, master分支应该处于稳定状态, 开发都是在dev分支, 每个开发同事在自己的开发分支上工作, 有内容就往dev上合并, 大家都往dev上合并, 直到dev趋于稳定, 才把dev往master上进行合并. 如果需要保留分支合并记录, 需要添加参数 —no-ff
bug分支
工作区有不完整内容, 需要修复紧急bug, 这时如果不想提交本地内容, 可以暂时隐藏工作区内的变更, 然后切换到bug分支进行bug修复, 然后再回到开发分支, 找回隐藏的工作区变更内容, 继续开发.
$ git switch dev 128 ↵ error: Your local changes to the following files would be overwritten by checkout: readme.txt Please commit your changes or stash them before you switch branches. Aborting
可以看到直接切换分支, git会提示需要先提交或者stash在当前工作区中变化内容.
  • 隐藏工作区内容的修改
$ git stash Saved working directory and index state WIP on master: 8a67d33 nine
这时工作区就应该干净了, 可以切换到其他分支进行紧急任务处理了, 处理完成后, 恢复工作区.
  • 恢复工作区
git stash apply/pop 区别是pop会删除stash 记录, apply不会, 但是可以通过drop来删除.
  • 查看stash 列表
git stash list
  • 提取单个提交应用到某个分支
例如在master分支上修复了某个bug后, 其实在feature上也是存在这个bug的, 这时就可以把在master上对这个bug修复的提交合并到开发分支上. merge的返回是整个仓库, 需求是单个提交
  • 合并单个提交
git cherry-pick xxxxxx
分支强制删除
如果在分支上的变动未合并到主分支, 执行删除操作, 会报错
git branch -d dev error: The branch 'dev' is not fully merged. If you are sure you want to delete it, run 'git branch -D dev'.
如果这时需要强制删除可以使用 -D 参数来强制删除
rebase
  • 理解
在主分支切出来一个分支后, 在分支上进行开发, 提交, 主分支也会有其他同学的提交, 这时在开发分支执行rebase master , 意思就是把当前分支的起点移动到master分支的最新提交上.
所谓变基, 就是把我们的基点, 也就是起点, 变成目标分支的终点, 把目标分支的终点变成当前分支的起点, 需要注意的是, 影响到的只是当前分支, 对目标分支来说是没有感知的.
在push代码时 , 发现远端分支有提交, 拉下来后, git log会出现分叉.
notion image
执行 git rebase
notion image
可以看到记录变成了一条笔直的线.
标签管理
  • 意义
在某个阶段对仓库进行一个版本标识, 像是对历史的一个阶段的终结.
  • 添加标签
git tag -a tag_name -m "tag desc" xxxxx(commitId)
-a 标签名
-m 标签描述
xxxx 标签打在哪次提交上, 如果不指定, 则默认使用HEAD指针指向的commitId.
  • 查看标签
git tag
  • 查看明细
git show tag_name
  • 删除本地标签
git tag -d 0.8
  • 推送标签到远程仓库
git push origin 0.9
  • 推送本地全部tag
git push --tags
  • 删除远程仓库标签
  1. 删除本地tag 同上
  1. 删除远程tag
$ git push origin :refs/tags/0.8 remote: Powered by GITEE.COM [GNK-6.4] To https://gitee.com/lijiliang/learngit.git - [deleted] 0.8
别名配置
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.co checkout
gitignore
touch .gitingore
不生效的情况需要清理缓存
git rm -rf --cached .
 
git. 在添加远端分支后, 执行git pull报错: fatal: refusing to merge unrelated histories
可以使用命令处理:
git pull origin master --allow-unrelated-histories
 

提交规范

feat - 新功能 feature fix - 修复 bug docs - 文档注释 style - 代码格式(不影响代码运行的变动) refactor - 重构、优化(既不增加新功能,也不是修复bug) perf - 性能优化 test - 增加测试 chore - 构建过程或辅助工具的变动 revert - 回退 build - 打包
 

常见问题

  1. 本地新建仓库关联远端新建仓库后, pull 提示
fatal: refusing to merge unrelated histories
可以通过命令
git pull --allow-unrelated-histories
处理.
  1. 为每个项目配置配置不同的账号密码信息
如果我们开发的项目代码托管在不同的平台,那么就需要为每个鲜项目设置不同的账号密码信息,可以在具体的工程目录下执行:
git config credential.helper store
然后在下一次提供账号密码之后,系统就会自动帮我们在系统中记录凭证信息。