摘要:git是公司最常用的一个版本迭代管理工具,学会使用git即可很得心应手的处理一些迭代相关的事情。
其实关于这些需要练习的知识点我不想要做过多的说明,重点还是需要你们自己记忆然后总结。git这个工具在日常的工作主要用来帮助我们进行代码的版本管理的,现在基本上所有的公司都使用它。之前面试的时候也考过这部分内容,考察的知识点也比较简单。大家可以学习一下相关的基本知识,重点是要边实践变学习。
学习的话看廖雪峰老师的网站上的教程基本上就能够应对面试了:https://www.liaoxuefeng.com/wiki/896043488029600
还有一个官方的文档:https://git-scm.com/book/zh/v2 这两个任选一个看就可以了。
安装
在Linux上安装Git
首先,你可以试着输入git
,看看系统有没有安装Git:
1 | $ git |
像上面的命令,有很多Linux会友好地告诉你Git没有安装,还会告诉你如何安装Git。
在Mac OS X上安装Git
一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
在Windows上安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
Git常用命令
配置Git账号
1 | $ git config --global user.name "Your Name" |
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
创建版本库
通过git init
命令把这个目录变成Git可以管理的仓库:
1 | $ git init |
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
文件添加到版本库
第一步,用命令git add
告诉Git,把文件添加到仓库:
1 | $ git add readme.txt |
执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
第二步,用命令git commit
告诉Git,把文件提交到仓库:
1 | $ git commit -m "wrote a readme file" |
简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
工作区的状态
运行git status
命令看看结果:
1 | $ git status |
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt
被修改过了,但还没有准备提交的修改。
查看修改内容
需要用git diff
这个命令看看:
1 | $ git diff readme.txt |
git diff
顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个distributed
单词。
查看提交日志
我们用git log
命令查看:
1 | $ git log |
git log
命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL
,上一次是add distributed
,最早的一次是wrote a readme file
.一大串类似1094adb...
的是commit id
(版本号)
版本回滚
准备把readme.txt
回退到上一个版本,也就是add distributed
的那个版本,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
现在,我们要把当前版本append GPL
回退到上一个版本add distributed
,就可以使用git reset
命令:
1 | $ git reset --hard HEAD^ |
最新的那个版本append GPL
已经看不到了!想要恢复怎么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL
的commit id
是1094adb...
,于是就可以指定回到未来的某个版本:
1 | $ git reset --hard 1094a |
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
当你用$ git reset --hard HEAD^
回退到add distributed
版本时,再想恢复到append GPL
,就必须找到append GPL
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
1 | $ git reflog |
tip:
Git管理的文件分为:工作区,版本库,版本库又分为暂存区stage和暂存区分支master(仓库)
工作区>>>>暂存区>>>>仓库
git add把文件从工作区>>>>暂存区,git commit把文件从暂存区>>>>仓库,
git diff查看工作区和暂存区差异,
git diff –cached查看暂存区和仓库差异,
git diff HEAD 查看工作区和仓库的差异,
撤销修改
git restore <file>
/git checkout -- <file>
可以丢弃工作区的修改:
1 | $ git checkout -- readme.txt |
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
Git社区发布了Git的新版本2.23。在该版本中,有一个特性非常引人瞩目,就是新版本的Git引入了两个新命令 git switch 和 git restore,用以替代现在的 git checkout。
git checkout 这个命令承担了太多职责,既被用来切换分支,又被用来恢复工作区文件,对用户造成了很大的认知负担。
推送远程库
建立关联
创建好github库后通过以下命令创建链接
1 | $ git remote add origin <xxxx> |
这里
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。
删除关联
1 | git remote rm origin |
推送到远程库
下一步,就可以把本地库的所有内容推送到远程库上:
1 | git push -u origin master |
1 | $ git push -u origin master |
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:
1 | $ git push origin master |
从远程库克隆
现在,远程库已经准备好了,下一步是用命令git clone
克隆一个本地库:
1 | $ git clone <xxxxxxxxxx> |
从远程库拉取
1 | git pull origin master |
分支管理
创建/切换分支
创建dev
分支,然后切换到dev
分支:
1 | $ git checkout -b dev |
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
1 | $ git branch dev #创建分支 |
实际上,切换分支这个动作,用
switch
更科学。因此,最新版本的Git提供了新的git switch
命令来切换分支:创建并切换到新的
dev
分支,可以使用:
1
2 > $ git switch -c dev
>
直接切换到已有的
master
分支,可以使用:
1
2 > $ git switch master
>
查看分支
然后,用git branch
命令查看当前分支:
1 | $ git branch #显示分支 |
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
合并分支
换回master
分支后因为那个提交是在dev
分支上,而master
分支此刻的提交点并没有变:
现在,我们把dev
分支的工作成果合并到master
分支上:
1 | $ git merge dev |
git merge
命令用于合并指定分支到当前分支。
删除分支
合并完成后,就可以放心地删除dev
分支了:
1 | $ git branch -d dev |
git branch -D <filename>
强行删除未合并的分支
暂存分支
Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
1 | $ git stash |
接着回到之前的工作分支
1 | git switch dev |
工作区是干净的,刚才的工作现场存到哪去了?用git stash list
命令看看:
1 | $ git stash list |
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash内容也删了:
1 | $ git stash pop |
tip:在master分支上修复的bug,想要合并到当前dev分支,可以用
git cherry-pick
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
多人协作
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/
。