长达万字的git常用指令总结(适合小白及在工作中想要对git基本指令有所了解的人群)建议收藏
Posted Smoothzjc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了长达万字的git常用指令总结(适合小白及在工作中想要对git基本指令有所了解的人群)建议收藏相关的知识,希望对你有一定的参考价值。
本篇文章将对git在工作和学习中需要用到的大部分常用指令作详细解答,
觉得有用的C友们可以点个赞支持一下,你们的支持就是我最大的动力~
本文总结自廖雪峰老师的文档
4.版本回退git reset与查看日志git log/git relog
5.撤销修改git checkout及git reset(再提及)
1.git的初步认识
首先,Git在本地中具有工作区、暂存区与本地仓库区
平时我们修改代码时叫做工作区,当你完成项目到某个进度想保存时,那么便可将代码存到暂存区,暂存区类似于word文件中的自动保存功能,当你确认暂存区中的代码没问题要保存时,便可将代码由暂存区转到本地仓库区。
那么对于一个目录,如何将它变成Git可以管理的仓库呢?(本地仓库,还不是远程仓库)
答案是:在当前目录下运行git init
指令创建一个版本库,然后这个目录里面的所有文件就可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了,如果你没有看到.git目录,那是因为这个目录默认是隐藏的。
2.git add与git commit
由于Github使用面更广,后续演示都是针对Github来展开
总体来说,把一个文件放到本地Git仓库只需要两步。
- 第一步,用命令
git add
告诉Git,把某个文件从工作区添加到暂存区。 git add <file>
$ git add readme.txt//将readme.txt文件添加到暂存区
执行上面的命令,如果没有任何显示,代表正确运行。
- 第二步,用命令
git commit
告诉Git,将暂存区中所有文件一次性从暂存区添加到本地仓库区。 git commit -m <message>
$ git commit -m "wrote a readme file"//将readme.txt文件添加到本地仓库
💥详解💥
.
简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容)。
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt//一次add命令可以有多个文件,用空格分隔
$ git commit -m "add 3 files."
3.git status和git diff
git status
命令能查看当前目录中所有文件的代码状态,如果文件是红色那说明文件被修改过但还没将此次修改提交。
git diff
命令顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,git diff
后面跟文件名称是是查看工作区(working tree)与暂存区(index)的差别的
4.版本回退git reset与查看日志git log/git relog
你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失,这就是版本回退。
假设对于readme.txt文件,我已经提交了三个版本的修改,而对于git commit -m <message>
,-m后面输入的本次提交说明如下:
版本1:wrote a readme file
版本2:add distributed
版本3:append GPL(最新版本)
- git log
当然,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统Git干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log
命令查看:
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)//最新的一次修改
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL//最新的一次修改
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
💥友情提示:你看到的一大串类似1094adb…的是commit id(版本号),你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。版本号没必要写全,前几位就可以了,Git会自动去找
打算把readme.txt回退到上一个版本,也就是add distributed的那个版本,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。
- git reset
现在,我们要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset
$ git reset --hard HEAD^//去上一个版本
HEAD is now at e475afc add distributed
也可以指定某个commit版本进行还原
$ git reset --hard 1094a//指定commit版本前五位数为1094a的进行还原
HEAD is now at 83b0afe append GPL
如果你忘记了commit版本号,可以通过git reflog
来找,git reflog
记录了你的每一次命令
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
💥过程图示:
总结:
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令
git reset --hard commit_id
。- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
5.撤销修改git checkout及git reset(再提及)
- 撤销工作区的修改
当你对工作区文件完成修改时,你可以选择git add
提交到暂存区,也可以选择git checkout
撤销此次修改
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,
这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到上次提交到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
- 撤销暂存区的修改
当你对工作区文件完成修改且已经提交到了暂存区,你可以选择git commit
提交到本地仓库区,也可以选择git reset
把暂存区的修改撤销掉
$ git reset HEAD readme.txt//前文讲过,HEAD代表当前最新版本的文件
Unstaged changes after reset:
M readme.txt
可知,git reset
命令既可以回退版本,也可以把暂存区的修改撤销到工作区。
- 撤销本地仓库区的修改
什么时候需要撤销本地仓库区的修改呢?那便是已经git commit
到本地仓库了,那便回到前文的版本回退章节进行查阅,git reset --hard 指定版本
即可
6.删除文件
在Git中,删除也是一个修改操作
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm <file>
命令删了
$ rm test.txt
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了
- 如果你只是误删文件,那么可以通过
git checkout
指令恢复(撤销本次修改)
$ git checkout -- test.txt
- 如果你确实要从版本库中删除该文件,那就用命令
git rm
删掉,再git commit
提交本次修改
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
小提示:先手动删除文件,然后使用git rm 和git add效果是一样的。
7.分支管理 branch与switch
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
💥用branch
系列指令进行分支相关操作
- 查看分支
用git branch
命令列出本地仓库中所有分支,当前分支前面会标一个*
号
$ git branch
* dev
master
- 创建与合并分支
- 创建
git branch dev
创建dev分支
git checkout dev
将HEAD指针切换到dev分支
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于上面两条命令
先创建dev分支,然后切换到dev分支
$ git checkout -b dev
Switched to a new branch 'dev'
- 合并
当你在dev
分支上对readme.txt
文件进行修改后,想将该修改合并到master
主分支上时,两步:
先git checkout 分支名
切换到master
分支
$ git checkout master
Switched to branch 'master'
再git merge 需要被合并的分支名
合并dev分支
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
合并完成后,就可以删除dev分支了,相较于git checkout dev
添加分支,加个参数-d
代表delete
$ git branch -d dev
Deleted branch dev (was b17d20e).
💥用switch
系列指令进行分支相关操作
注意到切换分支使用git checkout <branch>
,而前面讲过的撤销修改则是git checkout -- <file>
,同一个命令,有两种作用,确实有点令人迷惑。
实际上,切换分支这个动作,用switch
更容易理解。因此,最新版本的Git提供了新的git switch
命令来切换分支:
创建并切换到新的dev
分支,可以使用:
$ git switch -c dev//代替git checkout -b dev
直接切换到已有的master
分支,可以使用:
$ git switch master//代替git branch dev
💥总结:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
或者git switch <name>
创建+切换分支:git checkout -b <name>
或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
8.标签的使用 git tag与git show
前言:为什么要使用标签?
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的commit版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git有commit版本号,为什么还要引入tag?
因为commit版本是类似6a5819e...
的一大串字符,不好找、辨别
如果将6a5819e...
变成v1.2
,就容易了很多
所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit版本号绑在一起。
创建标签
git tag <tagname>
git tag -a <tagname> -m "blablabla..."
- 给整个分支打标签
首先,git branch
切换到需要打标签的分支上
$ git branch
* dev
master
$ git checkout master
Switched to branch 'master'
然后git tag <tagname>
打标签即可
$ git tag v1.0
- 给过去的某个commit版本打标签
git tag <tagname> <commid id>
默认标签是打在最新提交的commit上的,历史的找到历史提交的commit id,然后打上就可以了
比方说要对add merge
这次提交打标签,它对应的commit id是f52c633
$ git tag v0.9 f52c633
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a <tagname> -m "blablabla..." <commit id>
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
查看标签
git tag
可以用命令git tag查看所有标签
$ git tag
v1.0
git show <tagname>
标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>
查看标签信息:
$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:56:54 2018 +0800
add merge
diff --git a/readme.txt b/readme.txt
...
删除标签
-
命令
git tag -d <tagname>
可以删除一个本地标签; -
命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
推送标签到远程库
-
命令
git push origin <tagname>
可以推送一个本地标签; -
命令
git push origin --tags
可以推送全部未推送过的本地标签;
9.远程仓库的连接
目前广为人知的两个远程仓库有Github和Gitee(码云)
Github:人气最高,人们普遍使用的一个国际化代码管理平台
Gitee:使用GitHub时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况
如果我们希望体验Git飞一般的速度,可以使用国内的Git托管服务——Gitee(gitee.com)
目标:
在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步。
与远程库建立连接
git remote add 远程仓库名字 git@github.com:远程仓库路径//远程仓库路径如下图
$ git remote add origin git@github.com:michaelliao/learngit.git
建立好连接后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
向远程库输出本地库中的文件
git push -u 远程仓库名称 要推送的本地分支名称
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master//origin依旧为远程库名称,master为要推送的分支名称
删除远程库
在删除前,建议先用git remote -v
查看远程库信息
$ git remote -v
origin git@github.com:michaelliao/learn-git.git (fetch)
origin git@github.com:michaelliao/learn-git.git (push)
git remote rm <name>
删除远程库,name为远程库名称
比如删除前文创建的名为origin的远程库
$ git remote rm origin
温馨提示:此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。
💥总结:
-
要关联一个远程库,使用命令
git remote add 远程仓库名字 git@github.com:远程仓库路径
-
关联一个远程库时必须给远程库指定一个名字,origin是默认习惯命名;
-
关联后,使用命令
git push -u 远程仓库名称 要推送的本地分支名称
第一次推送master分支的所有内容; -
此后,每次本地提交后,只要有必要,就可以使用命令
git push -u 远程仓库名称 要推送的本地分支名称
推送最新修改;
10.与Github或Gitee建立文件传输机制
你的本地Git仓库和GitHub仓库之间的传输方式有两种,一种是通过https,另一种是通过SSH加密的
HTTPS:使用https url克隆对初学者来说会比较方便,复制https url然后到git Bash里面直接用clone命令克隆到本地就好了,但是每次fetch和push代码都需要输入账号和密码,这也是https方式的麻烦之处(发现了https免密登录的方式)。
SSH:使用SSH url克隆却需要在克隆之前先配置和添加好SSH key,因此,如果你想要使用SSH url克隆的话,你必须是这个项目的拥有者或管理员,否则你是无法添加SSH key的。另外ssh默认是每次fetch和push代码都不需要输入账号和密码
至于如何将本机与Github和Gitee建立SSH连接,方便推送不用输入邮箱密码,请参考下面链接:
- Github如何实现SSH加密传输:Github平台的SSH
- Github如何实现SSH加密传输:Gitee平台的SSH
💥💥💥💥
这是我的第一篇万字博客!希望大家能够喜欢并从中收获到知识
如果你觉得本篇文章对你有帮助,不妨关注我并点击右下角的点赞和收藏!!
你们的支持就是我最大的动力~~
💥💥💥💥
以上是关于长达万字的git常用指令总结(适合小白及在工作中想要对git基本指令有所了解的人群)建议收藏的主要内容,如果未能解决你的问题,请参考以下文章