原文廖老师的Git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
一、Git的安装
1.在Windows上安装Git
从https://git-scm.com/downloads下载,然后按默认选项安装即可。
2.安装完后的简单设置
安装完成后,还需要最后一步设置,在命令⾏输⼊:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
二、创建版本库
版本库(repository)又名仓库,可以简单理解成一个目录,这个目录面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
首先在一个合适的位置创建一个空目录:$ mkdir GitRepository
进入该目录后,执行命令:$ git init
三、版本的回退与切换
1、添加文件到Git仓库
第一步添加:git add readme.txt
第二步提交:git commit –m “wrote a readme file”
注:首先需要在git仓库目录下新建一个readme.txt文件;
执行第一步后,没有消息显示说明添加成功,使用add可以一次提交多个文件;
-m后面的参数是对本次提交的说明;
$ git status可以命令查看当前Git仓库状态,有哪些文件需要add和commit;
$ git diff 可以查看修改过的内容;
2、版本回退
应用场景:文件丢失的情况下,从最近的一次commit中恢复文件。
$ git log 以倒序的方式查看提交日志;
$ git reset --hard HEAD^ 回退到当前版本的上一个版本;
$ git reset --hard “commitID”回退到具体哪次提交,commitID代表具体commit的版本号;
$ git reflog 查看每一次命令,第一列显示有commit版本号
3、工作区和版本库
工作区:我们看到的目录,刚刚我们创建的GitRepository文件夹;
版本库:我们执行git init后在生成的隐藏的.git文件夹;
暂存区:.git目录下有一个stage或index目录即为暂存区;
4、管理修改
Git跟踪并管理的是修改,而非文件。未add到暂存区的修改是不能够提交到版本库的;
$ git diff HEAD -- readme.txt 查看工作区和版本库里最新版本的区别
5、撤销修改
应用场景:把修改错误的文件add到了暂存区,但还未commit到版本库,想撤回本次add。
(1)$ git reset HEAD readme.txt
把暂存区的修改撤销掉,重新放回到工作区。
(2)$ git checkout -- readme.txt
丢弃工作区的修改,让该文件回退到最近一次的git add或git commit时的状态这里有两种情况:
一种是readme.txt修改后还没有add到暂存区,命令执行后回到和版本库一样的状态。
二种是readme.txt已经添加到暂存区,之后又做了修改,命令执行后,文件恢复为添加到暂存区的状态。
6、删除文件
(1)应用场景:确定要从版本库中删除某个文件
第一步:$ git rm readme.txt
第二步:$ git commit –m “delete readme.txt”
(2)应用场景:工作区误删某文件,可以从版本库中恢复
$ git checkout – readme.txt
四、远程仓库
1、添加公钥到github
首先注册GitHub账号并登录,然后将自己的公钥添加到GitHub上。公钥即电脑用户名目录下的.ssh目录下id_rsa.pub文件里的内容。如果没有该目录,需要我们手动生成:
$ ssh-keygen -t rsa -C "huozhifa@qq.com"
然后在github里点击account setting --> SSH Keys à Add SSH Key --> title随意写,将密钥粘贴进去。
2、添加远程仓库
第1步:在GitHub上创建一个远程库:右上角“+” --> “New repositories ”;
第2步:将本地库与远程库关联:
$ git remote add origin git@github.com:你的用户名/learngit.git
注:远程库的名字就是origin,这是Git默认的叫法,也可以改成别的。
第3步:将本地内容推送到远程库:
$ git push -u origin master
注:用 git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了 -u参数,Git不但会把本地的master分支内容推送的远程master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
3、从远程库克隆
执行命令:$ git clone git@github.com:你的用户名/gitskills.git
注:Git支持多种协议,还可以用 https://github.com/huozf/gitskills.git这样的地址。默认的git://使用ssh,但也可以使用https等其他协议。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
五、分支管理
1、创建与合并分支
Git都把它们串成一条时间线,这条时间线就是一个分支。截⽌止到目前,只有一条时间线,在Git里,这个分支叫主分支,即 master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
(1) 创建并切换分支:$ git checkout –b dev
当我们创建新的分支dev时,Git新建了一个指针叫dev,令dev指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
注:“-b”参数表示创建并切换分支,相当于命令(2)、(3)之和。
(2) 创建分支:$ git branch dev
(3) 切换分支:$ git checkout dev
(4) 查看当前分支: $ git branch
注:该命令会列出所有分支,前边标有 * 的表示当前所在分支。
(5) 合并指定分支到当前分支:$ git merge master
(6) 删除分支: $ git branch –d dev
2、解决冲突
当我们新建一个分支后,master分支新建分支各自都分别有新的提交,这种情况下,Git⽆无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突
这时候需要我们手动解决冲突,然后才能合并。合并后,查看分支合并图:
$ git log --graph --pretty=oneline --abbrev-commit
3、分支管理策略
通常,合并分支时,如果可能,Git会用“Fast forward”模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用“Fast forward”模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
例如,新建并切换一个分支dev,修改文件并提交。然后切换回master分支,将dev分支合并到master分支:
$ git merge --no-ff -m "merge with no-ff" dev
注:“—no-ff”表示禁用“Fast forword”模式。
此时,分支合并图变成:
4、Bug分支
支上合并就可以了。所以,团队合作的分支看起来就像这样:
应用场景:当前工作还未完成且不能够提交,但上级要求立即修复项目中出现的bug,需要我们停下手头的工作。
(1)$ git stash 将“工作现场”储存起来;
(2)$ git stash list 列出所有已储存的“工作现场”;
(3)$ git stash pop 恢复“工作现场”,且将stash里的最上一层内容删除,等同于(4)、(5)命令之和;
(4)$ git stash apply 恢复“工作现场”,但stash里的内容并未删除;
(5)$ git stash drop 删除最上一层“工作现场”;
(6) $ git stash apply stash@{0} 恢复指定的stash内容;
5、多人协作
(1) $ git remote 查看远程库信息;
(2) $ git remote –v 显示远程库更详细信息;
(3) $ git push origin branch_name 推送到远程库的指定分支
(4) $ git pull 从远程库拉取更新
(5) git branch --set-upstream dev origin/<branch> 将本地库的分支与远程库指定分支关联起来
注:多人协作的工作模式
1. 首先,可以试图用 git push origin branch-name推送⾃自己的修改;
2. 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull试图合并;
3. 如果合并有冲突,则解决冲突,并在本地提交;
4. 没有冲突或者解决掉冲突后,再用$ git push origin branch-name推送就能成功!
5. 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
六、标签管理
1、创建标签
(1) $ git tag v1.0 默认给最近以此提交创建标签
(2) $ git tag v0.9 66756 给指定的提交创建标签,66756为提交id
(3) $ git tag -a v0.1 -m "version 0.1 released" 3628164 给指定的提交创建标签,-a 指定标签名,-m指定标签信息
(4) $ git tag 列出所有标签
(5) $ git show v0.1 查看指定标签的具体信息
2、操作标签
(1) $ git tag -d v0.1 删除指定标签
(2) $ git push origin v1.0 推送某个标签到远程
(3) $ git push origin --tags 一次性推送全部尚未推送到远程的本地标签
(4) 如果标签已经推送到远程,要删除远程标签:
① 先从本地库删除:$ git tag -d v0.9
② 再从远程库删除:$ git push origin :refs/tags/v0.9