Git使用

来源:互联网 发布:java爬虫可以做什么 编辑:程序博客网 时间:2024/06/05 12:04

来源参考:link
==侵删==

简介

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

概念:工作区、版本库(repository)、暂存区
如图1所示
image
- 工作区:即自己里看到的目录
- 版本库:即工作区中的隐藏目录.git,它是Git的版本库
- 暂存区:版本库中的stage,还有Git为我们创建的第一个分支master,以及指向master分区的指针HEAD

往Git版本库里添加文件过程,如上图:
第一步:用git add把文件修改从工作区添加到暂存区。 如图2所示
image
使用git add readme.txt LICENSE将工作区的这两个文件修改添加到暂存区(stage)

第二步:用git commit把暂存区所有的内容提交到当前分支。
如图3所示
image
使用git commit命令将暂存区所有的修改提交到版本库的master分支。

安装Git

Linux平台安装

Debian或ubuntu系统使用:
$sudo apt install git

源码安装:

从git官网下载源码解压,依次输入下列命令./configmakesudo make install

Windows

直接下载安装程序

安装后设置

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

$ git config --global user.name "xxxx"$ git config --global user.email "email.example.com"

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

创建版本库

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

创建一个空目录 learngit:

$ mkdir learngit

通过git init命令将这个目录变成Git可以管理的仓库

$ git init

把文件添加到版本库

Tip:windows使用notepad++ 的UTF-8 without BOM

  • 使用git add,把文件readme.txt添加到仓库:
git add readme.txt
  • 使用git commit,把readme.txt提交到仓库:
git commit -m "wrote a readme file"

版本操作

  • git status查看仓库当前状态:
$ git status
  • git diff查看修改内容:
$ git diff
  • git log查看提交历史,使用git log --graph可以查看分支合并图
$ git log --pretty=online
  • git reset 版本回退,或把暂存区的修改回退到工作区
//根据commit_id(可以不写全)回退到任意版本$ git reset --hard commit_id//回退到上一个版本,HEAD表示最新版本$ git reset --hard HEAD^  
//把暂存区的修改回退到工作区$git reset HEAD file
  • git checkout --撤销(清空暂存区)修改,(如果没有–,则就变成了切换分支),区别git reset HEAD的回退操作
// git checkout --  readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况://一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态(回退到最近一次git add);//一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。(回到最近一次的git commit)// git checkout -- file,也可以用作还原,即当删除工作区的file后,暂//存区file还存在,可以通过git checkout -- file恢复工作区的file,git //checkout其实是用版本库里的版本替换工作区的版本//,无论工作区是修改还是删除,都可以一键还原。$ git checkout -- readme.txt
  • git rm file 删除文件

远程仓库

设置本地仓库和github仓库通信

  1. 创建SSH KEY
$ ssh-keygen -t rsa -C "youremail@example.com"

完成后会在主目录下找到.ssh目录,里面有id_rsa(私钥)和id_rsa.pub(公钥)两个文件。
2. 登录Github,打开”Account seeting”,在”SSH KEYS”页面将第一步生成的id_rsa.pub内容添加进去

添加远程库

即将本地的仓库与远端的仓库进行关联同步

$ git remote add origin git@github.com:xxxx/yyy.git

其中,xxxx为自己的GitHub账户名,yyy为仓库名
origin为远程库的名

$ git push -u origin master

使用git push将本地库的所有内容推送到远程库上,实际上是把当前分支master推送到远程。将本地的master和远端的master关联起来
如果远程库是空的,第一次推送时需家-u参数,

从远程克隆

$ git clone https://XXXXXXXXXXXXXX.git

分支管理

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支

创建与合并分支

  • 创建dev分支,然后切换到dev分支:
$ git checkout -b devSwitched to a new branch 'dev'

git checkout命令加上-b参数,表示创建并切换,相当于以下两条命令:

$ git branch dev$ git checkout devSwitched to branch 'dev'
  • 查看分支git branch,它会列出所有分支。
$ git branch* dev  master

当前分支前会有一个*

  • 使用git checkout切换分支
$ git checkout masterSwitched to branch 'master'

-合并dev分支的工作到master分支上(当前在master分支上):

$ git merge dev

git merge用于合并指定分支到当前分支。

-删除dev分支

git branch -d dev

解决冲突

冲突原因:主分支和其它分支都进行了提交后进行合并,而提交后主分支和其它分支有相同的文件名称而内容却不相同,再进行合并分支时引发冲突。

解决冲突的方法:修改主分支和其它分支同名文件的内容相同。再进行合并分支

分支管理

分支合并模式:
- Fast forward模式(默认),但这种模式下,删除分支后,会丢掉分支信息。
- --no-ff模式(普通模式),禁止Fast forward模式。Git就会在merge时生成一个新的commit,合并后的历史有分支,能看出来曾经做过合并。

$ git merge --no-ff -m "merge with no-ff" dev

bug分支

  • stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$ git stashSaved working directory and index state WIP on dev: 6224937 add mergeHEAD is now at 6224937 add merge
  • master分支上修复bug,就需要从master分之上创建临时分支
$ git checkout masterSwitched to branch 'master'Your branch is ahead of 'origin/master' by 6 commits.$ git checkout -b issue-101Switched to a new branch 'issue-101'

修改完成后切换回master分支进行合并issue-101分支,再删除临时分支。

$ git checkout master$ git merge --no-ff -m "merged bug fix 101" issue-101$ git branch -d issue-101

多人协作

  • git remote查看远程库的信息,-v参数可以显示更详细信息
$ git remote -vorigin  git@github.com:michaelliao/learngit.git (fetch)origin  git@github.com:michaelliao/learngit.git (push)

上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

  • 推送分支:
    推送master分支
$ git push origin master

推送dev分支:

$ git push origin dev

问题

Q1:提交失败,显示冲突
多次提交造成冲突,可用git reset进行版本回退,或用git commit --amend参数