浅谈Git的使用

版权声明:转载请注明出处 https://blog.csdn.net/weixin_39918693/article/details/85794972

一、简介

分布式版本控制系统在每个用户的个人电脑上都有一个完整的版本库,不联网也可以正常使用(不能进行多人协作)。例如常用的Git

集中式版本控制系统具有一个中央版本库,必须联网才能正常使用(如果不联网的话,连基本的版本管理都做不到)。例如常用的SVN和CVS

Git较于其他版本控制系统不同的地方是其跟踪并管理的修改,而非文件

如何合理的建立版本库???????

Git版本库的创建和基本设置:

  • 1、使用git init来将一个目录变成Git可以管理的仓库
  • 2、使用git config --global user.name "your name"来配置该版本库的用户姓名
  • 3、使用git config --global user.email "email address"来配置该版本库用户的电子邮件地址

二、简单使用

在Git中有三个概念:工作区、版本库、暂存区

  • 工作区(Working Directory):就是Git将要管理的那个文件夹
  • 版本库(Repository):就是那个.git文件夹
  • 暂存区:版本库中的stage

将文件添加到Git版本库中,要分两步来执行:

  • 1、用git add filename把文件添加进去,实际上就是把文件修改添加到stage
  • 2、用git commit -m "注释"向分支提交更改,实际上是把stage中的所有内容提交到当前分支

每一次commit都有对应的commit id(版本号)

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

版本回退:Git的版本回退速度非常快,因为在Git内部有一个指向当前版本的HEAD指针,当你回退版本的时候,该指针就在不同版本号之间移动,同时把工作区的文件更新了。所有HEAD指向哪个版本号,这个版本就是当前版本

创建Git版本库的时候,Git自动创建了唯一一个master分支

git loggit reflog只是记录提交到分支上的操作,并不记录add操作和工作区中的修改操作


三、Git与GitHub

库与库对应;分支与分支对应

GitHub提供7*24小时的Git仓库托管服务,本地Git仓库和GitHub仓库之间的传输是通过SSH加密的(也可以使用https加密)

在本地创建一个Git仓库,同时也在GitHub上创建一个Git仓库,并且让这两个仓库进行远程同步。这样,GitHub上的仓库既可以作为备份,又可以让他人通过该仓库来协作

git remote add origin [email protected]:网址来形成关联(远程库的默认名称为origin

git remote rm 远程库名来删除与指定远程库的关联

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

第一次push会有SSH警告

git clone 网址将远程库克隆到本地


四、分支

分支管理的是commit(提交),不是add

  • 1、git checkout -b 分支名:创建并切换新分支
  • 2、git branch 分支名:创建新分支
  • 3、git checkout 分支名:切换新分支
  • 4、git branch:查看所有分支,当前分支会标*
  • 5、git merge 分支名:合并指定分支到当前分支
  • 6、git branch -d 分支名:删除指定分支

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成

手动解决冲突的时候,Git用<<<<<<<<<<、===========、>>>>>>>>>>标记出不同分支的内容

当两个分支都已经进行了修改,这时进行分支合并有可能会有冲突导致无法成功合并,这时需要去手动修改文件,修改完成后进行add和commit,这时就不用再次合并了(应该是自动完成的)

git log --graph --pretty=oneline --abbrev-commit来看到分支合并图

在合并分支时,Git有可能会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit。这样,从分支历史就可以看出分支信息了

git merge --no-ff -m "注释" 分支名来禁用Fast forward模式来进行合并

分支策略:master分支是非常稳定的,也就仅用来发布新版本,平时不能在上面干活。一般在dev分支上干活

需要在哪个分支上修复bug,就在哪个分支上新建临时分支;需要开发一个新的feature,最好在dev分支上新建一个新分支来进行开发

新的分支只是新建的一个新的提交,如果只是在新的分支上进行了工作区的修改和添加到stage中,那么这些修改会影响到master分支。如果修改后提交了,那么就不会影响到master分支了(除非进行了merge)

git remote -v查看远程库的信息

在push、pull和clone的时候,是如何指定分支之间的关联的?????

当我们从远程仓库clone时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程仓库的默认名称为origin

当从远程库clone时,默认情况下,只clone了master分支到本地(默认已形成关联)

git checkout -b 分支名 origin/分支名将指定的远程分支clone到本地(名字建议用相同的,应该会自动形成关联

push某分支上的所有本地commit到远程库,推送时要指定本地分支。这样,Git就会把该分支推送到远程库对应的远程分支上(第一次需要使用-u参数,这样会自动形成关联)

push失败时,解决方法是先用git pull把最新的提交抓下来,在本地合并,解决冲突后再推送

pull失败,原因是没有指定本地分支与远程分支的关系。用git branch --set-upstream 分支名 origin/分支名来建立分支间的关系

  • master分支是主分支,因此需要时刻与远程同步
  • dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步
  • bug分支只用于在本地修复bug,就没必要推送到远程了(合并到dev分支后,再推送)
  • feature分支是否推送到远程,取决于你是否和你的小伙伴合作在上面开发该功能

五、Git的标签

标签和commit id类似,只是比commit id更好记(有意义的名字),标签是一个指向某个commit的指针

标签可以用GPG来加密

  • 1、用git tag 标签名来打标签,默认在最新的commit上打标签
  • 2、用git tag 标签名 commit id来为历史提交打标签
  • 3、用git tag来查看标签
  • 4、用git show 标签名来查看标签信息
  • 5、用git tag -a 标签名 -m 标签说明来为所打标签添加说明文字
  • 6、用git tag -d 标签名来删除本地标签
  • 7、用git push origin 标签名来将本地标签推送到远程
  • 8、用git push origin --tags来将所有还没推送远程的标签推送到远程

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

如果要删除远程标签,要先删除本地标签,然后用git push origin : refs/tags/标签名来删除远程标签


六、Git的stash功能

储藏功能


七、常用命令

  • 1、git status:查看工作区的状态
  • 2、git diff filename:使用Unix通用的diff格式来比较工作区和分支上该文件的区别
  • 3、git log:查看历史记录,--pretty=oneline参数可以使得显示更加简洁
  • 4、git reflog:查看每一次历史命令
  • 5、git reset --hard 版本号:进行版本回退
  • 6、git reset HEAD filename:把stage中的修该撤销掉(都是针对某个文件的)
  • 7、git checkout -- filename:把工作区中的修改撤销掉(都是针对某一个文件的),文件回到最近一次git commit或git add时的状态
  • 8、git checkout filename:切换到另一个分支
  • 9、git statue
  • 10、git rm filename:删除文件
  • 11、.gitignore文件的书写
  • 12、git config --global alias.别名 原名来设置命令别名

疑问

配置Git的时候,加上--global参数是针对当前用户起作用的(该用户在这台电脑的所有Git仓库中都有效);如果不加,那只针对当前的仓库起作用

每个仓库的配置文件是.git/config

每个用户的git配置文件是~/.gitconfig

除了可以在命令行中设置git命令别名,也可以直接在以上两个配置文件中设置;如果设置错误,可以删掉文件重新通过命令配置

通过git rm filename删除的文件,而且用git commit提交了,这样还能版本回退吗?????这个过程中需要git add吗??????

猜你喜欢

转载自blog.csdn.net/weixin_39918693/article/details/85794972