Git基础命令操作

什么是Git?

Git是一个分布式版本控制系统。

Git 与 SVN 的区别:

  • Git 是分布式的,SVN 是集中式的:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。

  • Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。

  • Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。

  • Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。

  • Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

在这里插入图片描述

Git 安装

从Git官网 https://git-scm.com/downloads 直接下载安装程序,然后按默认选项安装即可。(安装步骤可参考此链接 https://www.jianshu.com/p/414ccd423efc

Git 创建仓库

首先,选择一个路径创建一个空目录(我是在d:/GIT目录下创建的):

$ mkdir learngit
$ cd learngit
$ pwd 
/d/GIT/learngit

pwd命令用于显示当前目录。

其次,通过git init命令来初始化一个 Git 仓库。

$ git init
Initialized empty Git repository in D:/GIT/learngit/.git/

在执行完成 git init 命令后,D:/GIT/learngit里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪。
Git 仓库会生成一个 .git 目录,这个目录是Git来跟踪管理版本库的,该目录包含了资源的所有元数据,其他的项目目录保持不变。如果你没有看到 .git 目录,是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

最后,将文件添加到Git仓库:

git add <file> - - 跟踪文件。注意:可跟踪多个文件;
git commit -m <message>- - 提交文件。注意:-m 后输入的是本次提交的说明,例如你都做了哪些修改。

Git 版本回退

git log --查看提交的历史记录。
git log --pretty=oneline

你将会看到类似e475afc93c209a690c39c13a46716e8fa000c366的字符串,这个就是commit id(版本号),这个版本号是由SHA1计算出来的一个非常大的数字,用十六进制表示,为了防止多人在同一版本库里工作发生冲突。

在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^…往上10个版本可以写成HEAD~10。

如果要把当前版本回退到上一个版本,就可以使用git reset命令:

$ git reset --hard HEAD^

还可以指定回到某个版本,使用命令:

$ git reset --hard <版本号>

注意:版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,这样会无法确定是哪一个版本。

怎么找到commit id(版本号)呢?可以使用命令git reflog(记录了我们的每一次命令)

总结:

HEAD指向的版本就是当前版本,可以用git log命令查看提交历史,以便确定要回退到哪个版本;用git reflog命令查看命令历史,以便确定要回到未来的哪个版本。

Git 工作区、暂存区和版本库

  • 工作区(workspace):就是你在电脑里能看到的目录。
  • 暂存区(staging area):Git的版本库里存了很多东西,其中最重要的就是称为stage(或index)的暂存区,一般存放在 .git 目录下的 index 文件(.git/index)中;还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
  • 版本库(local repository):工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

在这里插入图片描述

实际上,git add命令是把文件修改添加到暂存区;git commit命令就是把暂存区的所有内容提交到当前分支。因为在我们创建Git版本库时,Git就自动为我们创建了唯一 一个master分支,所以commit就是往master分支上提交更改。

Git 撤销修改

在没有执行git add命令(暂存)之前,我们可以通过以下命令查看本地修改:

$ git diff
在未暂存前,撤销本地修改:

如果我们不想要这些本地已修改的代码(比如一些临时的测试代码),可以通过以下命令撤销本地修改:

$ git checkout -- <file>

以上命令是把文件在工作区的修改全部撤销,这里有两种情况:

一是文件自修改后还没有被放到暂存区,现在撤销修改就回到和版本库一模一样的状态;二是文件已经添加到暂存区后,又作了修改,现在撤销修改就回到添加到暂存区后的状态。

总之,此命令就是让这个文件回到最近一次git commitgit add时的状态。

注意:git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。

在暂存后,撤销暂存区的修改:

想要查看暂存区的修改,可以执行以下命令:

$ git diff --staged
$ git reset HEAD <file>

git reset HEAD <file>命令可以把添加到暂存区的修改撤销掉(unstage),重新放回工作区。

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。

总结:

  • 当想丢弃工作区的修改时,用命令git checkout -- file
  • 当想丢弃工作区的修改,但此时该文件已经添加到了暂存区,还没有提交时,首先用git reset HEAD <file>,再用命令git checkout -- file
  • 当提交了错误的修改到版本库,但还未推送到远程库时,想要撤销本次提交,可进行版本回退。

Git 创建与合并分支

  • 查看分支: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>

