来源参考:link
==侵删==
简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
概念:工作区、版本库(repository)、暂存区
如图1所示
- 工作区:即自己里看到的目录
- 版本库:即工作区中的隐藏目录.git,它是Git的版本库
- 暂存区:版本库中的stage,还有Git为我们创建的第一个分支master,以及指向master分区的指针HEAD
往Git版本库里添加文件过程,如上图:
第一步:用git add
把文件修改从工作区添加到暂存区。 如图2所示
使用git add readme.txt LICENSE
将工作区的这两个文件修改添加到暂存区(stage)
第二步:用git commit
把暂存区所有的内容提交到当前分支。
如图3所示
使用git commit
命令将暂存区所有的修改提交到版本库的master分支。
安装Git
Linux平台安装
Debian或ubuntu系统使用:
$sudo apt install git
源码安装:
从git官网下载源码
解压,依次输入下列命令
./config
make
sudo 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仓库通信
- 创建
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 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 checkout
切换分支
$ git checkout master
Switched 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 stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
- 从
master
分支上修复bug,就需要从master
分之上创建临时分支
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.
$ git checkout -b issue-101
Switched 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 -v
origin 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
参数