一、git流程
git的使用场景主要分为三大类,如下图:
![00c53d786a329c5b593a2bd36fc370a3.png](https://i-blog.csdnimg.cn/blog_migrate/101836d48b125560fe12c25494178595.png)
场景一:本地无代码,从远程仓库复制代码,在此基础上进行修改
初次使用,配置本地账号和邮箱(非必须)
git config --global user.name "用户名"
git config --global user.email "用户邮箱"
1.从远程仓库上克隆代码到本地工作区
git clone 远程仓库地址
git clone <url>
2.进入克隆代码文件夹,创建本地工作区的个人分支进行代码开发
- Step 1:初始化一个git仓库,初始化为主分支
git init
- Step 2:创建个人分支编写代码
git branch 分支名
其他相关命令:
列出所有分支:git branch
列出远程仓库分支:git branch -a
删除分支(无法删除正在使用的分支,删除前先切换):git branch -d 分支名
强制删除指定分支:git branch -D 分支名
(以及删除远程仓库的分支命令,后果很严重,不建议使用)
若存在多个分支,可切换分支
git checkout 分支名
![1f38bbaf38fdcaa639a35f4850e38bb6.png](https://i-blog.csdnimg.cn/blog_migrate/06ec8dc969edd5ddfcd37e85c132d95f.jpeg)
其他相关命令:
创建新分支并切换到新分支(进行了创建和切换两步操作):git checkout -b 分支名
3.完成代码修改后,提交到远程仓库
- Step 1:完成代码修改
此处可使用git diff
查看代码前后的改动,Git Bash中执行git diff命令后绿色为新增或改动的内容,红色为删除或改动前的内容
- Step 2:将工作区改动的代码添加到git暂存区
先配置.gitignore
,添加.gitignore
过滤的文件,比如添加时过滤Qt的ui文件:git add .
其他相关命令:
忽略.gitignore
提交所有文件:git add *
不配置.gitignore
情况下git add . / add *
两者作用相同
提交文件的修改和删除:git add -u
提交修改、新建:git add .
提交修改、删除、新建:git add -A
此处可以使用git diff --cached
比较本地工作区和git暂存区的代码的不同
使用git status查看文件处于本地工作区、暂存区还是本地仓库
![c2b9334965cbb27fbe2a8b4b017a1b91.png](https://i-blog.csdnimg.cn/blog_migrate/04051a0d3d25f00e76278858bdcc7fc8.jpeg)
- Step 3:将暂存区的代码提交到本地仓库
git commit -m "改动内容描述"
其他相关命令:
对于更新已有文件的代码,add和commit可合并,如:git add -u
和 git commit -m "描述"
合并为 git commit -am "描述"
对于新建文件编写的代码,需要先git add . 再commit
- Step 4:将本地仓库的代码提交到远程分支
若远程存在该分支,直接提交即可
git push origin 分支名
远程仓库通过合并请求:
![b38ac23e02e1e63016e46232b23f37bc.png](https://i-blog.csdnimg.cn/blog_migrate/bb0e14063e29a69e1e170efccb0f7b84.png)
![4e6134d099eb61146466b400c5dabc58.png](https://i-blog.csdnimg.cn/blog_migrate/786d3505db4aa2512566254d6ef49947.jpeg)
![981ee15e96f893d3fb6d22c058ec5302.png](https://i-blog.csdnimg.cn/blog_migrate/fe967962a31f8f458aad67e0b0216d11.png)
若远程仓库没有该分支,则在远程创建分支进行关联,然后再合并请求
git push --set-upstrem origin 远程分支名
![6a3b89e08233c5db954ee82c1a0bbc49.png](https://i-blog.csdnimg.cn/blog_migrate/cb593a1e1a3d020a5940dc1fd16c10ed.png)
场景二:本地已有代码,提交到远程仓库
1.进入代码文件夹,初始化一个代码仓库
cd existing_folder
git init
2.关联到远程仓库
git remote add <远程分支名> <url>
随后创建分支,提交修改等操作参见场景一。
场景三:本地已有代码,拉取更新远程仓库代码
1.只将代码拉取到本地仓库,用户检查以后决定是否合并到本地个人工作区
将远程仓库的所有代码取回本地:git fetch <远程仓库名>
将远程仓库的特定分支代码取回本地:git fetch <远程仓库名> <分支名>
取回更新后,会返回一个FETCH_HEAD
,指向某个分支在远程仓库的最新状态,可以再本地使用git日志查看更新信息
![dce93df48e4c3176cf0c2ce1c0c780c2.png](https://i-blog.csdnimg.cn/blog_migrate/7f2aa06f2969f6b12658b4fb256f6cb7.png)
2.取回远程仓库的更新,并和本地工作区合并
git pull 远程仓库名 分支名:本地分支名
若远程分支和本地分支是同一个则冒号后面的内容可以省略
![ab213409eb17dd1e1196a6a7a7e76af7.png](https://i-blog.csdnimg.cn/blog_migrate/95b4eb78bac1d074ea7b01c1d8cd74a4.png)
四:git堆栈区的使用
1.git stash:将还不想提交但是已经修改的内容(无论是在个人工作区还是缓存区)先放到堆栈区,后续可以在某个分支上恢复堆栈的内容,遵循先进后出的原则,堆栈的内容可以恢复到任意分支。
相关命令:
git stash
:触发保存操作
git stash save
: 效果同上,区别是可以加一些注释,如:git stash save "test1"
git stash list
: 查看当前stash中的内容
git stash apply <stash index>
: 将堆栈中的对应的内容应用到当前目录,适应于多个分支的情况
git stash drop <stash index>
: 从堆栈中移除指定名称的stash
git stash clear
: 清除堆栈中的所有内容
git stash show
: 查看堆栈中的内容和当前分支的差异
git stash show -p
: 查看详细的不同
git stash branch
: 从最新的stash创建分支,解决堆栈中的内容和当前分支的内容产生冲突的场景,需要手动解决冲突
五:代码revert和reset
两者都具有回滚功能,但是各自的实现方式不一样。正常情况下,git的工作区(work tree)、暂存区(index/Cache)与仓库(reository)HEAD指向的内容保持一致。
1.revert:保留工作目录的改动,把需要回滚的目标文件重新生成一份"commit"放入暂存区,目标节点到回滚前的改动还在。
2.reset:reset分为soft和hard两类,soft功能为撤销提交,工作区的改动还在,hard会回到目标节点并销毁改动。
git reset --soft HEAD~[arg]
: 此命令会将HEAD指针指向目标commit节点,改动仓库区、缓存区,但是目标节点以后的改动还存在于工作区。
相关命令:
git reset --soft HEAD^
: 撤销最后一次提交
git reset --soft [commit id]
: 将HEAD指针指向commit id对应的提交
git reset --hard HEAD~[arg]
: 此命令会重置工作区、缓存区的内容与当前分支下HEAD指向的节点一致,目标表节点到回滚前的改动均被销毁。
相关命令:
git reset --hard HEAD^
: 重置到上一次提交
git reset --hard [commit id]
: 重置到commit id代表的提交
reset --mixed
:如果reset不加参数,默认使用mixed参数,清空缓存区使其与仓库区一致,但是保留工作区。
其他命令:
- git remote
git remote -v
: 查看当前关联远程仓库的详细信息
git remote remove <name>
: 删除与name的远程仓库的关联
git remote add <url>
: 与url所在的远程仓库关联
- 删除
git rm
:删除工作区文件
git rm --cached
: 删除缓存区的文件,不删除工作区
- git commit
-m " ": 增加描述
-a :将已追踪的文件的修改或删除操作提交
-amend: 追加提交但是不追加commit id
附一个讲得很好的git工作原理的视频(中文):
这才是真正的 Git——Git 内部原理揭秘!(freeCodeConf 2019 深圳站)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com![576700dd0958dffae24d9adb91f39e44.png](https://i-blog.csdnimg.cn/blog_migrate/1b092287c26b9fc3d7c085f4679541b8.jpeg)