Git命令速查

本教程参考廖雪峰的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 addgit 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分支的链接,根据提示,设置devorigin/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

用不到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值