Git简介
一、git的安装
1、在Linux上安装Git
sudo apt-get install git
2、在Windows上安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
二、创建版本库
1、创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
2、通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
瞬间Git就把仓库建好了,而且它是一个空的库,在目录下多了一个隐藏文件.git
三、把文件添加到版本库
1、编写一个readme.txt文件,内容如下:
Git is a version control system.
Git is free software.
一定要放到learngit目录下(子目录也行)
2、第一步,用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt
3、第二步,用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
时光机穿梭
一、查看各种记录
1、git status
命令可以让我们时刻掌握仓库当前的状态
2、如果git status
告诉你有文件被修改过,用git diff
可以查看修改内容。例:
(补:git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别)
3、如果你想查看提交日志(commit)记录,可以使用指令git log
我们commit
了三次
版本1:wrote a readme file
Git is a version control system.
Git is free software.
版本2:add distributed
Git is a distributed version control system.
Git is free software.
版本3:append GPL
Git is a distributed version control system.
Git is free software distributed under the GPL.
使用git log
后
N402@DESKTOP-50UOCK1 MINGW64 /d/learnGit (master)
$ git log
commit 6806ab031df35cc557adc5ca95a82b256e3faac9 (HEAD -> master)
Author: Qingwen <1164874754@qq.com>
Date: Sat Nov 23 10:38:09 2019 +0800
append GPL
commit 71b42cdf87384e30dc43aa8d545db3a27f84e09d
Author: Qingwen <1164874754@qq.com>
Date: Sat Nov 23 10:25:24 2019 +0800
add distributed
commit f4ad0e97cd8c6e50bad3cf815ea3821fb0d71c7c
Author: Qingwen <1164874754@qq.com>
Date: Sat Nov 23 10:10:53 2019 +0800
Wrote a readme file
二、版本回退
Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ ,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
1、HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。
2、穿梭前,用git log
可以查看提交历史
,以便确定要回退到哪个版本。
3、要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。
(在git log
指令出现版本历史后可以按ENTER
键查看所有原来的版本)
例:
N402@DESKTOP-50UOCK1 MINGW64 /d/learnGit (master)
$ git log
commit 6806ab031df35cc557adc5ca95a82b256e3faac9 (HEAD -> master)
Author: Qingwen <1164874754@qq.com>
Date: Sat Nov 23 10:38:09 2019 +0800
append GPL
commit 71b42cdf87384e30dc43aa8d545db3a27f84e09d
Author: Qingwen <1164874754@qq.com>
Date: Sat Nov 23 10:25:24 2019 +0800
add distributed
commit f4ad0e97cd8c6e50bad3cf815ea3821fb0d71c7c
Author: Qingwen <1164874754@qq.com>
Date: Sat Nov 23 10:10:53 2019 +0800
Wrote a readme file
N402@DESKTOP-50UOCK1 MINGW64 /d/learnGit (master)
$ git reset --hard HEAD^
HEAD is now at 71b42cd add distributed
N402@DESKTOP-50UOCK1 MINGW64 /d/learnGit (master)
$ git reset --hard 6806ab
HEAD is now at 6806ab0 append GPL
N402@DESKTOP-50UOCK1 MINGW64 /d/learnGit (master)
$ git reflog
6806ab0 (HEAD -> master) HEAD@{0}: reset: moving to 6806ab
71b42cd HEAD@{1}: reset: moving to HEAD^
6806ab0 (HEAD -> master) HEAD@{2}: reset: moving to HEAD
6806ab0 (HEAD -> master) HEAD@{3}: commit: append GPL
71b42cd HEAD@{4}: commit: add distributed
f4ad0e9 HEAD@{5}: commit (initial): Wrote a readme file
三、工作区和暂存区
1、工作区(Working Directory)
就是你在电脑里能看到的目录
2、版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
3、我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支(master)。
四、撤销修改
1、场景1:当你改乱了工作区
某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
2、场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时
,想丢弃修改,分两步,第一步
用命令git reset HEAD <file>
,就回到了场景1,第二步
按场景1
操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,git reset --hard HEAD^
,不过前提是没有推送到远程库。
五、删除文件
如果你在工作区中用rm
删除了某个文件,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了。
此时有两种选择:
1)确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
,然后文件就从版本库中被删除了
2)另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本
git checkout -- test.txt
远程仓库
一、创建github账户并与git ssh远程
第1步:
创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
第2步:
登陆GitHub
,打开“Settings”:
点击"SSH and GPG keys" --> “New SSH key” --> 填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容 --> 点“Add Key”,你就应该看到已经添加的Key
二、添加远程库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
1、首先,登陆GitHub,然后,在右上角找到“new repository
”按钮,创建一个新的仓库;
2、在Repository name填入learnGit(仓库名字,一般与本地git仓库同名)
,其他保持默认设置,点击“Create repository
”按钮,就成功地创建了一个新的Git仓库;
目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
3、我们根据GitHub的提示,在本地的learnGit
(本机下的git仓库)仓库下运行命令:
$ git remote add origin https://github.com/yang-9520/learnGit.git
注意:把上面的yang-9520替换成你自己的GitHub账户名
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
4、下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u
参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
注意:
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub
三、从远程库克隆
1、克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆:
git clone git@github.com:Yang-9520/gitskills.git
注意:将地址改为相应的仓库地址
然后进入gitskills目录看看,已经有README.md文件了:
$ cd gitskills
$ ls
README.md
注意:如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。
你也许还注意到,GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git
这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
分支管理
一、创建并合并分支
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无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph
命令可以看到分支合并图。
三、分支管理策略
1、合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
例:
$ git merge --no-ff -m "merge with no-ff" dev
2、分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
四、bug分支
1、软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git add new.txt
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
$ git checkout master
$ git checkout -b issue-101
修复完成后,切换到master分支,并完成合并,最后删除issue-101分支。
2、接着回到dev分支干活了:
$ git checkout dev
Switched to branch ‘dev’
$ git status
On branch dev
nothing to commit, working tree clean
工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:
$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
$ git stash pop
再用git stash list查看,就看不到任何stash内容了:
$ git stash list
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
学习的链接:https://www.liaoxuefeng.com/