陈拓 chentuo@ms.xab.ac.cn 2020/03/06-2020/03/08
0. 概述
Gitee和GitHub都是基于Git的代码管理平台。
Github是国外的,Gitee是国内的。
Gitee和GitHub都要用Git命令操作。
要使用Git命令先要在电脑上安装Git工具软件。
下面在树莓派上以Gitee为例展示Git的基本操作。
1. 安装git
在电脑上用putty登录树莓派,如果不熟悉请看《电脑连接树莓派3B+》https://blog.csdn.net/chentuo2000/article/details/103332186
- 测试git --version
![9ceecfa50b774a254dd65a0a013064ee.png](https://i-blog.csdnimg.cn/blog_migrate/d8d477fcdfd415c0db03e66674aebab1.png)
如果没有安装。
- 安装git
sudo apt-get install git
![a8ae5f721646b13093811d3cb12e854d.png](https://i-blog.csdnimg.cn/blog_migrate/8e80c1ebd63f412bcc3bd001dc30d42c.png)
2. 在码云gitee上创建一个仓库
![c18fb97dc5f1187d9785c201feabb25e.png](https://i-blog.csdnimg.cn/blog_migrate/74c7ec983cbf178aa6bc02f760d61c4e.png)
https://gitee.com/chentuo2000/My-ESP8266
3. Git 全局设置
- 用户名
第一步,你需要告诉git你的名字,这个名字会出现在你的提交记录中。
git config --global user.name "chentuo"
然后是你的Email,同样,这个Email也会出现在你的提交记录中,请尽量保持此Email和您的码云的注册Email一致。
git config --global user.email "chentuo@ms.xab.ac.cn"
![814b403fc76fbe0520eec1f3dc62c7a9.png](https://i-blog.csdnimg.cn/blog_migrate/c1708e48729b5ef24c855c7b48867640.png)
- 查看全局设置
ls -la
![f5ddce9166e59e2414482e88f335bcfb.png](https://i-blog.csdnimg.cn/blog_migrate/cdfc7f0b0169932d06a00a49b606392e.png)
全局设置保存在.gitconfig中,查看全局设置cat .gitconfig。
![360681e58b6fff151de4cfae7b32855e.png](https://i-blog.csdnimg.cn/blog_migrate/c030636315e148096e2eba108c7afbe6.png)
4. Git 基本操作
4.1 clone
把我在gitee上创建的仓库克隆到本地。
git clone https://gitee.com/chentuo2000/My-ESP8266.git
![89a1236591097084cb536766afbfbeea.png](https://i-blog.csdnimg.cn/blog_migrate/637e279a284c22d82c0f170e8b4bf377.png)
ls –l
![423cae8b12a2ba06ca030c46433abddf.png](https://i-blog.csdnimg.cn/blog_migrate/d9f4c32187362b62784cb208f573cf06.png)
cd My-ESP8266/
![2d9c364baefcbfd4027e535fb0b2ece6.png](https://i-blog.csdnimg.cn/blog_migrate/b0a354427394e264a74761f8ae25c182.png)
这个目录和普通的目录有什么不同呢?ls –la
![e96f3dcdb6ae09332387e81f4930e1ea.png](https://i-blog.csdnimg.cn/blog_migrate/918ed9f67c9d06bbfa1418e43e41eb6a.png)
它比普通的目录多了一个.git目录,里面存放仓库信息。
4.2 pull
在云端创建一个子目录tarballs,用git pull命令同步到本地仓库。
git pull
![370c9dad1422f04c6e7bce08434ba1da.png](https://i-blog.csdnimg.cn/blog_migrate/1515a9e4bd03f70eac2bbd1bc82cf3d5.png)
![7599139f4ad5c096d15659d4197c015d.png](https://i-blog.csdnimg.cn/blog_migrate/391b75dd0824910678e1f247c46faafd.png)
4.3 push
往本地目录tarballs中复制一个文件。
cp esp/esp-open-sdk/./crosstool-NG/.build/tarballs/binutils-2.25.1.tar.gz My-ESP8266/tarballs/
![983067c56e2d86b5b136352373c28233.png](https://i-blog.csdnimg.cn/blog_migrate/3a46ea2e162121a0b165fd50d69212f5.png)
cd My-ESP8266/
- git status
命令用于查看项目的当前状态。
![28a84d5a47f3be617524b829f995306e.png](https://i-blog.csdnimg.cn/blog_migrate/2b8be37fa3cb75c930e4ee91e1432b68.png)
- git add
命令将该文件添加到缓存。
git add tarballs/binutils-2.25.1.tar.gz
![a943b0920ac22fee755078fb9bd7627a.png](https://i-blog.csdnimg.cn/blog_migrate/b185d3b88d18fe4a13176df6d897c916.png)
再看看状态的变化,状态命令加-sb参数,以获得简短的结果输出。
git status -sb
![aaa5e15dea05f70e1f0e2138b414e67b.png](https://i-blog.csdnimg.cn/blog_migrate/2d05da431f18b94f33082c1586945126.png)
绿色的A表示Add成功。
- git commit
然后使用git commit -m "注释"命令将add过的内容提交到本地仓库,并添加一些注释信息,方便阅读。
git commit -m "编译esp-open-sdk的依赖库"
![98a7aa794d37a872ac7bf013ae970759.png](https://i-blog.csdnimg.cn/blog_migrate/b64bdaeb0ca77d1b125ecd720626e605.png)
再看看状态:
git status -sb
![2ecbbaf7f99882467f168fe94061ddd4.png](https://i-blog.csdnimg.cn/blog_migrate/b7296ee74693b474b7d553dcf9616fea.png)
git status
![56377e0ae5a286449ff37805f47ca96c.png](https://i-blog.csdnimg.cn/blog_migrate/fe4039a219951ee7593d67dd3115a19f.png)
提示:在主分区,1个提交的分支前缀是origin/master,使用git push发布本地提交。
工作树已经清空了。
- git push
同步云端仓库git push
![2fd25cae23ac4ac4e94e3950a9e5dbae.png](https://i-blog.csdnimg.cn/blog_migrate/60d6fc9b51d0cc6b931fbe203eefd9bd.png)
- 查看状态
git status
git status -sb
![a2b62c146c4f4bc30652267a72998806.png](https://i-blog.csdnimg.cn/blog_migrate/0758d8a3785274ed1302b7618cc7eac6.png)
上传完成,没有提交,工作树清空。
- 看看云端
![3adbd59cc509a6612b8000fc099aba83.png](https://i-blog.csdnimg.cn/blog_migrate/52154e225415b1db216d696b18e34b90.png)
5. 多文件上传
注意:一次上传有100MB的限制。
5.1工作区,缓存区,本地仓库区,云端仓库
工作区就是上面我们git clone下来的整个项目目录My-ESP8266。
缓存区是一个隐藏的区域,用git add添加。
本地仓库也是隐藏的,用git commit命令将缓存区的文件提交到本地仓库。
用git push将本地仓库同步到云端。
5.2 git add多个文件
上传文件列表ls -l tarballs/
![a1b57e74b27637197ede1e5971091421.png](https://i-blog.csdnimg.cn/blog_migrate/79874c17f64a89ec2cc303dc3831d283.png)
- 添加多个文件到缓存
git add file_1 file_2 file_3
多个文件用 空格 隔开。
文件比较多时可以使用通配符*添加所需要的文件。
也可以整个目录add,像这样:git add . 意思是把当前目录(.表示当前目录)里面的变动都加到缓存。
或者用git add tarballs/g*将目录tarballs中以g开头的文件添加到缓存。
或者像下面。
- 添加目录tarballs到缓存
git add tarballs
![d008df79fdf3debe6105d4b3576c03bd.png](https://i-blog.csdnimg.cn/blog_migrate/7ebf07b6d8119435c085c3af0729270c.png)
git status
![b90de701d257ba0dfa2d0ba7e1ad875d.png](https://i-blog.csdnimg.cn/blog_migrate/c2ddaaad375b31bab9da56935d63c6e4.png)
git status –sb
![0a144856fb365e85ae79aaefb2ea83dc.png](https://i-blog.csdnimg.cn/blog_migrate/009e9597da538322ef7c458d22c111e3.png)
看看目录
![a1b57e74b27637197ede1e5971091421.png](https://i-blog.csdnimg.cn/blog_migrate/79874c17f64a89ec2cc303dc3831d283.png)
可以看到,只添加了新文件,之前我们上传过的文件binutils-2.25.1.tar.gz,因为没有变化,所以并没有添加到缓存。
- git reset HEAD
用use git reset HEAD <file>命令可以从缓存移除文件。例如:
git reset HEAD tarballs/cloog-0.18.4.tar.gz
![d49f1cc545729a876294c0d7e0951ae8.png](https://i-blog.csdnimg.cn/blog_migrate/07c5847f3c70f1e58360350a49311ffc.png)
git status
![dbb146d4ef323b011c224fcd46acd757.png](https://i-blog.csdnimg.cn/blog_migrate/da776d0b5c924b0fd4fe0f02ce6dffa6.png)
git status -sb
![85fc528d84e809c2c94db59bac376a52.png](https://i-blog.csdnimg.cn/blog_migrate/13604e6297581bb1a0d20eaa86d2212d.png)
可以看到tarballs/cloog-0.18.4.tar.gz已经从缓存中移除了。
git reset命令中的HEAD指向当前我们所在版本库,是一个地址指针的头。
看看日志git log
![3833c243c2d964b3c189ae2964a1f774.png](https://i-blog.csdnimg.cn/blog_migrate/94a31ea52a9fa2a9576b749350f9cf7f.png)
有3个commit,每个commit对应一个指针:
e07cfbf37e2af1fc1ded1b196178b0231e88a9c4
2eae215d0213343fa07f66a5d1116e24ae2f8406
d9c752f40aa055831eefa02b36b5e928c7fca155
再看看简短日志git log –oneline(一条提交信息用一行显示)
![47559acc5c098e65fa29fbe5fa5aa4df.png](https://i-blog.csdnimg.cn/blog_migrate/fe432c53e9040b9b786455e15f1ffee4.png)
e07cfbf、2eae215、d9c752f是3个指针地址的头,HEAR当前指向master地址的头e07cfbf
所以下面两句作用是一样的。
git reset HEAD tarballs/cloog-0.18.4.tar.gz
git reset e07cfbf tarballs/cloog-0.18.4.tar.gz
例如:
git reset e07cfbf tarballs/expat-2.1.0.tar.gz
![748f70351517ca73be9a4ac256af2eb3.png](https://i-blog.csdnimg.cn/blog_migrate/3251555b566c19f8b80d4e47613e51ee.png)
git status -sb
![572170591aa399842a9bea95819c61ea.png](https://i-blog.csdnimg.cn/blog_migrate/eef769d44f04f90b49a239486f3a8d9b.png)
缓存清空了,有2个未操作的新文件。
之前我们上传过的文件binutils-2.25.1.tar.gz有问题,重新下载,和之前比较大小有变化:
![8c3ac11d0c9cd78df573875792848cd5.png](https://i-blog.csdnimg.cn/blog_migrate/306ea23c8619958931d83aff93e80949.png)
添加目录tarballs到缓存
git add tarballs
![e9b70055e6c8b68d92a464657f7c36db.png](https://i-blog.csdnimg.cn/blog_migrate/0820e320266b1121620f1cf00e41f3b0.png)
看看状态:
![a9acc21384fabac73eb6847248c0c349.png](https://i-blog.csdnimg.cn/blog_migrate/4932eb993e50ee463fdb97e85319e235.png)
tarballs/binutils-2.25.1.tar.gz是修改过Modified的文件
tarballs/cloog-0.18.4.tar.gz
tarballs/expat-2.1.0.tar.gz
是新Add的文件,也就是没有和云端同步过的文件。
5.3 git commit多个文件
git commit -m '提交多个文件'
![86492afed8f200499d16334683b30262.png](https://i-blog.csdnimg.cn/blog_migrate/b26bb552c96f34f68d551753d065e7c4.png)
看状态:
![022e083d442da2ed10a5e0a3d47d82d2.png](https://i-blog.csdnimg.cn/blog_migrate/dde5a3e7e1d4f6a8a62a9038fdeb76a4.png)
可以用git commit --amend打开编辑器修改。
如果想撤回,可以用:
git reset --soft撤回git commit –m
git reset --mix撤回git commit –m和git add
git reset –-hard回退git commit –m、git add和工作区
5.4 git push多个文件
同步云端仓库git push
![75aae13b468a3de5f088768997157347.png](https://i-blog.csdnimg.cn/blog_migrate/67d999fb214b6c10e97d12f9785f69cc.png)
- 看状态
![1343c089a7cc90d8831a16de367ff266.png](https://i-blog.csdnimg.cn/blog_migrate/41af1861a6c8a5554a8861b6cefc0fc8.png)
- 看云端仓库
![6457c265497a7dbb8ae2aa8ed6098e8b.png](https://i-blog.csdnimg.cn/blog_migrate/6ca355929dcbe5612a0c449884f9b2b0.png)
5.5 回退
![b2fa21020d06ba44b62e21f7597ecc31.png](https://i-blog.csdnimg.cn/blog_migrate/63baaa744fead7a90868dd130fa9aa58.png)
Your branch is ahead of 'origin/master' by 2 commits.
这表示在你之前已经有2个commit而没有push到远程分支上,所以需要先git push origin **将本地分支提到远程仓库。
如果不想同步云端,也可以用git reset --hard HEAD~x取消,这里的x表示的就是在这之前已经有多少次的提交,这句命令的意思就是直接回退到x 个commit之前
注意:这两次提交所改动的代码文件都没有了,慎用!
在我们这里:
git reset --hard HEAD~2
![7feb0d280be6137b1910a0e4dad998f6.png](https://i-blog.csdnimg.cn/blog_migrate/787d7447d17b4e43b678151b9fddf806.png)
git status
![3ea8a3eaa6279e0219be647fb07aab91.png](https://i-blog.csdnimg.cn/blog_migrate/e9beaca5906ce39758d4439b9efe4292.png)
git status -sb
![e5ee84d743d470e30bddd389990ec91a.png](https://i-blog.csdnimg.cn/blog_migrate/879abd2a243bba8a036224d9c9a67cc6.png)
缓存已经清空了,目录中相关的文件也删除了。
6. 在本地创建一个仓库
在上面的操作中我们先在gitee上创建仓库,再克隆到本地。如果我们在本地已经有了一个项目目录要上传的gitee上,可以像下面这样操作。
- 创建本地仓库
mkdir My-ESP32
cd My-ESP32
git init
![60db3e221fe38f351cf7c58e219fe6f3.png](https://i-blog.csdnimg.cn/blog_migrate/203e1ab8727b0f110a70db29c250cbec.png)
git init的功能就是将本地目录初始化为本地仓库。
查看目录ls –la
![4832826c09d8367209468075aacbcb4a.png](https://i-blog.csdnimg.cn/blog_migrate/e8f1a435f4e1e8374156f7fea6ad58a3.png)
多了一个隐藏目录.git
查看状态git status
![60fc705e83af481adacd4959d1423ce3.png](https://i-blog.csdnimg.cn/blog_migrate/00266cfbf3271b2b37a95c89321cef00.png)
- 创建一个文件
touch README.md
nano README.md
![15bdb68cf44b15b93ab0a3f174f1242d.png](https://i-blog.csdnimg.cn/blog_migrate/9050aa6f5d15eee88826e2157c3166e7.png)
写一些内容,保存,退出。
查看状态git status
![eb8e44829b88dfcecdef5591c230cefa.png](https://i-blog.csdnimg.cn/blog_migrate/99fb215e684eff8a7bba269fdfcac6d7.png)
git status –sb
![f4048fb17a7d7b378a2e172f91708c06.png](https://i-blog.csdnimg.cn/blog_migrate/f808c0ab36745ffd2406bef4160cec75.png)
?? README.md是一个新文件。
- git add README.md
![3cc585505b1dfe305725677cddacd4de.png](https://i-blog.csdnimg.cn/blog_migrate/789314726d0266b0730907ffd80a3029.png)
查看状态:
![972ebc8a0f15f0fcaca68709ac2ed707.png](https://i-blog.csdnimg.cn/blog_migrate/3fd1ef1d131028aef1fa408853df3629.png)
- git commit -m "first commit"
![13e7c9fc31e42e47e6c7c28ff3d79187.png](https://i-blog.csdnimg.cn/blog_migrate/c239742b0125516ff873ad56cf94d059.png)
查看状态:
![257f485c3ab0cc895b809c30106cee2c.png](https://i-blog.csdnimg.cn/blog_migrate/d43d1551554b63d8baacc0fb71706eb8.png)
- 创建云端仓库
![f89391fb4ab419776b13e44b46cda389.png](https://i-blog.csdnimg.cn/blog_migrate/c54614f47dff6d2f00ebb2199f166748.png)
- 关联本地仓库和云端仓库
git remote add origin https://gitee.com/chentuo2000/My-ESP32.git
![a0e1afb6e2452f4be08dbd988a592e3f.png](https://i-blog.csdnimg.cn/blog_migrate/d6c098c5ad3a4bca2050f59c5ac83b4b.png)
执行完这个命令在本地的.git/config中写了远程信息[remote "origin"]
![c6695a0a78a644741d3ce07b0140f94d.png](https://i-blog.csdnimg.cn/blog_migrate/b67f0d09be1137f36c0d6c2b1b17e2ea.png)
Origin是Git默认的远程仓库名字,也可以改成别的名字,但最好是遵从习惯,这样你一看到origin就知道是远程仓库。
- 同步云端仓库
git push -u origin master
![f7e6bd054c23ae0eebbc9d7dff4dda23.png](https://i-blog.csdnimg.cn/blog_migrate/96a806022d83c2cad48a8953cc377e90.png)
master是默认的本地分支,origin/master是默认远程分支origin/master。
查看云端仓库:
![26153f054643b5b101bf7ac8b7b3bb7d.png](https://i-blog.csdnimg.cn/blog_migrate/9a9db723da49b1f8153fca6949008e28.png)
7. 分支
7.1 默认分支
Origin默认远程服务器
origin/master默认远程分支
master默认本地分支
7.2 分支的用途
- 多人开发时
为了不受其他开发人员的影响,每个人可以在主分支上建立自己的专属分支,自己的开发工作完成后可以将自己分支上的工作合并到主分支。
因为每一次提交的历史记录都会被保存,所以当发生问题时,定位和修改造成问题的提交就容易多了。
Git分支是由指针管理的,所以创建、切换、合并、删除分支都非常快,非常适合大型项目的开发。
主分支(默认创建的Master分支)只用来发布重大版本(对于每个版本可以创建不同的标签,以便于查找),日常开发应该在另一条分支上进行。
- 多种方案时
例如,在一个项目的进行中,你遇到了一个问题,解决方案不确定,但是你不希望因此影响到当前的开发,那么你可以为此创建一个分支,分支包含目前主干上的所有内容,然后在分支上测试你的方案,而丝毫不影响主干的进行;如果可行那么可以通过合并分支功能将你的更新应用到主干,反之你可以放弃它。
7.3 分支操作
- 查看分支
- 查看本地分支git branch
- 查看远程分支git branch –-r
- 查看所有分支git branch –-all
分支前有一个 * 号代表当前分支。
- 创建并切换分支
- 创建分支:git branch <分支名称>
- 切换分支:git checkout <分支名称>
- 创建并切换分支:git checkout -b <分支名称>
- 合并分支
- 先切换到master分支:git checkout master
- 再将分支的代码合并到master:git merge <分支名称>
在合并分支的时候如果代码会有冲突,需要自己去处理这些冲突。
- 删除分支
- 删除本地分支:git branch -d <分支名称>
![dc1163335b0bbc0b15de71f3f75e25b7.png](https://i-blog.csdnimg.cn/blog_migrate/6b7adc87548a413ea17c30d0c5c59010.png)
2. 删除远程分支:git push origin <分支名称>
- 恢复分支
误删的分支可以恢复。
- 使用git log查出分支的提交号。
- git branch <分支名称> <提交号>,
即创建提交号历史版本的一个分支,分支名称随意。
- 查询分支
- 查询分支:git log
- 查询分支简短显示:git log –oneline
- 查看分支图:git log --graph
可以带参数:
git log --graph --pretty=oneline --abbrev-commit
- 重命名分支
git branch -m <当前分支名> <新的分支名>
其他的用法请看后面的参考文档。
参考文档
- Git官方文档https://git-scm.com/book/zh/v2
- Gitee官方文档https://gitee.com/oschina/git-osc/wikis/%E5%B8%AE%E5%8A%A9
- git操作手册https://www.jianshu.com/p/05a22c6a4131
- gitee 命令集合https://www.cnblogs.com/TF511/articles/10645857.html
- Git使用教程---以Gitee码云为例https://www.jianshu.com/p/a146bd847a8d
- git分支https://blog.csdn.net/qq_36672905/article/details/82776293?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task