正点原子 发表于 2022-1-4 15:27:57

快速掌握Git分布式系统操作

本帖最后由 正点原子 于 2022-1-7 17:28 编辑

以下文章来源于:公众号:开源电子网,读取更多技术文章,请扫码关注



快速掌握Git分布式系统操作

          随着这几年 GitHub的流行,Git已经是一个程序员逃不过的技术项,但很多人却纷纷倒在了学习它的路上。而且,出于工作原因而不得不用Git 的人,有不少在工作中对Git 也是能不用就不用,生怕哪个命令用错就把公司的代码库毁掉了。而那些对Git 掌握得比较好的少数人,就像团队中的神一样,在同事遇到Git 相关的问题的时候用各种风骚操作来拯救队友于水火,学不会、学不好Git 的人,其实多数并不是不愿意学。很多人都会尝试去网上找Git 教程、去社区请教高手、在公司咨询同事,但转了一大圈下来,依然没有搞懂,甚至有可能越来越糊涂。
      Git是目前世界上最先进的分布式版本控制系统。通俗来讲让开发人员能够更加方便的查看和操作你开发的项目的一种工具。

一. 为什么要学习Git或者svn

      现在很多物联网企业招聘嵌入式工程师时候,必须具备的硬性的要求,那就是掌握Git或者svn的操作。



二. Git或者svn区别?

       SVN:是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。


      


       Git:是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。


         


三. Git安装

       git官网:https://git-scm.com/,安装步骤:无脑下一步就行了。


四. Git常用的命令

       git init                           //初始化并创建一个仓库

       git add                            //添加所有文件到暂存区

       git commit -m "提交说明"//提交暂存区中的内容到本地仓库

       git log                            //查看提交的版本

       git status                     //查看所有文件的状态

       git status       //查看指定文件的状态


五. Git基本的操作

       第一步:gitinit----创建仓库


         


      在指定的代码工程,右键打开GitBash Here输入gitinit命令创建一个仓库。


      


      第二步:gitadd *加所有文件到暂存区


      

      红色代表没有提交到仓库中,只是存储在暂存区


      第三步:gitcommit -m "提交说明"把暂存区中的内容到本地仓库


      

      显然它们变绿色了,证明已经提交到本地仓库当中。

      如果我们修改某一个文件,会发生什么?


      

   显然readme.txt文件显示红色了,首先把该文件到暂存区,然后把暂存区中的内容到本地仓库。


      

   注意:先使用gitadd * 或者 gitadd readme.txt把该文件提交到暂存区,然后使用gitcommit -m "提交说明"把暂存区中的内容到本地仓库。


       第四步:使用git log 查看提交的历史记录


         

      上述可知:

    “修改了readme.txt“版本的ID是5fc7b03da38936495c87b971fd3c41a96aa5d191。

    “第一次创建Git”版本ID是6c3cc9324b5c42689f37efabda7f40a18f612ab2。

      怎么返回上一个版本呢?

两种方法:

       第一种:gitreset --hardHEAD^退回上一次的提交的版本,例如目前是“修改了readme.txt版本“,然后上一个版本是“第一次创建Git”


      


      第二种:gitreset --hard commit id(commit id为版本ID)

    “修改了readme.txt“版本的ID是
       5fc7b03da38936495c87b971fd3c41a96aa5d191。


   “第一次创建Git”版本ID是
       6c3cc9324b5c42689f37efabda7f40a18f612ab2。

       注意:commitid填写前五位即可:


      