注意:

  • git branch命令会列出所有分支,当前分支前面会标一个*号。
  • Git的switch命令是2.23版本发布的新命令,因此旧版本无法使用,所以使用前需查看自己的版本,如果为旧版本,需升级到最新版本才能使用。
  • 合并分支时,一般Git会用Fast forward模式,但这种模式删除分支后,会丢掉分支信息;想要禁用Fast forward模式,可用以下命令:
    git merge --no-ff -m "merge with no-ff" dev
    这种合并会创建一个新的commit,再用git log查看提交历史时,历史有分支信息,能看出来曾经做过合并。
  • 查看自己的git版本:git --version
  • 将当前版本Git升级为最新版本,如果Git是2.17.1之前的版本,使用命令:git update ;是2.17.1之后的版本,使用命令:git update-git-for-windows

总结:

  • 查看远程库信息,使用git remote -v
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突(手动解决冲突后再提交),再提交,再push。

Git 命令速查

在这里插入图片描述

应用场景

bug分支

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成,先把工作现场 git stash 一下,然后去修复bug,修复后,再git stash pop,回到工作现场;在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

具体事例可以参考廖老师的网站:
https://www.liaoxuefeng.com/wiki/896043488029600/900388704535136

多人协作:git的冲突解决

远程master分支有一个a.js文件,开发者A先对文件作了修改,并成功提交到远程仓库;开发者B在本地代码并没有和远程master分支的代码同步的情况下,对本地的a.js文件进行了修改,修改后push提交失败,提示发生冲突。

  1. git push origin <branch-name>推送自己的修改;

  2. 如果推送失败,因为远程分支比本地的更新,所以需要先用git pull进行分支合并;

一般在开发过程中建议使用git pull --rebase拉取代码,与远程代码同步,在其同步过程中会检查冲突。


git pull == git fetch + git merge
git pull --rebase == git fetch + git rebase

  1. 如果合并有冲突,则解决冲突,并在本地提交;

git rebase --abort
执行之后,本地内容会回到以前提交,但没有pull时的状态,简单来说就是撤销rebase,放弃合并,回到rebase操作之前的状态,之前的提交不会丢弃
git rebase --skip
引起冲突的commits会被丢弃,即开发者B对同一文件的commit无效,开发者A自己修改的部分全部无效,因此在使用skip时请慎重,会将引起冲突的commits丢弃掉(慎用!)
git rebase --continue
本地产生冲突,手动解决冲突之后,先用"git add"命令去更新这些内容的索引,然后执行此命令就可以线性的连接本地分支与远程分支,无误之后就回退到主分支上。一般情况下,修改后检查没问题,使用rebase continue来合并冲突

  1. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>就能成功推送。

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream-to <branch-name> origin/<branch-name>

参考资料:廖雪峰老师的Git教程


更改本地关联的远程版本库

  • 查看远程版本库信息: git remote -v
  • 删除添加的远程地址:git remote rm origin
  • 添加远程版本库:git remote add origin ssh://xxx

当不想提交更改,但又想拉取代码

  • git stash
  • git pull --rebase origin master
  • git stash pop

打tag(标签)

  • 列出已有的标签:git tag
  • 按照一个匹配标签名的通配模式列出标签:git tag -l "v1.0.5*"
  • 创建附注标签:git tag -a v1.0 -m "my version 1.0"
  • 对指定的提交打标签::git tag -a v1.1 9fceb02
  • 查看标签信息和与之对应的提交信息:git show v1.0
  • 推送标签到远程仓库:git push origin v1.0 / git push origin --tags
  • 删除本地仓库的标签:git tag -d v1.1
  • 从远程仓库中移除这个标签:git push origin :refs/tags/v1.1 / git push origin --delete v1.1

Git生成秘钥或公钥SSH KEY

1.查看本地SSH KEY

SSH KEY默认储存在账户的主目录下的 ~/.ssh 目录,如:C:\Users\Administrator\.ssh
在这里插入图片描述
查看该目录下是否包含id_rsa(私钥)id_rsa.pub(公钥)文件。如果没有,则生成。

2.生成SSH KEY

  • .ssh目录下打开Git Bash(.ssh目录不存在,手动创建)-
  • 执行生成公钥和私钥的命令: ssh-keygen -t rsa ,并按3次回车(按回车是因为会提示是否需要设置密码,如果设置了每次使用Git都会用到密码,一般都是直接不写为空,直接回车)。
    在这里插入图片描述
  • 最后会在一个文件夹里面生成两个文件id_rsa(私钥)id_rsa.pub(公钥)
    在这里插入图片描述

3.查看SSH KEY

cat id_rsa.pub
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值