git基础命令学习

Git简介

​ Git是目前世界上最先进的分布式版本控制系统,编写语言为C语言,2008年发布,作者:linus。

集中式与分布式区别

​ 集中式版本控制系统对于版本库的存储是集中存放在中央服务器的,最大的毛病就是必须联网才能工作,受限于网络传输速率。

​ 分布式版本控制系统根本没有“中央服务器”,每个人电脑都有一个完整的版本库。而相对于“中央服务器”,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

Git安装注意事项

​ git安装后,需要进行最后一步设置:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

版本库

在git中,文件的状态只有三种(已修改、已暂存、已提交)

  • 已修改
    • 在工作目录修改Git文件
  • 已暂存
    • 对已修改的文件执行Git暂存操作(git add),将文件存入暂存区
  • 已提交
    • 将已暂存的文件执行Git提交操作(git commit),将文件存入版本库

版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

  • 如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。

版本库创建过程:

#选择一个合适的目录
$ cd MyPWD
$ mkdir MyRepository
$ cd MyRepository
#通过git init命令把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in MyPWD/.git/

创建完成,版本库目录下会多出一个.git的目录,这个目录是Git来跟踪管理版本库的。

添加文件至版本库 - 加入暂存区:

#注意添加文件的目录需包含在版本库同级或子级目录
$ git add Mytxt.txt #无打印信息代表添加成功

提交到版本库 - 将文件存入版本库:(提交新文件前需要先git add)

$ git commit -m "wrote a readme file" # -m 后面输入的是本次提交的说明,可以输入任意内容

add可以多次添加文件,commit可以一次提交很多文件。

git status #显示当前版本库文件状态
git diff #查看修改内容

历史版本切换操作

#显示所有的版本信息提交日志[简易显示],克隆的工程允许查看过去操作
git log [--pretty=oneline]
#恢复历史版本,git log提交日志回溯删除版本,git reflog记录当前操作版本
git reset --hard HEAD^ #HEAD^代表上一个版本  HEAD^代表上上个版本	HEAD~100代表以前第100个版本
git reset --hard commit_id #commit_id为版本号,可通过git reflog查询

#显示所有的操作记录,包括提交,回退的操作,仅本地记录,克隆的工程无法查看过去操作。
git reflog #找到历史版本的commit id-版本序号前几位

git基础命令学习_第1张图片

工作区与暂存区

工程目录 -> 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

git基础命令学习_第2张图片

git add把文件添加进去,实际上就是把文件修改添加到暂存区;

git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

撤销修改

#把readme.txt文件在工作区的修改全部撤销,让这个文件回到最近一次git commit或git add时的状态
git checkout -- readme.txt

删除文件

在Git中,删除也是一个修改操作

直接删除一个文件:

git rm file #可直接删除工作区文件,如果之前使用rm file了,则使用该命令意味着从版本库确认删除
git commit -m "remove file"

添加远程仓库

在本地创建一个Git仓库,并同步在GitHub创建一个Git仓库。

git基础命令学习_第3张图片

git基础命令学习_第4张图片

git基础命令学习_第5张图片

关联一个远程库

#关联一个远程库
git remote add origin git@server-name:path/repo-name.git #或
git remote add origin https://github.com/path/repo-name.git
#第一次推送master分支所有内容
git push -u origin master
#随后每次推送
git push origin master

#删除关联
git remote rm origin
#关联两个远程库
git remote add github [email protected]:MyGithub/learngit.git
git remote add gitee [email protected]:MyGitee/learngit.git
git remote -v
gitee	[email protected]:MyGitee/learngit.git (fetch)
gitee	[email protected]:MyGitee/learngit.git (push)
github	[email protected]:MyGithub/learngit.git (fetch)
github	[email protected]:MyGithub/learngit.git (push)
#如果要推送到GitHub,使用命令:
git push github master
#如果要推送到Gitee,使用命令:
git push gitee master
#Git支持多种协议,包括https,但ssh协议速度最快。
https://github.com/path/repo-name.git #https url 直接有效网址打开,但是用户每次通过git提交的时候都要输入用户名和密码
[email protected]:path/repo-name.git #SSH URL 一次配置,永久使用。注意:使用此网址需要设置SSH Key。具体步骤见扩展

#GitHub配置SSH Key的目的是为了帮助我们在通过git提交代码是,不需要繁琐的验证过程,简化操作流程。

错误:

fatal: Could not read from remote repository. 
Please make sure you have the correct access rights and the repository exists.
#手动添加一个ssh公钥即可解决这个问题,具体添加ssh公钥的方法参见下方博客:
# https://blog.csdn.net/u013778905/article/details/83501204

SSH警告:

当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?

这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。

Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:

Warning: Permanently added 'github.com' (RSA) to the list of known hosts.

这个警告只会出现一次,后面的操作就不会有任何警告了。

如果你实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。