六.什么是Git分支与合并

      1.分支与合并:


         


       分支:从master(主树干)分离出来的,显然一开始肯定是拷贝一模一样的工程,然后后期我们在分支修改的代码,不影响其他分支的代码和主树干的代码,这里必须要注意。

       合并:必须主干和dev(分支)合并,不能同级的分支与分支合并,这里必须注意。

       注意:合并分支必须HEAD指向主干才能合并指定的分支,不能HEAD指向分支合并同级分支操作。


         


       当HEAD指向der,只能和1分支合并,不能同等级的分支,当HEAD指向master可以与der、der1、der2、1、2、3分支合并。

       2.Git分支与合并相关命令:

       git branch                           //查看本地分支

       git branch    //新建一个分支,但依然停留在当前分支

       git checkout -b        //新建一个分支,并切换到该分支

       git checkout //切换到指定分支,并更新工作区

       git branch -d //删除本地分支

       git merge                  //合并指定分支到当前分支


       3.Git分支与合并实验

       第一步:gitbranch 创建分支


         

      这里我们创建了三个分支,但是目前HRAD还是指向Master(主树干)。



      第二步:gitcheckout 切换指定得分支

      

      原本指向master(主树干),显然现在指向dev分支。

      注意:分支修改了工程的代码,不能影响master主树干的工程的代码

      第三步:gitmerge 合并操作

      例如我们在dev的分支的readme.txt修改为890,而主树干(master)的reame.txt为12345678,那么我们把dev和master合并,readme.txt文件会发生什么呢。


         


      显然主树干(master)的reame.txt为12345678内容修改成890。

      掌握知识:


         

       当HEAD指向der,只能和1分支合并,不能同等级的分支,当HEAD指向master可以与der、der1、der2、1、2、3分支合并。


   七. 如何本地仓库上存远程仓库


         


   必须掌握的网络常用命令解析

   git clone    //获取网络上的远程仓库

   git push origin本地分支名字:gitee网络分支//把当前分支放到网上,如网络分支不存在则网络端自动创建一个分支!

   git push origin-d BranchName//删除远程分支
   ssh-keygen -trsa //生成本机rsa加密密钥


   ①本地仓库和远程仓库连接必须绑定自己的电脑

   远程仓库:gitlab、github、gitee。

   (由于github是外国网址,所以速度较慢),所以我们使用Gitee作为我们的远程仓库。

   ②打开Gitee的官方网址为:https://gitee.com/注册账号(自行注册)

      

  ③远程仓库绑定本地主机

  第一步:找到C盘路径下的.ssh文件夹,小编是:



         


       第二步:右键打开“GitBash Here”

   在命令行窗口输入“ssh-keygen-t rsa”回车确定后,一直默认按回车即可:

         
  


       .ssh文件夹下多了两个文件:



         


       第三步:使用3. 用”记事本”或者”Notepad++”打开“id_rsa.pub”文件,复制里面的内容到Gitee仓库安全设置“SSH公钥”


         


   第四步:确定并输入密码,然后出现您当前的SSH公钥数:


         


  ④Gitee上创建一个仓库,并将它复制到本地,然后实现云端和本地的同步!步骤如下所示:

  第一步:Gitee上创建一个仓库:


         


   第二步:填写仓库的相关信息,(开源许可证根据自己的情况选择),读者也可以选择“许可证向导”查看所有的许可证的区别!


      
  


      点击创建,此时Gitee会自动跳转到新创建的仓库!

  第三步:点击“克隆/下载”,然后选择HTTPS协议,复制下载链接,然后在我们的工程右键打开“GitBash Here”,输入gitclon 获取网络上的远程仓库:


         

         


  显然我们在工程发现一个文件夹:

         

  第四步:把所有的文件夹放到xiaofeng_test文件夹中:


      


  第五步:右键打开GitBash here,输入“gitadd *”,然后输入“gitcommit -m “名称””提交版本:

      

      

      
  
       ⑤如果我们创建分支会发生什么?


         


    “git push origin本地分支名字:gitee网络分支”:


         


         




八. 如何执行clone将仓库复制到本地?


  第一步:打开远程仓库,获取相应的SSH:


      


   第二步:在本地创建一个文件夹,右键打开“GitBash Here”输入“gitclone SHH”:



         


  显然我们把远程仓库的工程拉取到我们本地电脑当中

(注意:这个工程已经是一个仓库了,我们修改某些代码提交即可),

      如何提交,请看上面的步奏。


总结

  Git的用法是非常实用的,一般物联网企业都会要求员工操作Git分布式系统,在企业中,我们的项目工程一般在远程仓库获取,然后写完代码就必须提交给远程仓库,这样管理人员很简便知道自己修改了什么,也可以返回上一次修改的地方,如果我们的工程在本地不小心删除了,那么我们可以从远程仓库找到该工程(前提我们做完必须提交版本),不然只能从头开始做了。


keshipt 发表于 2022-1-4 15:51:15

很详细,点赞

kitten 发表于 2022-1-4 15:58:51

用Git只有一个好处,可以防止程序员删库跑路,或者离职拒绝交接代码。

