简易版Git操作教程
Git教程
Git安装
初始化一个Git仓库
$ mkdir learngit
$ cd learngit
//用于显示当前创建文件夹目录目录
$ pwd
$ git init //初始化当前文件夹为一个git仓库
//然后就可以在这个文件夹创建子文件夹或者document,比如
接下来就可以在这个文件夹中创建文件并加入到Git
$ touch readme.txt
$ vim readme.txt
//没有安装vim的可以用其他编辑器
然后在readme.txt上写一句话
I am learning Git
接下来重点了,经常用的两个命令
$ git add readme.txt //将readme.txt添加进仓库的某个区(后面又介绍什么区我忘了叫啥了,我是猪脑瓜)
// git add . (把文件夹内的所有文件都添加进了那个区,后面有个点点哟,. 和 add之间有空格的)、
$ git commit -m "fist add" //把文件提交到仓库
-m 后面输入的是本次提交的说明,如果你是懒猪不写也可以,但是就是你可能看不到自己为啥提交这次了。
温馨小提示:你必须在你 git init 的文件夹操作不然你就会有错误
时光穿梭机
继续修改readme.txt文件,改成如下内容:
I am learning Git
I am so handsome
保存下来,相信自己是帅的,就是不改(狗头保命)
$ git status //查看状态,就可以看到说readme.txt 被修改了
$ git diff readme.txt //参看有什么差异,修改了哪些内容
// 然后就可以提交了,提交命令还记得吗?不记得吧,那就对了,我再告诉你一遍!!!
$ git add readme.txt //将readme.txt添加进仓库的某个区(后面又介绍什么区我忘了叫啥了,我是猪脑瓜)
// git add . (把文件夹内的所有文件都添加进了那个区,后面有个点点哟,. 和 add之间有空格的)、
//这里的提交说明应该改改
$ git commit -m "fist add" //把文件提交到仓库
$ git status //再看看状态
版本回退
当你提交了很多次,突然有一天不开心了,想退回去之前的某个版本怎么办?好办,Git是个优秀的宝宝。
$ git log
// git log命令显示从最近到最远的提交日志,我们可以只看近三次
$ git log --pretty=oneline
// 会出来一串数字,什么意思呢,自己查一下,就是类似一个commit id
$ git reset --hard HEAD^ // 回退到上一个版本
$ git reset --hard 1094a // 回退到某个版本,后面的数字就是commit id前面几位,会自动识别,但你别写一位那就不行了。。
人类都是大猪蹄子,回去了后悔了怎么办,如果你上面的terminal还没关掉就直接同样方法回去,关掉了是不是没救了,有的有的!!
$ git reflog // Git提供了一个命令git reflog用来记录你的每一次命令
//找到你想去的那个id然后就赶紧去吧大猪蹄子。
工作区和暂存区
这是理论知识自己看看吧,没啥讲头。传送门
管理修改
如果你乖乖地去把上面的理论知识看了,再看这个就知道为啥了,但是这个实际操作没什么意义吧,谁会无聊这么搞,辅助理解上面那个小结而已,我觉得可以跳过,你想看再把传送门给你。点它。
撤销修改
这个有用,不然你提交上去可能丢了饭碗或者被导师痛骂哈哈哈。假如你再某个地方写了一句 I have a stupid boss,然后你又git add了,怎么办怎么办?
$ git status //查看状态发现确实修改了但还没有add
$ git checkout -- readme.txt // 丢弃修改
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态,
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git checkout - - file命令中的- -很重要,没有- -,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。(- -是两杠,中间没空格)
如果脑子抽了add了怎么办?有救。
// 用 git reset HEAD <file> 撤销暂存区的修改
$ git reset HEAD readme.txt
// 再丢弃修改
$ git checkout -- readme.txt
现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。如果推了,那就准备收拾东西(哈哈哈)。
删除文件
一般直接删除或者用命令行 rm test.txt
删除文件,这个时候你$ git status
就会告诉你哪里被删了,确定从本地库删除,就$ git rm test.txt
,然后$ git commit
。
如果删错了,并且还么把本地库删除,就$ git checkout -- test.txt
。如果从来没有添加到本地库里,那就彻底木的了。
远程仓库
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
$ cat ~/.ssh/id_rsa.pub
把里面的内容都复制一下,都复制一下哦。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容,不能在某个工程里加,如果在工程里这样你只能clone下来,没办法push上去。如果你不用SSH可能每次push的时候都要登录不是很麻烦嘛。
添加远程仓库
先在GitHub建一个仓库,我相信你都会了,不会就去摸索一下很简单点几下,再不会就传送门,在本地仓库运行:
$ git remote add origin git@github.com:michaelliao/learngit.git // 这里改成你的仓库的地址,
// origin 就是远程仓库的名字,你也可以自己取,但这是习惯吧。
重点:remote add 不要放https的链接,不然你push还有输入密码,要放ssh的链接
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
从远程库克隆
git clone 库的链接
,你一定会了。如果你在学校,那你学到这里差不多了,可以洗洗睡了或者打游戏了,如果为了以后工作快速上手可能会需要后面的。
分支管理
这个有点复杂,可能在公司开发会用,学校估计还用不到这么复杂,可以结束了。
创建与合并分支
理论知识我就直接贴上链接,clone下来的时候选的是master或者你自己git init的仓库默认是在master,接下来开始分支操作。
$ git checkout -b dev // 创建一个叫dev的分支,并切换到这个分支
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev //创建分支
$ git checkout dev //切换分支
(有没有发现,跟之前撤销那个命令是不是一样是checkout
,感觉有点zz,后面版本有switch切换版本了)
然后,用git branch
命令查看当前分支,可以看到dev
前面有个星星,就是切换到dev
了,就可以在上面修改readme.txt
,然后git add
,git commit
了。完成工作后,切换到master:
$ git checkout master // 切换
$ git merge dev // 合并dev分支到master
$ git branch -d dev //删除分支
$ git branch // 查看分支,就剩master了
switch这个看起来更科学有点:
$ git switch -c dev // 创建并切换分支
$ git switch master // 切换分支
解决冲突
这个冲突简单来说就是你在A
分支上修改了a
文件,然后你切换到B
分支修改了a
文件,最后合并的时候就会冲突,就要手动解决冲突。
$ git switch -c feature1 // 创建一个分支,修改一下readme.txt
$ git add readme.txt
$ git commit -m "****"
$ git switch master // 在master再修改readme.txt
$ git add readme.txt
$ git commit -m "***"
$ git merge feature1 //你就会看到 fix conflicts 的字样就是冲突了
$ git status // 查看状态,然后手动修改readme.txt,手动就是编辑器打开,修改,保存,在提交
$ git add readme.txt
$ git commit -m "conflict fixed"
用带参数的git log
也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
最后,删除feature1
分支:git branch -d feature1
。
分支管理策略
通常,合并分支时,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
$ git switch -c dev
// 修改readme.txt文件,并提交一个新的commit
$ git add readme.txt
$ git commit -m "add merge"
$ git switch master
$ git merge --no-ff -m "merge with no-ff" dev // 因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
$ git log --graph --pretty=oneline --abbrev-commit
后续一些实际开发的分支原则,可以看原博。
Bug分支
这个意思就是你在自己的dev
分支疯狂的改bug,然后突然舍友叫你打游戏(当然不可能,只能是改bug),你只能去了,你又不能提交,因为你还没改完怎么办?
$ git stash // 把现场隐藏起来
然后切换到某个需要改bug的分支,然后创建分支,一顿操作猛如虎改完合并删除分支,再切回dev
分支git switch dev
,输入:
$ git status // 工作区是干净的,白干了?
$ git stash list //用git stash list命令看看,幸好还在
$ git stash pop // 恢复的同时把stash内容也删了
//另外一种
$ git stash apply //恢复后,stash内容并不删除,你需要用git stash drop来删除
如果你从master分支出来的,那你的分支也有同样的bug,不能再改一遍吧,这样刷KPI的吗?Git提供了一个命令cherry-pick
.
$ git cherry-pick 4c805e2 // 后面的号码就是你commit修改bug的那次,这样就解决了你的分支同样的bug
Feature分支
就是在一个B
分支你干完了,切回A
还没合并,然后突然不要这个功能了,又必须强行删除B
,那你就:
$ git branch -D feature-vulcan // 注意是大 D
多人协作
$ git remote -v // 查看远程库的信息
$ git push origin master // 推送master
$ git push origin dev // 推送其他分支,有些分支是不需要推送的
抓取分支
从远程仓库clone一个下来,默认是在master分支下,但是你开发需要在dev
下开发,所以你需要创建一个dev
分支,并和远程分支关联起来:
$ git checkout -b dev // 创建分支,切换到dev
现在,他就可以在dev
上继续修改,然后,时不时地把dev
分支push到远程:
$ git add env.txt
$ git commit -m "add env"
$ git push origin dev
如果你今天运气爆炸,你的小伙伴也同样改了相同的地方,相同的文件,他比你提前push上去,那你就会push失败了,你就需要先git pull
,git pull
也失败了,原因是没有指定本地dev
分支与远程origin/dev
分支的链接,根据提示,设置dev
和origin/dev
的链接:
$ git branch --set-upstream-to=origin/dev dev // 命令行窗口会有提示,这句就是根据提示改的
$ git pull // 会有冲突,解决冲突,add ,commit,push
因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin <branch-name>
推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
Rebase
这一节治疗强迫症用的,我没有,所以就不写了,给链接
标签管理
标签就是为了方便版本管理。
创建标签
创建标签很简单,转到你要的分支,打标签:
$ git branch
$ git checkout master // 其他分支也可以
$ git tag v1.0 // 这样就可以打上了,默认是打在最近提交的commit上
// 想要打在以前提交的版本
$ git log --pretty=oneline --abbrev-commit
$ git tag v0.9 f52c633
$ git tag // 查看标签
$ git show v0.9 // 查看标签信息
$ git tag -a v0.1 -m "version 0.1 released" 1094adb // 还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字
操作标签
$ git tag -d v0.1 // 删除标签
$ git push origin v1.0 // 推送某个标签到远程
$ git push origin --tags // 一次性推送全部尚未推送到远程的本地标签
// 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
$ git tag -d v0.9
// 然后,从远程删除。删除命令也是push
$ git push origin :refs/tags/v0.9
添加第三方库(有用要看)
首先创建一个git仓库,或者clone
一个仓库,在仓库上建立一个文件夹
$ mkdir 3dparty && cd 3dparty
$ git submodule add *** // ***是你要添加的第三方的库的链接
$ git status // 查看状态,就可以看到两个新添加的文件
$ git diff --cached --submodule // 查看详细的状态
$ cd .. //回到上一级目录(仓库目录)
$ git commit -m "add submodule"
$ git push origin master // 推向仓库,你就可以看到你新的仓库里面有一个第三方链接,但是没有文件(这是对的)
第二就是从一个有第三方仓库链接的git上clone
一个仓库,你会发现clone
下来有第三方库文件夹,但是没有文件内容,需要后续操作
$ git clone *** / /clone一个有第三方库的仓库
// 先cd 进入项目里
$ git submodule init // 初始化第三方库
$ git submodule update // 就会clone下来第三方库
第三是更新库,如果第三方库没有更新,你的项目更新了直接git pull
就行,但是这样不会更新第三方库,更新第三方库需要如下:
git pull --recurse-submodules
下面这行是在clone
仓库的时候直接把第三方clone
下来
$ git clone --recurse-submodules ***
后续还有一些新的操作,但是我觉得初学者用不到,就不写了,先把链接放着。
使用GitHub
Fork,Pull request这几个概念而已
使用Gitee
一样添加公钥在个人设置里面方便。
自定义Git
用不到