Git常用指令及基本操作

最近参加的项目代码是由git管理,但最后一次用git已经是大学的时候了,重新温习记录一下以免忘记

事先准备

  1. 下载安装git。 mac可以用homebrew,windows下安装包即可。安装流程就不在这里说了,可参考http://git-scm.com/downloads
    • git --version查看git版本,我之前下过,虽然现在已经更新到2.32,但2.25也够用就懒得更新了
  2. 建个GitHub/GitLab的账号。
  3. 下一个Git可视化软件,我喜欢用GitKraken, 用GitHub的账号登录就可以自动连接到自己的git库了,我选择它最主要的原因是他的可视化界面做的很好,各个分支的关系一目了然。后面会有一些例子,最好能自己下载试一试感受一下。

常用指令

  • 创建仓库:git init

    1. 初始化一个新的仓库:git init。
      • 为了举例,我们试一下新建一个仓库,这样初始化就会新建一个名为.git的目录,所有git需要的数据和资源都放在这个目录下
      • 这时候用GitKraken选择自己刚刚创建的git路径,就可以对仓库进行操作了
    2. 远程克隆一个仓库:git clone
  • 添加文件:git add

    1. 我们创建完git之后,来写一个README.md 加入仓库中,再用git commit -m "xxxxx"去描述自己的提交
    2. 这个时候从GitKraken里可以看到自己的提交信息了
  • 修改文件:git commit

    1. 在本地修改完文件后,需要先对其修改commit,这样才算提交到git仓库里,比如上面添加文件后commit例子
    2. 也可以用GitKraken,每次他会自动的识别有哪些文件修改了,修改的文件都会被识别为unstaged files
      • 只需要手动stage all change后再填写commit message,点击commit change就提交成功了,是不是超级方便!
  • 建立分支:git branch 

    1. 在现实开发里,项目大多是多人开发。多人开发无法避免的问题就是修改冲突,为了解决冲突,分支这个时候就起到很重要的角色了。比如修bug,一般都会从主干拉一个新的分支,在分支里面修完bug之后,再合并到主干上。这样如果有其他人增加新的功能,分支上的bug修改不会影响到其他人的工作。What an amazing work!
    2. 我们来试一下,在主干上加了一个test.py里面写着print(1+3),再建一个分支,在分支上修改这个文件
      • 从图中我们可以看到,我们现在已经在test这个分支上了
      • 我把test.py里改成print(1+4),再commit出去,这个时候我们可以看到test的分支比master已经多一个修改了
  • 切换分支:git checkout

    1. 接着上面的例子,通过切换分支,可以得到在同一文件在不同工作区里输出不一样的结果
      • 在test branch里我的结果是5,切换到master branch我的结果就变成了4,这样看应该就很清楚的知道分支和主干的作用了吧!
    2. 我们也可以通过git checkout -b newBranch来新建一个分支,这个命令就会直接切换到新分支上了
    3. 需要注意的是,新建的分支就是基于你之前处于的分支拉出来的,所以如果你要基于哪个分支,就先checkout到哪个分支上
    4. 在GitKraken里,双击你所需要的branch就会切换到这个branch了
  • 合并分支:git merge

    1. 用于合并两个分支,从下图可以看到我有三个分支一个主干,test和newBranch是基于master的,bugFix是基于test的,这就是GitKraken的好处,可以非常直观的看到各个分支之间的关系
    2. 让我们来试着吧bugFix分支merge到test里
      • 可以看到GitKraken里test已经更新到和bugFix一样了
    3.  或者用GitKraken,右键点击自己想要merge的分支,再选择merge操作即可

      • 这个时候test的分支已经不是再最新的master上了,newBranch也没有和master在同一结点上了

      • 从上面看分支是不是很乱,明明newBranch
  • 整理分支:git rebase

    1. 从上面的图看是不是觉得merge后分支特别乱,明明newBranch和master已经是一样的内容,但他还是有两个分支,这个时候rebase的作用就出来了
    2. 简单地说rebase是把一个分支上的所有提交,在另一个分支上按同样的顺序重放一遍,在执行rebase的过程中,
      1. git会先找到master和newBranch的最新提交"merge branch", "change file to 1+2", 这里简称c1, c2
      2. 然后从c1和c2开始向前回溯,找到他们在提交历史里的共同祖先"add test file",这里简称c0
      3. 把newBranch分支上的从c0往后的每一个提交和c0进行对比,并把对比结果存在一个临时文件里
      4. 然后重置newBranch的提交历史,让他和master的分支的提交历史保持一致(原本只在master的c1也会出现在newBranch分支上)
      5. 在这个基础上,再逐一追加只在newBranch分支上的提交记录(c2)
      • 先checkout到newBranch分支,再rebase到master分支
      • 这样就看起来是一条线上的了
  • 任意选择commit合并到分支:git cherry-pick

    1. 简单的来说就是可以让你将任何分支中的个别提交合并到你当前的HEAD 分支中,即checkout所在的分支
    2. cherry-pick特别适合,当你已经在分支上提交了几个修改,但策划后面决定只要其中的两个修改。如果用rebase和merge的话,会把所有的修改都合并去,而cherry-pick只会合并你选取的几个修改,这样会更flexible一点。
    3. 接着上面的例子,比如我只想要test分支上的“change to 1+4"合并到master上去,先用git log找到提交commit的哈希值,再用cherry-pick和拿到的哈希值定位到你想要合并的修改
      • 合并过去后,可以看到发生了冲突,因为master上只有一行print,test分支上的print合并过去后都在第一行所以就发生了冲突。不用担心!我们用GitKraken来解决就可以
      • 让它保留两行,然后再stage file和commit就可以啦
      • 这样test上的一个提交就合并到master上去啦

远程指令

  • 推送到远程:git push

    1. 他的作用是将本地分支的更新推送到远程主机,常用命令有git push origin master:remote(origin是远程主机名,master是本地分支,remote是远程分支,如果没有remote分支就会新创建一个分支)
    2. 先在GitHub上创建一个新的远程仓库
    3. 经过上面的粒子,我们在本地做了这么多修改,现在来试试把这些操作推送到远程仓库。
      • 先将本地库和远程库关联起来,再推送到远程库,用GitKraken或者用git remote add original https://xxxxx都可以
      • 直接点push或者用git push -u origin master将本地代码推送到远程库中这样就是连接成功了

      • 然后去GitHub里去看,可以看到刚刚新建的仓库里多了一个master的分支,里面都是刚刚push的本地代码 

  • 拉取远程仓库:git pull   

    1. 他的作用就是远程仓库所有的改变都拉到本地代码来,也就是等于git fetch + git merge
    2. 我们试一下在远程仓库的master分支里改readme文件,再把它pull到本地,
      • 也可以用git fetch + git merge实现git pull
      • 从图中可以看到在远程修改的readme文件已经合并到本地的master里
      •  

总结

GitHub, GitKraken都只是Git的外壳和封装,是用来帮助用户更方便的操作Git。其实无论用什么软件,百变不离其中的就是git的一些基本操作,git pull, push, merge etc.在现实生活中,多人协作开发的效率很大程度是基于代码提交和管理,一个好的代码管理可以大大提升开发效率,所以学习好git是非常重要滴!

不久前,知道了一个很好的git学习网站,我做完里面所有的题后,对git操作基本是掌握的差不多了,非常推荐去玩一玩!https://learngitbranching.js.org/?locale=zh_CN

 

posted @ 2022-05-15 13:06  cancantrbl  阅读(78)  评论(0编辑  收藏  举报