dgtg 发表于 2022-1-4 17:21:44

学习了,谢谢正点原子!
说真的,我就属于楼主开头说的情况,一直用不会...哈哈....

rei1984 发表于 2022-1-4 17:36:44

本帖最后由 rei1984 于 2022-1-4 17:38 编辑

第三步:gitmerge 合并操作

      例如我们在dev的分支的readme.txt修改为890,而主树干(master)的reame.txt为12345678,那么我们把dev和master合并,readme.txt文件会发生什么呢。


         


      显然主树干(master)的reame.txt为12345678内容修改成890。


---------------------------------------

这里写的有点问题。如果在 HEAD 指向 master ,然后用master 去mergedev 。    merger的结果怎么是instead file 的关系,而不是追加 内容到最后的 关系????



merge 这块还是很复杂的。涉及到 代码删除的话,   随时都有可能遇到bug啊

lyz3432 发表于 2022-1-4 17:44:16

git rebasegit --amend 也经常用

PPS 发表于 2022-1-4 17:59:07

kitten 发表于 2022-1-4 15:58
用Git只有一个好处,可以防止程序员删库跑路,或者离职拒绝交接代码。

你应该在小公司或者管理不完善的公司工作,因为你不知道GIT/SVN用于多人协作和版本管理时有多强大,很多非编程类的软件都集成了SVN用于版本管理。

G.ai 发表于 2022-1-4 18:09:27

很实用,楼主有PDF版本的么?

dukelec 发表于 2022-1-4 18:24:32

本帖最后由 dukelec 于 2022-1-4 18:26 编辑

git 教學最好帶上 git 自帶的圖形工具 gitk
帶上參數的常用命令是 gitk --all,我非常熟 git 都離不開 gitk
(以及 gitk 默認使用 meld 做為文本對比工具,但這個需要單獨安裝)

zirong0804 发表于 2022-1-4 20:21:59

谢谢分享

lxvtag 发表于 2022-1-4 21:16:09

上面很多的命令的空格没有了,git add    git commit

qwe2231695 发表于 2022-1-4 23:53:13

VScode 的 git graph 很好用,直接看图操作

boyiee 发表于 2022-1-5 09:26:30

tortoiseGIT 图形化,操作更友好,都是兼容的。

icoyool 发表于 2022-1-5 10:20:51

好像真有用, 赶紧撤!别被老板看到了

yixin1851 发表于 2022-1-5 20:57:07

远程仓库和SVN的集中式管理有啥区别呢?

armku 发表于 2022-1-5 21:22:02

yixin1851 发表于 2022-1-5 20:57
远程仓库和SVN的集中式管理有啥区别呢?

SVN没有网络用不了,git在本地可以使用,有网时再同步到网上。

astankvai 发表于 2022-1-6 14:17:17

kitten 发表于 2022-1-4 15:58
用Git只有一个好处,可以防止程序员删库跑路,或者离职拒绝交接代码。

这就错了, 维护和检查同样好用。
GIT的目的是版本管理。。。

kitten 发表于 2022-1-6 14:27:29

astankvai 发表于 2022-1-6 14:17
这就错了, 维护和检查同样好用。
GIT的目的是版本管理。。。

写个stm32的代码,啥依赖没有,用啥版本管理,直接压缩包整个工程压一下,不比这个好使?

bbbbbv 发表于 2022-1-6 16:01:02

谢谢分享。

denike 发表于 2022-1-6 16:36:41

学习了。谢谢分享

flystone 发表于 2022-1-6 16:56:56

git是个好东西,但是,太复杂了,学了好久都学不会。 文章里讲的都是常规操作,但是实际使用过程,完全不是这么回事,冲突一堆,根本解决不了,真的是害怕一不小心真把公司代码库删了。。。

wudicgi 发表于 2022-1-6 19:50:47

上 TortoiseGit 吧, Linux 下收费的都找不到这么好用的软件, Windows 下有免费的还不用

yixin1851 发表于 2022-1-6 20:12:17

当我学会用GIT的时候,已经不写代码了,好遗憾。

hugohehuan 发表于 2022-1-7 00:55:52

想无脑跟踪某个仓库更新,而不提交本地任何变更该怎么做呢?

正点原子 发表于 2022-1-7 17:01:54

