git常用指令

93 阅读9分钟

前言

阅读廖雪峰老师的git教程,在里面一步一步跟着走,学习到了很多,自己在总结一下,方便以后使用

git简介

git是目前世界上最先进的分布式版本控制系统

Git is a distributed version control system

是Linux作者使用Linus花了两周时间用C写了一个分布式版本控制系统。

集中式和分布式区别

先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

image.png

那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

image.png

git常用指令

创建版本库

git init
Initialized empty Git repository in your file address

将修改添加到本地暂存区

// 添加指定文件
git add <file>
// 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
git add .
// 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
git add -u 
// 提交所有变化
git add -A  

成功添加将不会有任何提示

将暂存区代码提交到当前分支

git commit -m"xxx"

提交成功后会显示

 1 file changed, 0 insertions(+), 0 deletions(-)

分别代表修改了几个文件,几行插入与几行删除

对比工作区和当前分支文件差异

// 没有将修改提交到暂存区时 对比文件差异
git diff <file>
// 将修改提交(git add .)到了暂存区时,对比文件差异
git diff HEAD -- <file>

查看当前分支代码状态

git status

丢弃工作区修改

git checkout -- <file>
// 或 2.3以上的git版本可以使用
git restore <file>

丢弃暂存区修改

git reset HEAD <file>
//2.3以上的git版本可以使用
git restore --staged <file>

版本回退

// git log拿到所有提交的日志 找到commit id
git log
// 复制commit id 前几位即可 git会自动寻找
git reset --hard <commit id>

直接回退到上一版本HEAD^,上上一个版本就是HEAD^^,以此内推

// 或者直接使用回退到上一版本
git reset --hard HEAD^

查看记录的所有命令

Git提供了一个命令git reflog用来记录你的每一次命令,可以查看每一次commitreset操作的commit idmessage

git reflog

链接远程仓库

// 第一步
git remote add origin <github address>
// 第二步把master分支推送到线上master分支并关联起来
git push -u origin master

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

克隆远程仓库

git clone <github address>

查看分支列表

git branch

创建分支

  • 创建分支
git branch dev
  • 切换分支
git checkout dev
// 高版本git
git switch dev
  • 创建并切换到dev分支
git checkout -b dev
//高版本git
git switch -c dev

合并分支

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,使用--no-ff模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息 使用Fast forward方式

git merge <name>

使用--no-ff方式 这种方式会自动生成一次commit记录

git merge --no-ff -m"xxx" <name>

删除分支

// 合并后删除
git branch -d <name>
// 没有合并强制删除
git branch -D <name>

日志消息

git log
// 日志消息一行展示
git log --pretty=oneline
// 图形化日志
git log --graph --pretty=oneline --abbrev-commit

储存暂存区和工作区差异

git bash

查看储存区储存列表

git stash list

释放储存区

  1. 一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

  2. 另一种方式是用git stash pop,恢复的同时把stash内容也删了

  3. 第三种方式是通过git stash list拿到当前的存储列表,通过git stash apply stash@{0}来切换对应储存列表

复制commit

在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。

那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?

有木有更简单的方法?

有!

同样的bug,要在dev上修复,我们只需要把4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只想复制4c805e2 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。

为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:

git cherry-pick <commit id>

拉取线上仓库代码

  • 拉取对应分支代码
git pull origin <name>
  • 拉取对应分支代码并创建本地分支
git checkout -b <name> origin/<name>

推送代码到线上仓库

git push origin <name>

本地分支和线上分支建立关系

建立关系后,可以直接使用git pull拉取线上当前分支代码,或直接使用git push将本地代码推送到线上分支

git branch --set-upstream <name> origin/<name>

变基解决git的提交历史为一条干净的直线

rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。

git rebase

创建标签

默认标签是打在最新提交的commit上的

git tag <tagName>

有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?

方法是找到历史提交的commit id,然后打上就可以了:

git tag <tagName> <commit id>

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字,若不输入commit id则默认打在最新提交的commit上

git tag -a <tagName> -m"xxx" <commit id>

展示标签

展示打了标签的commit具体信息

git show <tagName>

展示全部tag

git tag

推送标签到线上仓库

推送某个标签

git push origin <tagName>

推送全部

git push origin --tags

删除标签

删除本地标签

git tag -d <tagName>

删除线上仓库标签

git push origin :refs/tags/<tagName>

git配置别名

有没有经常敲错命令?比如git statusstatus这个单词真心不好记。

如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。

我们只需要敲一行命令,告诉Git,以后st就表示status

git config --global alias.st status

这样子配置之后以后如果要使用git status直接输入git st就可以了

可以找到Git的配置文件去快速修改,在用户目录下的.gitconfig

[user]
	name = your Name
	email = your email
[core]
	autocrlf = false
[color]
	ui = true
[alias]
	g = git
	st = status
	ch = checkout
        co = commit
        br = branch
	lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
	mr = merge
	sw = switch
	pl = pull
	ps = push
	bs = branch --set-upstream
	a = add
	

如果你想git 都懒得打,你可以在bash去输入这条语句 alias g=git,这样子以后可以直接使用g st来代替git status

结尾

这篇文章主要是总结了廖雪峰老师Git教程的内容,且主要是总结各个指令如何使用,如果你对git还不太熟练,请你一定要看看廖雪峰老师的这篇文章,里面从头都尾给你介绍了git的使用,并且会教会你在那些情况如何正确的使用git指令,看完之后肯定会受益匪浅。