Git使用整理

引:虽然日常使用git,但是有些时候总是会忘记一些操作,难免会面向搜索引擎查找。所以这里就总结一下。

版本控制系统

谈到Git,就需要先说说版本控制系统。版本控制系统就是能自动帮我们记录每次文件的改动的一个软件,而Git就是它的一种实现。想想我们写论文还是写代码,是不是有了他就很方便了,再也不用自己手动备份每一次修改了。版本控制系统又分为集中式和分布式。

集中式(SVN)

集中式

集中式版本控制系统的版本库是集中存放在中央服务器的,而我们在干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。

问题:必须联网才能工作;中央服务器要是出了问题,所有人都没法干活了

分布式(Git)

分布式

每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。在双方协作的时候,如果你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,而且如果你们俩不在一个局域网内,两台电脑也互相访问不了。所以分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

Git使用

Git安装

这里就不多说了,推荐廖雪峰的官方网站安装教程

Git区域

Git区域

  • 工作区(Workspace):在计算机能看到的目录。
  • 缓存区(Index/Stage):临时保存我们的改动。
  • 版本库(Repository):工作区有一个隐藏的目录.git,它是Git的本地版本库。
  • 远程仓库(Remote):“Git中央服务器”,托管在网络中的项目的版本库,可供多人协作开发。(国外有基佬俱乐部Github,国内有码云Coding、还有可个人或者公司定制的GitLab,请按需选择)

Git个人操作

在上面的区域图中,其实我们已经看到很多操作,这里我再总结一下:

新建仓库

  • 在当前目录新建一个Git仓库

    1
    git init
  • 在当前目录克隆一个仓库

    1
    git clone [url]

增加文件

  • 添加指定文件/目录到暂存区

    1
    git add [file]/[dir]
  • 添加当前目录的所有文件到暂存区(慎用,尤其在IDE中,因为它会包含IDE的配置文件,如IDEA的.idea和iml文件)

    1
    git add .

提交文件

  • 提交缓存区的文件到仓库区
    1
    git commit -m [改变信息]

查看信息

  • 显示有变更的文件

    1
    git status
  • 显示当前分支的版本历史

    1
    git log
  • 根据关键词搜索提交历史

    1
    git log -S [keyword]
  • 显示暂存区与工作区的差异

    1
    git diff
  • 显示工作区与当前分支最新的commit之间的差异
    git diff HEAD(当前最新commit)

  • 上传本地指定分支到远程仓库
    1
    git push [remote] [branch]

远程同步

  • 下载远程仓库的变动

    1
    git fetch [remote远程仓库名] [分支]:[本地新分支]
  • 显示所有远程仓库

    1
    git remote -v
  • 显示某个远程仓库的信息

    1
    git remote show [branch]
  • 增加一个远程仓库并命名

    git remote add [shortname=remote] [url]

  • 上传本地指定分支到远程仓库

    1
    git push [remote] [branch]
  • 强行推送当前分支到远程仓库,即使有冲突
    git push [remote] --force

  • 推送所有分支到远程仓库
    git push [remote] -all

撤销

  • 恢复暂存区的指定文件到工作区

    1
    git checkout [file]
  • 恢复某个commit的指定文件到暂存区与工作区

    1
    git checkout [commit] [file]
  • 恢复暂存区的所有文件到工作区

    1
    git checkout .
  • 重置暂存区与工作区,与上一次commit保持一致
    git reset --hard

  • 重置当前分支的HEAD(指针,指向commit-id)为指定commit,同时重置暂存区和工作区,与指定commit一致
    git reset --hard [commit]

  • 后者的所有变化都将被前者抵消,并应用当前分支
    git revert [commit]

  • 暂时将未提交的变化移除,稍后再移入
    git stash
    git stash pop

Git多人协作

多人协作就会涉及到分支的概念(其实单人开发也会遇到,只是多人会更常见)

我们先看看下面的图:

多人协作

这张图可以很清楚让我们认识到在工作中使用git工作流的开发流程。Master分支是线上分支,我们在开发新功能的时候不会去动它,Hotfix分支是如果出了bug就拉一条bug分支快速修复合并到master分支里。我们平时开发都是先从Master分支拉出一条Develop分支,在这个分支上进行开发。每个人一般都会负责项目的一个特性功能,所以我们又会从Develop分支拉出几个Feature分支。在开发测试完成后我们形成Release分支,再次检验后将它与Master分支合并,然后我们之后Release分支拉出Develop分支进行新一轮的开发。

Git分支

  • 列出所有本地分支

    1
    git branch
  • 列出所有远程分支

    1
    git branch -r
  • 列出所有本地分支和远程分支

    1
    git branch -a
  • 新建一个分支,但依然停留在当前分支

    1
    git branch [branch-name]
  • 新建一个分支,并切换到该分支

    1
    git checkout -b [branch]
  • 切换到当前指定分支,并指定工作区

    1
    git checkout [branch-name]
  • 切换到上一个分支

    1
    git checkout -
  • 建立追踪关系,在现有分支与指定的远程分支之间

    1
    git branch --set-upstream [branch] [remote-branch]
  • 合并指定分支到当前分支

    1
    git merge [branch]
  • 删除远程分支

    1
    git branch -d [branch-name]

协作冲突

在多人协作的过程中肯定会碰到这样的问题:如果你的小伙伴已经向一个分支推送了他的提交,而碰巧你也对同个分支的同样的文件作了修改,并试图推送,那么就会提交被拒绝,这个时候就需要先:

1
git pull

等价于:

1
2
git fetch temp(临时分支)
git merge temp

这个时候合git会将你们两个人对文件的修改都呈现在同一个文件中,你需要在与你的小伙伴商量出一个最终版,修改之后再提交上去。

IDEA与Git

可能大家对使用命令行并不感冒,所以这里也为大家找了一份IDEA的git使用教程,至此大家只要点点点就好了。当然这里还会有很多我没有涉及到的地方,就需要平时多积累了。

别急,别急!!还要最后一点就是 .gitignore 了!

我们发现在使用IDEA的时候,他默认会要求我们把所有的文件加入到git控制里,但是我们知道很多IDEA的自带配置文件是不用也没有必要加入git(之前在说git add . 的时候也说过),所以可以利用IDEA的.gitignore插件来帮助我们忽略这些没有必要的插件,这里也放一个.gitignore教程

参考

  1. 廖雪峰的git教程
  2. 详解git fetch与git pull的区别
  3. 版本控制之IDEA使用Git
  4. 如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件