分支

分支创建与切换:

#首先,我们创建dev分支,然后切换到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
#git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev	#创建分支
$ git checkout dev	#切换分支
Switched to branch 'dev'

查看分支:

#git branch命令会列出所有分支,当前分支前面会标一个*号
$ git branch
* dev
  master

合并分支:

$ git merge dev
#通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
#如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
#准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward
#因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
$ git merge --no-ff -m "merge with no-ff" dev

git基础命令学习_第6张图片

删除分支:

$ git branch -d dev

查看分支图:

$ git log --graph #细节打印
$ git log --graph --pretty=oneline --abbrev-commit #精简打印

合并分支冲突:

当分支创建时,对新分支和主分支同时进行文件修改并提交到版本库后进行分支合并将会产生以下错误:

Auto-merging readme.md
CONFLICT (content): Merge conflict in readme.md
Automatic merge failed; fix conflicts and then commit the result.

这时只要进入对应文档进行修正,再重新提交版本库即可。

临时存储分支状态,修正bug:

情景:码代码过程中,需要修改其他分支上的bug,但此时还不想提交。

$ git stash #保存现场
#随后可以切换到有bug的分支上,创建新的分支以修改bug,最后提交同步。
$ git stash list #查看保存的工作现场

#恢复现场的方法:一是:
$ git stash apply #恢复后,stash内容并不删除
$ git stash drop #删除stash内容

$ git stash apply stash@{
     0} #修改指定的stash
#另一种方式是:
$ git stash pop #恢复的同时把stash内容也删了

同步其他分支修改的内容 (bug) 到当前分支:

$ git cherry-pick <commit id> #git reflog 找到过去提交操作的id

推送分支:

git remote -v #查看远程库信息,远程仓库的默认名称是origin 如果没有推送权限,默认就看不到push的地址。
git push origin master #master分支名 origin为添加远程库链接时设置的名称,最终指向远程库。

拉取分支:

#默认情况下,我们如果从远程库clone时,一般只能克隆到本地的master分支
#如果想在源程库的其它分支上开发,比如dev,就必须创建远程orgin的dev分支到本地
$ git checkout -b dev origin/dev

#注意:如果他人推送了新的内容到了远程库,而我们需要提交新的推送,则要先拉取新的远程库,同步到本地库中,并修改内容合并
#另外,输入拉取命令git pull前需要指定本地dev分支与远程origin/dev分支的链接
$ git branch --set-upstream-to=origin/dev dev
$ git pull

标签管理

创建标签:

#注意每一次git add & git commit操作都是一个版本,存在对应操作id[commit id]
$ git tag <name> #在当前版本[commit id]打上新的标签
$ git tag <name> <commit id>

查看标签:

#标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
$ git tag #查看所有标签
$ git show <tagname> #查看标签名
$ git tag -a <tagname> -m "version 0.1 released" <commit id> #创建带有说明的标签,用-a指定标签名,-m指定说明文字

删除标签:

#删除本地标签
$ git tag -d <tagname>
$ git push origin <tagname> #推送某个标签到远程
$ git push origin --tags #推送全部尚未推送到远程的本地标签

#删除远程标签
#1.先从本地删除标签
$ git tag -d <tagname>
#2.同步删除
$ git push origin :refs/tags/<tagname> #路径refs/tags下存储了所有的tags信息
#冒号前面本来写的是你本地的分支名(或者对象,标签),冒号后面是远程分支名,现在冒号前面什么也没有,看起来就像是在远程标签前面加了个冒号一样,因为你推送了空给这个标签所以git认为你想删除这个标签

递归拉取

$ git clone --recursive

拉取深度

一般仓库文件不大时,我们都可以用这个方法git clone仓库,但问题是有时候,在仓库历史的某次commit时,有人不小心提交了1G的文件,虽然后面的commit中他把这个文件删除了,但是在.git文件夹中仍然存储着这个文件,所以如果我们克隆仓库这个仓库,会把所有的历史协作记录都clone下来,这样整个文件会非常大,其实对于我们直接使用仓库,而不是参与仓库工作的人来说,只要把最近的一次commit给clone下来就好了。这就好比一个产品有很多个版本,我们只要clone最近的一个版本来使用就行了。实现这个功能就需要用到git clone --depth=1命令

$ git clone --depth 1 https://web.git

而如果我们想只克隆某个指定分支的最近一次commit,可以使用下面命令

$ git clone --depth 1 --branch dev https://web.git

上面提到的 git clone --depth=1 操作只会clone一个分支english,如果我们想把其他远程分支(如master)也克隆到本地,我们需要用下面的命令

$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

转换为完整克隆

git fetch --help
...
--unshallow
           Convert a shallow repository to a complete one, removing all the limitations imposed by shallow repositories.
           
#转换为完整克隆
git fetch --unshallow

你可能感兴趣的:(git)