rei1984 发表于 2022-1-4 17:36
第三步:gitmerge 合并操作

      例如我们在dev的分支的readme.txt修改为890,而主树干(master)的reame.t ...

可以使用git log 查看提交版本,那么可以返回上一次提交的的

正点原子 发表于 2022-1-7 17:03:07

yixin1851 发表于 2022-1-6 20:12
当我学会用GIT的时候,已经不写代码了,好遗憾。

现在从事哪方面工作 了

正点原子 发表于 2022-1-7 17:03:53

本帖最后由 正点原子 于 2022-1-7 17:27 编辑

hugohehuan 发表于 2022-1-7 00:55
想无脑跟踪某个仓库更新,而不提交本地任何变更该怎么做呢?
git log 查询仓库更新咯

rei1984 发表于 2022-1-8 07:50:37

给lz 提点建议:

要补充如下内容
1.先建立本地仓库。然后再建立远程仓库,如何让这2个仓库交互起来


2.先在远程建立仓库。clone 拉取到本地,然后本地和远程仓库如何交互。

3.git 里面的origin 其实是约定俗成的写法。 origin 可以改成任意字符串,这点要在说明下

yixin1851 发表于 2022-1-8 08:58:45

正点原子 发表于 2022-1-7 17:03
现在从事哪方面工作 了

目前在从事半导体测试工作。
原子总,您对半岛体测试设备相关的东西了解吗?
这个行业国产设备刚起步,千亿级别的市场。

foxpro2005 发表于 2022-1-8 14:07:47

顶力推荐小乌龟,TortoiseGit,一直使用的神器!

Pjm2008 发表于 2022-1-8 15:08:50

顶楼上小乌龟完美解放命令行,用了快十年了

涵潇舒雅 发表于 2022-1-8 15:12:00

点赞,收藏

chenchaoting 发表于 2022-1-8 16:02:41

yixin1851 发表于 2022-1-8 08:58
目前在从事半导体测试工作。
原子总,您对半岛体测试设备相关的东西了解吗?
这个行业国产设备刚起步,千 ...

比如哪个,测试哪些项目

cantonguy 发表于 2022-1-8 23:47:59

很好奇,那些用git的人都是这样打命令行的吗?不会搞不懂?不会效率低?

foxpro2005 发表于 2022-1-11 18:58:45

cantonguy 发表于 2022-1-8 23:47
很好奇,那些用git的人都是这样打命令行的吗?不会搞不懂?不会效率低?

git也有自带的图形化工具,但不好用, 小乌龟这个图形化的git工具非常好用啊

dukelec 发表于 2022-1-11 19:33:34

本帖最后由 dukelec 于 2022-1-11 21:46 编辑

cantonguy 发表于 2022-1-8 23:47
很好奇,那些用git的人都是这样打命令行的吗?不会搞不懂?不会效率低?

git 也沒多少命令,常用的就幾個而已,所以打命令效率不低
git 自帶的 gitk 就足夠用,gitk 只是用來查看狀態,不操作 git

git 的核心是,如何規劃一個項目,譬如如何規劃多個分支、日後如何合併,多人如何合作,而不是具體的 git 操作
就好比寫軟件,重點是如何規劃框架結構,而不是敲代碼

通常,依賴第三方圖形工具操作 git 的工程師,很少能到規劃 git 庫框架結構的程度

yixin1851 发表于 2022-1-12 08:28:15

chenchaoting 发表于 2022-1-8 16:02
比如哪个,测试哪些项目

我指的是半导体芯片的专业测试设备,全球两巨头都是千亿市值,目前国内才起步不久,国产替代是个不错的机会。

rei1984 发表于 2022-1-13 06:32:57

dukelec 发表于 2022-1-11 19:33
git 也沒多少命令,常用的就幾個而已,所以打命令效率不低
git 自帶的 gitk 就足夠用,gitk 只是用來查看 ...

比较认同最后几句话。git 其实只是一个分布式版本管理软件。   仅此而已

和githubgitee没有关系。这2者只是提供云端的空间。不用github gitee 一样是可以版本管理的。

最好的一点是。git 比较绿色。 一切都存在在.git文件夹中。 不会污染其他目录。想擦干屁股,直接删除.git就行了

以上是我对git的理解。欢迎补充

yixin1851 发表于 2022-1-13 22:11:40

