写在前面
大多数事情追求二八定律(最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的)。
git是我们平时都会用到,但是又不需要用的很深的工具。
常用的功能必须要用的很熟练才行。
基本概念
GIT是分布式版本控制系统,我们需要了解是git的命令是哪一块和哪一块在交互,网上有很多教程,讲的很详细,这里只是回顾一下基本结构。
主体内容是四个部分
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
常用命令
git add .
添加当前目录下的所有文件到暂存区git commit -m [message]
提交暂存区到本地仓库git push origin master
本地仓库master分支上传到远程并合并git pull origin master
从远程获取master代码并合并到本地的版本git checkout newFix
切换到分支newFixgit checkout -b newFix
创建并切换到新分支newFixgit clone -b [分支名] [url]
拷贝一个指定分支的远程git仓库到本地git merge bugFix
将bugFix合并到当前分支git init
初始化仓库
以上是经常用到的命令,还有一个比较实用的功能是cherry-pick,不过一般会通过工具来进行可视化操作
更多
基本命令
-
添加文件
git add
功能:将文件添加到暂存区
git add [file1] [file2] ...
添加一个或多个文件到暂存区git add [dir]
添加指定目录到暂存区,包括子目录git add .
添加当前目录下的所有文件到暂存区
-
提交
git commit
功能:提交暂存区到本地仓库
git commit -m "提交内容说明"
提交暂存区到本地仓库git commit [file1] [file2] -m "提交内容说明"
提交暂存区的指定文件到本地仓库
-
分支
git branch
git branch newFix
只能创建新分支newFix,并没有切换到新分支newFixgit branch -f master HEAD~3
强制修改分支位置,将master分支强制指向HEAD的第3级父提交
-
合并
git merge
git merge bugFix
假设我们当前在master,那就是将bugFix合并到master
-
合并2
git rebase
取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个放下去。和merge的区别是这样的提交记录是线性的,更清晰,但是会丢失真正的顺序。
git rebase master
假设我们当前在bugFix,那就是将bugFix合并到master。刚好和merge相反,参数是目标分支
-
切换指向
git checkout
功能:切换分支,本质是改变HEAD的指向
git checkout -b newFix
创建并切换到新分支newFixgit checkout c1
这里的c1可以是某个提交记录,也可以是分支名称git checkout master^
指向master的父节点,两个^是再向上的第二个父节点git checkout HEAD~4
是一次退4步
-
撤销变更
git reset
和git revert
git reset HEAD~1
删除,用在本地,回退1步git revert HEAD
回滚,用在远程,再新增一次提交记录,新提交即改回之前的更改内容
高级用法
-
cherry-pick
git cherry-pick
功能:指定提交记录合并
git cherry-pick c1 c2
c1、c2代表某两个提交记录的哈希git cherry-pick origin/master
合并远程master到当前分支
-
调整排序
git rebase -i
git rebase -i HEAD~4
最近4条提交做个排序
-
标签
git tag
git tag v1 c1
给c1打标签v1
远程命令
-
克隆
git clone
git clone [url]
拷贝一个远程仓库git clone -b [分支名] [url]
拷贝指定分支的远程仓库
-
拉取
git fetch
功能:将本地仓库的远程分支更新成了远程仓库相应分支最新的状态
git fetch
下载所有的提交记录到各个远程分支git fetch origin foo
从远端foo分支,获取所有本地不存在的提交,放到本地origin/foo上git push origin <source>:<destination>
指定了远程的源和本地的目的
-
拉取并合并
git pull
功能:从远程获取代码并合并到本地的分支
git pull
=git fetch
+git merge
拉取全部远程分支并合并git pull origin foo
=git fetch origin foo
+git merge origin/foo
拉取指定的foo分支并合并git pull origin bar:bugFix
=git fetch origin bar:bugFix
+git merge bugFix
-
推送
git push
功能:本地分支变更上传到远程仓库,并在远程仓库合并你的提交记录
git push
不带参数,对应的就是HEAD的当前分支和远程分支git push <remote> <place>
切到本地 place 位置,获取所有提交,再到远程仓库remote中找到place分支,将远程仓库没有的提交都添加上去git push origin <source>:<destination>
切换到本地source位置,上传未被包含到远程仓库里destination分支的提交记录
常用工具
完全通过命令行来操作的话,无法提高效率,还是需要借助工具。
- TortoiseGit 小乌龟,首推
- GitHub Desktop 特别好用,常用功能都有
- Git Extensions 需要做一些配置,可视化也更好一些
- Git GUI 官方的,不如第三方好用
- Sourcetree 很多人推荐,个人没用过
- 编辑器插件,比如vscode的插件Git Extensions for VS Code就是上面提到的集成到vscode
萝卜白菜各有所爱,挑自己顺手的用就好
练习网站
看的多,不如练的多。很多时候学知识就是脑子理解了,手不会,也没记住。
- learngitbranching 这是一个可以直接操作,有及时反馈的在线练习git命令的可视化网站。
东西在精不在多,git本来就是学习常用内容就可以了,好好把这个网站过一遍,完全够用了。