我们做文档,经常一个excel文档要修改N次,每次我都是copy备份。今天我用git来管理了一下,发现是清爽了,但是整个目录的大小与多次Copy备份的大小差不多呀。
请教下,怎么删除本地不需要的版本记录呢?以减小文件的占用空间的大小。

tang_qianfeng 发表于 2022-1-13 23:51:53

我用smartgit

rei1984 发表于 2022-1-14 20:11:54

yixin1851 发表于 2022-1-13 22:11
我们做文档,经常一个excel文档要修改N次,每次我都是copy备份。今天我用git来管理了一下,发现是清爽了, ...

git branch -d    xxx_dev


如果是master主枝干。不建议删除中间的 修改记录。或者还有一个办法, copy 一份,删除.git.最后重新进行版本管理

dukelec 发表于 2022-1-14 23:15:29

本帖最后由 dukelec 于 2022-1-14 23:20 编辑

yixin1851 发表于 2022-1-13 22:11
我们做文档,经常一个excel文档要修改N次,每次我都是copy备份。今天我用git来管理了一下,发现是清爽了, ...

無論是什麼數據(文本或非文本),你都可以:
你可以把多個歷史提交合併成一個
也可以刪掉某個提交之前的所有提交
操作完成 git gc 一下清空垃圾

管理文檔最好還是選擇文本格式的文檔,方便查看歷史修改,譬如:

Is there a way in which I can tell LibreOffice to save in a Git friendly format?
You can save your files as flat XML (fodt) instead of odt
from: https://superuser.com/questions/1264379/libreoffice-how-to-save-in-git-friendly-format

除了 office 類型的文檔,也可以選擇使用 markdown、latex 等格式

yixin1851 发表于 2022-1-15 12:22:45

dukelec 发表于 2022-1-14 23:15
無論是什麼數據(文本或非文本),你都可以:
你可以把多個歷史提交合併成一個
也可以刪掉某個提交之前的 ...

您好,谢谢,怎么把多个历史提交合并成一个呢?

dukelec 发表于 2022-1-15 17:23:22

本帖最后由 dukelec 于 2022-1-15 17:35 编辑

yixin1851 发表于 2022-1-15 12:22
您好,谢谢,怎么把多个历史提交合并成一个呢?

這就是 git 基本操作了,完成一件事,方法很多,我只記幾個萬能命令,然後組合使用它們。譬如 git rebase --onto 命令是對提交的拷貝粘貼,整理 git 必不可少。

譬如一長串提交,分別記作 a、b、c、d、e、f(a 是最早的提交)。
譬如想合併 c、d、e 這 3 個提交:
對於文本文檔, 用 git rebase 命令,把 (b、c、d、e、f] rebase 到 b 提交,也就是把 剪切,然後在粘貼到原本的位置(除了 各自的 hash 值,提交的正文內容不變)。
git rebase 的時候有一個參數,可以在 rebase 的時候合併提交,把 c、d、e 標記為合併,那麼同樣的 rebase 之後,c、d、e 就合併成一個提交了。

對於非文本提交,或者其它一些要剪貼提交到其它位置的情況,如果直接用 rebase,可能會導致很多合併衝突,此時,終極解決方法是:
先在 e 的位置建立一個臨時分支,譬如 temp,且保持 workspace 乾淨,然後 reset 到 b 提交,那麼 workspace 就包含了原 c、d、e 的修改,然後 git add 所有修改,然後 git commit 生成新的提交 y,該提交也就包含了之前 c、d、e 三個提交的內容。
最後,再把 (e、f] 剪貼到 y 提交,可以通過 rebase(也可以通過 cherry-pick,因為只是一個提交,不過要手動把原 branch 標籤移到剪貼后的 f 所在的位置),最後再刪掉臨時 temp 標籤。

移動分支標籤的命令是 git reset --hard

yixin1851 发表于 2022-1-16 20:57:35

dukelec 发表于 2022-1-15 17:23
這就是 git 基本操作了,完成一件事,方法很多,我只記幾個萬能命令,然後組合使用它們。譬如 git rebase ...

学习了,感谢

chun2495 发表于 2022-1-19 16:34:06

git常用三部曲:
1. git add --all
2. git commit -m "1234"
3. git push
页: [1]
查看完整版本: 快速掌握Git分布式系统操作